Compare commits

...

21 Commits

Author SHA1 Message Date
1beba26249 🗑️ Remove unused and archived files across multiple directories and update project dependencies in package files 2026-01-28 02:54:35 +00:00
79d52f5d92 🗂️ Update workspace configuration and remove obsolete files related to "Las Vegas" and "thedomdomdomdom" 2026-01-27 03:48:14 +00:00
9a0e324bd7 ✏️ Rename and update references for "Next Steps After A Store Is Sanctioned" to "Getting a Store Sanctioned" and add a step to the guide 2026-01-27 03:38:51 +00:00
e0c78474e1 📝 Add initial steps for organizing sanctioned store Play! sessions 2026-01-26 23:57:14 +00:00
ab5efd049e 🗑️ Remove obsolete workspace configuration files and update content for "Getting a Store Sanctioned" guide with additional details and images 2026-01-26 23:56:47 +00:00
2cf5db71d2 🗂️ Organize and update project files, documentation, and plugin configurations for the Pokémon Professor project 2026-01-26 23:28:49 +00:00
921142ee47 📝 Fix table formatting in Synology server used ports documentation 2026-01-26 22:47:26 +00:00
15e814b566 📝 Update workspace configuration to focus on "Used Ports Synology Server" markdown file and adjust related settings 2026-01-26 22:47:16 +00:00
f7a7acf7f8 📝 Fix table formatting in Synology server used ports documentation 2026-01-26 22:46:35 +00:00
b20e2185b2 📝 Update and organize project documentation and assets 2026-01-26 22:46:14 +00:00
4194dcfeff 📝 Improve README formatting and fix table alignment issues 2026-01-26 22:35:29 +00:00
3004446a29 📚 Update README with enhanced Obsidian-specific documentation, commands, and features 2026-01-26 22:35:24 +00:00
d6f71c0023 📝 Improve formatting, add spacing, and enhance clarity in Obsidian guide documentation 2026-01-26 22:35:14 +00:00
ad55992be3 📝 Add documentation guide for Obsidian usage 2026-01-26 22:35:09 +00:00
eed82cd918 📝 Update documentation to include Obsidian MD extension details and its features 2026-01-26 22:34:26 +00:00
defbb13741 ✏️ Fix missing newline at end of file in extensions.json 2026-01-26 22:34:21 +00:00
faef0a377d 📝 Replace Foam configuration with Obsidian MD settings and update recommended extensions 2026-01-26 22:34:16 +00:00
3dd14bb9c0 Standardize string quotes to single quotes and improve code readability 2026-01-26 22:22:27 +00:00
3f665c293e 🧹 Remove unnecessary blank lines in VS Code settings file 2026-01-26 22:22:16 +00:00
aec09d48c3 ✏️ Fix typo in Box Stadium documentation description 2026-01-26 22:21:46 +00:00
853e6dc582 ✏️ Fix formatting in Box Stadium documentation section 2026-01-26 22:21:30 +00:00
1731 changed files with 726828 additions and 232 deletions

View File

@@ -2,22 +2,43 @@
## Project Overview
This is a hybrid workspace combining:
Hybrid workspace combining Obsidian-style knowledge management with code development. Uses Obsidian MD for VSCode extension (wiki-links, backlinks, graph view) alongside JavaScript/Python development tools.
- **Documentation**: Obsidian-style knowledge management with wiki-links and backlinks
- **Code Development**: Bookmarklets, scratchpad code, and project prototypes
**Architecture**: Documentation lives in `/docs`, code in `/code`. GitDoc auto-commits on save (1s delay), auto-pushes after commit.
## Documentation Guidelines
**Dual Obsidian Vaults**: Both `/docs/projects/memorypalace/` and `/docs/projects/pokemon-professor/` are independent Obsidian vaults edited in both native Obsidian and VS Code. These contain rich project-specific knowledge that can inform code implementations and provide context for related development work.
### Writing Style
## Critical Workflows
- Use clear, concise markdown
- Employ wiki-style `[[links]]` for connecting notes
- Include frontmatter metadata in notes (date, type, tags)
- Keep daily notes in `/docs/daily/` with format `daily-YYYY-MM-DD.md`
- Place evergreen concept notes in `/docs/concepts/`
### Bookmarklet Development
### Note Structure
**Never use CommonJS or require()** - this project uses ES modules exclusively.
1. Write bookmarklets as **regular, readable JavaScript** in `/code/bookmarklets/`
2. Include JSDoc comments (they're stripped during generation)
3. Run: `npm run bookmarklet -- code/bookmarklets/your-file.js`
4. Generator ([code/utils/bookmarkletMaker.js](../code/utils/bookmarkletMaker.js)) handles:
- Comment removal (single/multi-line)
- Code minification
- IIFE wrapping: `javascript:(function(){...})();`
- Clipboard copying
Example bookmarklet structure:
```javascript
/**
* My Bookmarklet - Description
*/
const elements = document.querySelectorAll('a');
elements.forEach(el => {
el.style.backgroundColor = 'yellow';
});
alert(`Found ${elements.length} links!`);
```
### Documentation Workflow
Notes use Obsidian frontmatter and wiki-linking:
```markdown
---
@@ -27,162 +48,92 @@ tags: []
---
# Title
## Overview
Brief summary
## Content
Main content with [[links]]
## Related
- [[other-note]]
Content with [[wiki-links]]
```
## Code Development Guidelines
**File locations by type**:
- Quick captures → `/docs/fleeting/`
- Refined concepts → `/docs/concepts/`
- Project docs → `/docs/projects/`
- Daily notes → `/docs/daily/` (format: `daily-YYYY-MM-DD.md`)
### Bookmarklets (`/code/bookmarklets/`)
### Module System (CRITICAL)
- Write as regular Node.js-compatible JavaScript files
- Use modern ES6+ syntax, let/const, etc. (will be minified)
- Include JSDoc comments for documentation (removed in final bookmarklet)
- Write clear, readable code - the generator handles minification
- Use descriptive variable and function names
- Test logic in Node.js if possible before converting
**ES modules only** - `package.json` has `"type": "module"`:
**Conversion Process:**
```javascript
// ✅ Correct
import fs from 'fs';
import { fileURLToPath } from 'url';
export default myFunction;
export { helperFunction };
1. Write bookmarklet as normal `.js` file in `/code/bookmarklets/`
2. Run: `npm run bookmarklet -- code/bookmarklets/your-file.js`
3. Generator automatically:
- Removes all comments
- Minifies code
- Wraps in IIFE: `javascript:(function(){...})();`
- Copies to clipboard
4. Paste into browser bookmark URL field
// ❌ Never use
const fs = require('fs');
module.exports = myFunction;
```
### Scratchpad Code (`/code/scratchpad/`)
## Project-Specific Conventions
- This is experimental space - be creative
- Add `TODO:` comments for work in progress
- Use descriptive variable names
- Include usage examples
- Python: Follow PEP 8 style
- JavaScript/TypeScript: Use modern ES6+ syntax
### File Naming
- Markdown: `kebab-case.md`
- JavaScript: `kebab-case.js`
- Python: `snake_case.py`
- Templates in `/code/templates/` show module patterns
### Code Style
### Git Commits
GitDoc auto-commits, but for manual commits use conventional format:
- `docs:` - Documentation changes
- `feat:` - New features
- `fix:` - Bug fixes
- `refactor:` - Code restructuring
- `chore:` - Maintenance
- **Python**: PEP 8, type hints preferred
- **JavaScript**: Modern ES6+, const/let over var, **ES modules (import/export)**
- **TypeScript**: Explicit types, interfaces over types
- Comments: Explain _why_, not _what_
- Functions: Single responsibility, descriptive names
### Code Organization
- `/code/bookmarklets/` - Browser utilities (final destination)
- `/code/scratchpad/` - Experiments, organized by language
- `/code/junk-drawer/` - WIP items, miscellaneous scripts
- `/code/templates/` - Reusable patterns (ES module examples)
- `/code/utils/` - Build tools (bookmarklet generator, README updater)
### Module System
### README Synchronization
**Update READMEs when changing structure** - multiple READMEs mirror folder organization:
- `/README.md` - Main overview
- `/docs/README.md` - Documentation guide
- `/code/README.md` - Code overview
- `/code/bookmarklets/README.md` - Bookmarklet guide
**This project uses ES modules (import/export), not CommonJS (require).**
## Extensions & Tools Context
- Use `import` for dependencies: `import fs from 'fs';`
- Use `export` for exporting: `export default myFunction;` or `export { myFunction };`
- Package.json is configured with `"type": "module"`
- Use `.js` extension for ES modules
- For Node.js built-ins requiring special handling: `import { fileURLToPath } from 'url';`
Workspace configured for:
- Obsidian MD for VSCode - wiki-links, graph view, daily notes
- Code Runner - Execute Python/JS/TS directly (`runInTerminal: true`)
- Todo Tree - Tracks TODO, FIXME, NOTE, IDEA, HACK, QUESTION tags
- GitDoc - Auto-commit delay 1000ms, pulls on open
- Settings in `.vscode/settings.json` override defaults
## File Organization
## Key Implementation Details
### When to Create Files
### Auto-Save & GitDoc
Files auto-save after 1s (`files.autoSaveDelay: 1000`), GitDoc commits 1s after save. **Changes are pushed automatically** - no manual git commands needed during normal workflow.
- **Fleeting notes**: Quick captures, temporary thoughts → `/docs/fleeting/`
- **Concept notes**: Refined ideas, evergreen content → `/docs/concepts/`
- **Project docs**: Specific project documentation → `/docs/projects/`
- **Bookmarklets**: Browser utilities → `/code/bookmarklets/`
- **Experiments**: Testing/learning → `/code/scratchpad/`
### Code Execution
Code Runner configured with:
- JavaScript: `node` (ES module compatible)
- Python: `python3`
- TypeScript: `ts-node`
- Always saves file before running
### Naming Conventions
### Obsidian Configuration
- Vault path: root workspace directory
- Daily notes: `docs/daily/daily-YYYY-MM-DD.md`
- New notes: `docs/` by default
- Attachments: `docs/assets/`
- Documentation: `kebab-case.md` (e.g., `my-note.md`)
- JavaScript: `kebab-case.js` (e.g., `my-bookmarklet.js`)
- Python: `snake_case.py` (e.g., `my_script.py`)
- TypeScript: `kebab-case.ts` (e.g., `my-module.ts`)
## Development Preferences
## Git Commit Practices
GitDoc auto-commits on save. For manual commits:
- Use conventional commits: `type: description`
- Types: `docs:`, `feat:`, `fix:`, `refactor:`, `chore:`
- Examples:
- `docs: add note on memory techniques`
- `feat: create bookmark highlighter bookmarklet`
- `fix: correct regex in search bookmarklet`
## Special Considerations
### Cross-Linking
When suggesting note connections:
- Look for conceptual relationships
- Suggest bidirectional links
- Consider creating index notes for related topics
### Code Reusability
- Create templates in `/code/templates/` for common patterns
- Extract reusable functions into utility modules
- Document APIs and interfaces
### Search & Discovery
- Use descriptive titles and headers
- Include relevant tags in frontmatter
- Add aliases for alternative terms
- Consider TODO tags: `TODO:`, `FIXME:`, `NOTE:`, `IDEA:`
## Preferences
- **Brevity**: Favor concise, clear explanations
- **Examples**: Include practical examples in code
- **Context**: Assume this is a personal knowledge workspace
- **Flexibility**: This is a scratchpad - prioritize exploration over perfection
- **Learning**: Explain concepts when introducing new patterns or techniques
## README Maintenance
**IMPORTANT**: Keep README files synchronized with project structure changes.
### When to Update READMEs
Update relevant README.md files whenever you:
- Add or remove folders
- Change file organization
- Add new tools or utilities
- Modify workflows or conventions
- Add new features or capabilities
### README Locations
- `/README.md` - Main project overview and quick start
- `/docs/README.md` - Documentation hub and note-taking guide
- `/code/README.md` - Code section overview
- `/code/bookmarklets/README.md` - Bookmarklet creation guide
- `/.github/README.md` - GitHub templates and structure
### Update Guidelines
- Keep structure diagrams accurate
- Update examples to reflect current patterns
- Maintain consistency across all READMEs
- Add new sections before implementation when adding major features
- Remove outdated information immediately
## Tools & Extensions Available
- Foam (wiki-links, backlinks, graph)
- Code Runner (quick code execution)
- Todo Tree (tracks TODO comments)
- Bookmarks (mark important code locations)
- ESLint (JavaScript linting)
- **Exploration over perfection** - This is a personal scratchpad
- **Document why, not what** - Code should be self-explanatory
- **Practical examples** - Include usage examples in code
- **Cross-link liberally** - Wiki-links create knowledge connections
- **Track todos inline** - Use TODO/FIXME/NOTE comments (Todo Tree finds them)

View File

@@ -1,6 +1,6 @@
{
"recommendations": [
"foam.foam-vscode",
"willasm.obsidian-md-vsc",
"yzhang.markdown-all-in-one",
"kortina.vscode-markdown-notes",
"gruntfuggly.todo-tree",
@@ -11,4 +11,4 @@
"mhutchie.git-graph",
"eamodio.gitlens"
]
}
}

29
.vscode/settings.json vendored
View File

@@ -1,24 +1,19 @@
{
// Foam Configuration
"foam.openDailyNote.directory": "docs/daily",
"foam.openDailyNote.filenameFormat": "'daily-'yyyy-MM-dd",
"foam.files.ignore": [
"**/node_modules/**",
"**/code/**/*.js",
"**/code/**/*.py",
"**/code/**/*.ts"
],
// Obsidian MD Configuration
"obsidian.vaultPath": "/Users/fragginwagon/Developer/MemoryPalace",
"obsidian.showCommandInContextMenu": true,
"obsidian.dailyNotePath": "docs/daily",
"obsidian.dailyNoteFormat": "daily-YYYY-MM-DD",
"obsidian.newNoteDirectory": "docs",
"obsidian.attachmentsFolder": "docs/assets",
// Markdown Configuration
"markdown.extension.toc.levels": "2..6",
"markdown.extension.completion.root": "./docs",
"markdown.extension.preview.autoShowPreviewToSide": true,
// Markdown Notes Configuration
"vscodeMarkdownNotes.noteCompletionConvention": "[[wiki-link]]",
"vscodeMarkdownNotes.slugifyMethod": "github-slug",
"vscodeMarkdownNotes.workspaceFilenameConvention": "uniqueFilenames",
// Todo Tree Configuration
"todo-tree.general.tags": [
"TODO",
@@ -36,7 +31,6 @@
"opacity": 50
},
"todo-tree.regex.regex": "(//|#|<!--|;|/\\*|^|^[ \\t]*(-|\\d+.))\\s*($TAGS)",
// Code Runner Configuration
"code-runner.clearPreviousOutput": true,
"code-runner.showExecutionMessage": true,
@@ -47,12 +41,10 @@
"python": "python3",
"typescript": "ts-node"
},
// File Associations
"files.associations": {
"*.md": "markdown"
},
// Search Configuration
"search.exclude": {
"**/node_modules": true,
@@ -60,11 +52,9 @@
"**/*.code-search": true,
"**/docs/assets/**": true
},
// Auto Save
"files.autoSave": "afterDelay",
"files.autoSaveDelay": 1000,
// Editor Configuration for Markdown
"[markdown]": {
"editor.wordWrap": "on",
@@ -76,11 +66,9 @@
"editor.snippetSuggestions": "top",
"editor.formatOnSave": true
},
// Bookmarks Configuration
"bookmarks.saveBookmarksInProject": true,
"bookmarks.navigateThroughAllFiles": true,
// GitDoc Configuration - Auto-commit on save
"gitdoc.enabled": true,
"gitdoc.autoCommitDelay": 1000,
@@ -88,7 +76,6 @@
"gitdoc.commitValidationLevel": "none",
"gitdoc.autoPush": "afterCommit",
"gitdoc.pullOnOpen": true,
// ESLint Configuration
"eslint.validate": [
"javascript",
@@ -96,4 +83,4 @@
"typescript",
"typescriptreact"
]
}
}

View File

@@ -2,6 +2,13 @@
A hybrid workspace combining Obsidian-style knowledge management with code development.
## 📚 Documentation
**New to this workspace?**
- Setup: See [SETUP.md](SETUP.md) for installation on a new computer
- Obsidian Guide: See [docs/OBSIDIAN_GUIDE.md](docs/OBSIDIAN_GUIDE.md) for comprehensive guide
## 📁 Structure
### Documentation (`/docs`)
@@ -30,9 +37,10 @@ A hybrid workspace combining Obsidian-style knowledge management with code devel
### Creating Notes
- Press `Cmd+Shift+P` and type "Foam: Create New Note" to create a linked note
- Press `Cmd+Shift+P` and type "Obsidian: Open Today's Daily Note" for daily notes
- Use `[[wiki-style links]]` to connect notes
- Daily notes: "Foam: Open Daily Note"
- Quick Switcher: "Obsidian: Quick Switcher" to navigate between notes
- Graph View: "Obsidian: Open Graph View" to visualize connections
### Linking Notes
@@ -50,9 +58,10 @@ A hybrid workspace combining Obsidian-style knowledge management with code devel
### Documentation Features
- **Wiki-style linking** - Connect ideas with `[[links]]`
- **Backlinks** - See which notes reference the current note
- **Graph visualization** - Visual map of your knowledge
- **Wiki-style linking** - Connect ideas with `[[links]]` ("Obsidian: Show Backlinks")
- **Graph visualization** - Visual map of your knowledge ("Obsidian: Open Graph View")
- **Daily notes** - Quick capture with today's note ("Obsidian: Open Today's Daily Note")
- **Quick Switcher** - Fast navigation between notesowledge
- **Daily notes** - Automatic daily note creation
### Code Features
@@ -62,16 +71,18 @@ A hybrid workspace combining Obsidian-style knowledge management with code devel
- **Code bookmarks** - Mark important code sections
- **Todo tracking** - Track TODOs across all files
## 🎯 Useful Commands
## 🎯 Useful Comma | Shortcut | Description |
| Command | Shortcut | Description |
| --------------- | ---------- | ------------------------- |
| Create New Note | - | Foam: Create New Note |
| Open Daily Note | - | Foam: Open Daily Note |
| Show Graph | - | Foam: Show Graph |
| Run Code | Ctrl+Alt+N | Execute current file |
| Toggle Bookmark | Cmd+Alt+K | Mark/unmark code location |
| Show Todos | - | Todo Tree: Focus on View |
| ------------------ | ---------- | ----------------------------------- |
| Daily Note | - | Obsidian: Open Today's Daily Note |
| Quick Switcher | - | Obsidian: Quick Switcher |
| Show Graph | - | Obsidian: Open Graph View |
| Show Backlinks | - | Obsidian: Show Backlinks |
| Run Code | Ctrl+Alt+N | Execute current file |
| Toggle Bookmark | Cmd+Alt+K | Mark/unmark code location |
| Show Todos | - | Todo Tree: Focus on View |
| Toggle Bookmark | Cmd+Alt+K | Mark/unmark code location |
| Show Todos | - | Todo Tree: Focus on View |
## 🔍 Search Tips

View File

@@ -14,10 +14,10 @@
* Example:
* npm run bookmarklet -- code/bookmarklets/example-bookmarklet.js
*/
import fs from "fs";
import path from "path";
import clipboardy from "clipboardy";
import { fileURLToPath } from "url";
import fs from 'fs';
import path from 'path';
import clipboardy from 'clipboardy';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
@@ -29,9 +29,9 @@ const __dirname = path.dirname(__filename);
*/
function removeComments(code) {
// Remove multi-line comments /* ... */
code = code.replace(/\/\*[\s\S]*?\*\//g, "");
code = code.replace(/\/\*[\s\S]*?\*\//g, '');
// Remove single-line comments //
code = code.replace(/\/\/.*$/gm, "");
code = code.replace(/\/\/.*$/gm, '');
return code;
}
@@ -42,12 +42,12 @@ function removeComments(code) {
*/
function minify(code) {
return code
.split("\n")
.map((line) => line.trim())
.filter((line) => line.length > 0)
.join(" ")
.replace(/\s+/g, " ")
.replace(/\s*([{}();,])\s*/g, "$1");
.split('\n')
.map(line => line.trim())
.filter(line => line.length > 0)
.join(' ')
.replace(/\s+/g, ' ')
.replace(/\s*([{}();,])\s*/g, '$1');
}
/**
@@ -62,7 +62,7 @@ function generateBookmarklet(filePath) {
}
// Read the JavaScript file
const jsCode = fs.readFileSync(filePath, "utf8");
const jsCode = fs.readFileSync(filePath, 'utf8');
// Clean and minify
let cleanedCode = removeComments(jsCode);
@@ -79,11 +79,11 @@ try {
const filePath = process.argv[2];
if (!filePath) {
console.error("❌ Error: Please provide a file path");
console.log("\nUsage:");
console.log(" npm run bookmarklet -- <path-to-js-file>");
console.log("\nExample:");
console.log(" npm run bookmarklet -- code/bookmarklets/my-bookmarklet.js");
console.error('❌ Error: Please provide a file path');
console.log('\nUsage:');
console.log(' npm run bookmarklet -- <path-to-js-file>');
console.log('\nExample:');
console.log(' npm run bookmarklet -- code/bookmarklets/my-bookmarklet.js');
process.exit(1);
}
@@ -93,14 +93,14 @@ try {
// Copy to clipboard
clipboardy.writeSync(bookmarklet);
console.log("✅ Bookmarklet generated successfully!");
console.log('✅ Bookmarklet generated successfully!');
console.log(`📁 Source: ${fileName}`);
console.log(`📋 Copied to clipboard (${bookmarklet.length} characters)`);
console.log("\n📝 Next steps:");
console.log(" 1. Create a new bookmark in your browser");
console.log(" 2. Paste the clipboard content as the URL");
console.log(" 3. Give it a name and save");
console.log('\n📝 Next steps:');
console.log(' 1. Create a new bookmark in your browser');
console.log(' 2. Paste the clipboard content as the URL');
console.log(' 3. Give it a name and save');
} catch (error) {
console.error("❌ Error:", error.message);
console.error('❌ Error:', error.message);
process.exit(1);
}

View File

@@ -0,0 +1,396 @@
/**
* Pokedex.Online Deployment Script
*
* Deploys the pokedex.online Docker container to Synology NAS via SSH.
* - Connects to Synology using configured SSH hosts
* - Transfers files via SFTP
* - Manages Docker deployment with rollback on failure
* - Performs health check to verify deployment
*
* Usage:
* node code/utils/deploy-pokedex.js [--target internal|external] [--port 8080] [--ssl-port 8443]
* npm run deploy:pokedex -- --target external --port 8081 --ssl-port 8444
*
* Examples:
* npm run deploy:pokedex # Deploy to internal (10.0.0.81) on port 8080
* npm run deploy:pokedex -- --target external # Deploy to external (home.gregrjacobs.com)
* npm run deploy:pokedex -- --port 8081 # Deploy to internal on port 8081
* npm run deploy:pokedex -- --port 8080 --ssl-port 8443 # Deploy with HTTPS on port 8443
* npm run deploy:pokedex -- --target external --port 3000 --ssl-port 3443
*/
import { NodeSSH } from 'node-ssh';
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import http from 'http';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// Configuration
const SSH_HOSTS = {
internal: {
host: '10.0.0.81',
port: 2323,
username: 'GregRJacobs',
privateKeyPath: '~/.ssh/ds3627xs_gregrjacobs',
password: 'J@Cubs88'
},
external: {
host: 'home.gregrjacobs.com',
port: 2323,
username: 'GregRJacobs',
privateKeyPath: '~/.ssh/ds3627xs_gregrjacobs',
password: 'J@Cubs88'
}
};
const REMOTE_PATH = '/volume1/docker/pokedex-online/base';
const CONTAINER_NAME = 'pokedex-online';
const SOURCE_DIR = path.resolve(__dirname, '../websites/pokedex.online/apps');
/**
* Parse command line arguments
* @returns {Object} Parsed arguments
*/
function parseArgs() {
const args = process.argv.slice(2);
const config = {
target: 'internal',
port: 8080,
sslPort: null
};
for (let i = 0; i < args.length; i++) {
if (args[i] === '--target' && args[i + 1]) {
config.target = args[i + 1];
i++;
} else if (args[i] === '--port' && args[i + 1]) {
config.port = parseInt(args[i + 1], 10);
i++;
} else if (args[i] === '--ssl-port' && args[i + 1]) {
config.sslPort = parseInt(args[i + 1], 10);
i++;
}
}
// Validate target
if (!SSH_HOSTS[config.target]) {
throw new Error(
`Invalid target: ${config.target}. Must be 'internal' or 'external'.`
);
}
// Validate port
if (isNaN(config.port) || config.port < 1 || config.port > 65535) {
throw new Error(
`Invalid port: ${config.port}. Must be between 1 and 65535.`
);
}
// Validate SSL port if provided
if (
config.sslPort !== null &&
(isNaN(config.sslPort) || config.sslPort < 1 || config.sslPort > 65535)
) {
throw new Error(
`Invalid SSL port: ${config.sslPort}. Must be between 1 and 65535.`
);
}
return config;
}
/**
* Expand tilde in file paths
* @param {string} filepath - Path potentially starting with ~
* @returns {string} Expanded path
*/
function expandTilde(filepath) {
if (filepath.startsWith('~/')) {
return path.join(process.env.HOME, filepath.slice(2));
}
return filepath;
}
/**
* Create modified docker-compose.yml with custom ports
* @param {number} port - HTTP port to map to container
* @param {number|null} sslPort - HTTPS port to map to container (optional)
* @returns {string} Modified docker-compose content
*/
function createModifiedDockerCompose(port, sslPort) {
const originalPath = path.join(SOURCE_DIR, 'docker-compose.yml');
let content = fs.readFileSync(originalPath, 'utf8');
// Replace HTTP port mapping (handle both single and double quotes)
content = content.replace(/- ['"](\d+):80['"]/, `- '${port}:80'`);
// Replace HTTPS port mapping if SSL port provided
if (sslPort !== null) {
content = content.replace(/- ['"](\d+):443['"]/, `- '${sslPort}:443'`);
} else {
// Remove HTTPS port mapping if no SSL port specified
content = content.replace(/\s*- ['"](\d+):443['"]/g, '');
}
return content;
}
/**
* Perform HTTP health check
* @param {string} host - Host to check
* @param {number} port - Port to check
* @param {number} retries - Number of retries
* @returns {Promise<boolean>} True if healthy
*/
async function healthCheck(host, port, retries = 5) {
for (let i = 0; i < retries; i++) {
try {
await new Promise((resolve, reject) => {
const req = http.get(
`http://${host}:${port}`,
{ timeout: 5000 },
res => {
if (res.statusCode === 200) {
resolve();
} else {
reject(new Error(`HTTP ${res.statusCode}`));
}
}
);
req.on('error', reject);
req.on('timeout', () => {
req.destroy();
reject(new Error('Request timeout'));
});
});
return true;
} catch (error) {
if (i < retries - 1) {
console.log(
`⏳ Health check attempt ${i + 1}/${retries} failed, retrying in 3s...`
);
await new Promise(resolve => setTimeout(resolve, 3000));
}
}
}
return false;
}
/**
* Main deployment function
*/
async function deploy() {
const ssh = new NodeSSH();
let previousImage = null;
let containerExisted = false;
try {
// Parse arguments
const config = parseArgs();
const sshConfig = SSH_HOSTS[config.target];
console.log('🚀 Starting Pokedex.Online deployment');
console.log(
`📡 Target: ${config.target} (${sshConfig.host}:${sshConfig.port})`
);
console.log(`🔌 HTTP Port: ${config.port}`);
if (config.sslPort) {
console.log(`🔒 HTTPS Port: ${config.sslPort}`);
}
// Connect to Synology
console.log('\n🔐 Connecting to Synology...');
await ssh.connect({
host: sshConfig.host,
port: sshConfig.port,
username: sshConfig.username,
privateKeyPath: expandTilde(sshConfig.privateKeyPath),
password: sshConfig.password,
tryKeyboard: true
});
console.log('✅ Connected successfully');
// Check if container exists and capture current image
console.log('\n📦 Checking for existing container...');
console.log(` Container name: ${CONTAINER_NAME}`);
try {
const result = await ssh.execCommand(
`/usr/local/bin/docker inspect --format='{{.Image}}' ${CONTAINER_NAME} || /usr/bin/docker inspect --format='{{.Image}}' ${CONTAINER_NAME}`
);
console.log(` Command exit code: ${result.code}`);
if (result.stdout) console.log(` Stdout: ${result.stdout.trim()}`);
if (result.stderr) console.log(` Stderr: ${result.stderr.trim()}`);
if (result.code === 0 && result.stdout.trim()) {
previousImage = result.stdout.trim();
containerExisted = true;
console.log(
`✅ Found existing container (image: ${previousImage.substring(0, 12)}...)`
);
} else {
console.log(' No existing container found');
}
} catch (error) {
console.log(` Error: ${error.message}`);
console.log(' No existing container found');
}
// Create remote directory
console.log('\n📁 Creating remote directory...');
const mkdirResult = await ssh.execCommand(`mkdir -p ${REMOTE_PATH}`);
console.log(` Command: mkdir -p ${REMOTE_PATH}`);
if (mkdirResult.stdout) console.log(` Output: ${mkdirResult.stdout}`);
if (mkdirResult.stderr) console.log(` Stderr: ${mkdirResult.stderr}`);
console.log(` ✅ Directory ready`);
// Create modified docker-compose.yml
const modifiedDockerCompose = createModifiedDockerCompose(
config.port,
config.sslPort
);
const tempDockerComposePath = path.join(
SOURCE_DIR,
'docker-compose.tmp.yml'
);
fs.writeFileSync(tempDockerComposePath, modifiedDockerCompose);
// Transfer files
console.log('\n📤 Transferring files...');
const filesToTransfer = [
{
local: path.join(SOURCE_DIR, 'index.html'),
remote: `${REMOTE_PATH}/index.html`
},
{
local: path.join(SOURCE_DIR, 'Dockerfile'),
remote: `${REMOTE_PATH}/Dockerfile`
},
{
local: tempDockerComposePath,
remote: `${REMOTE_PATH}/docker-compose.yml`
}
];
for (const file of filesToTransfer) {
try {
await ssh.putFile(file.local, file.remote);
console.log(`${path.basename(file.local)}`);
} catch (error) {
// If SFTP fails, fall back to cat method
console.log(
` ⚠️ SFTP failed for ${path.basename(file.local)}, using cat fallback...`
);
const fileContent = fs.readFileSync(file.local, 'utf8');
const escapedContent = fileContent.replace(/'/g, "'\\''");
const catResult = await ssh.execCommand(
`cat > '${file.remote}' << 'EOFMARKER'\n${fileContent}\nEOFMARKER`
);
if (catResult.stdout) console.log(` Output: ${catResult.stdout}`);
if (catResult.stderr) console.log(` Stderr: ${catResult.stderr}`);
if (catResult.code !== 0) {
throw new Error(
`Failed to transfer ${path.basename(file.local)}: ${catResult.stderr}`
);
}
console.log(
`${path.basename(file.local)} (${fs.statSync(file.local).size} bytes)`
);
}
}
// Clean up temp file
fs.unlinkSync(tempDockerComposePath);
// Stop existing container first to avoid port conflicts
if (containerExisted) {
console.log('\n🛑 Stopping existing container...');
const stopResult = await ssh.execCommand(
`cd ${REMOTE_PATH} && /usr/local/bin/docker compose down || /usr/local/bin/docker-compose down`
);
if (stopResult.stdout) console.log(` ${stopResult.stdout.trim()}`);
console.log(' ✅ Container stopped');
}
// Deploy with docker-compose
console.log('\n🐳 Building and starting Docker container...');
console.log(` Working directory: ${REMOTE_PATH}`);
// Try Docker Compose V2 first (docker compose), then fall back to V1 (docker-compose)
// Use full paths for Synology
console.log(' Attempting: /usr/local/bin/docker compose up -d --build');
let deployResult = await ssh.execCommand(
`cd ${REMOTE_PATH} && /usr/local/bin/docker compose up -d --build || /usr/local/bin/docker-compose up -d --build || /usr/bin/docker compose up -d --build`,
{ stream: 'both' }
);
console.log('\n 📋 Docker Output:');
if (deployResult.stdout) {
deployResult.stdout.split('\n').forEach(line => {
if (line.trim()) console.log(` ${line}`);
});
}
if (deployResult.stderr) {
console.log('\n ⚠️ Docker Stderr:');
deployResult.stderr.split('\n').forEach(line => {
if (line.trim()) console.log(` ${line}`);
});
}
console.log(` Exit code: ${deployResult.code}`);
if (deployResult.code !== 0) {
throw new Error(`Docker deployment failed: ${deployResult.stderr}`);
}
console.log('\n✅ Container started');
// Health check
console.log('\n🏥 Performing health check...');
const isHealthy = await healthCheck(sshConfig.host, config.port);
if (!isHealthy) {
throw new Error('Health check failed - container is not responding');
}
console.log('✅ Health check passed');
console.log(`\n🎉 Deployment successful!`);
console.log(`🌐 HTTP: http://${sshConfig.host}:${config.port}`);
if (config.sslPort) {
console.log(`🔒 HTTPS: https://${sshConfig.host}:${config.sslPort}`);
}
ssh.dispose();
} catch (error) {
console.error('\n❌ Deployment failed:', error.message);
// Rollback
if (previousImage) {
console.log('\n🔄 Rolling back to previous image...');
try {
await ssh.execCommand(
`cd ${REMOTE_PATH} && docker-compose down && docker tag ${previousImage} pokedex-online:latest && docker-compose up -d`
);
console.log('✅ Rollback successful');
} catch (rollbackError) {
console.error('❌ Rollback failed:', rollbackError.message);
}
} else if (containerExisted === false) {
console.log('\n🧹 Cleaning up failed deployment...');
try {
await ssh.execCommand(
`cd ${REMOTE_PATH} && docker-compose down --volumes --remove-orphans`
);
console.log('✅ Cleanup successful');
} catch (cleanupError) {
console.error('❌ Cleanup failed:', cleanupError.message);
}
}
ssh.dispose();
process.exit(1);
}
}
// Run deployment
deploy();

View File

@@ -0,0 +1,296 @@
/**
* Organize Pokémon Resources
*
* Creates folder structure and renames files based on the order
* they appear on the pokemon.com resources page
*
* Usage:
* node code/utils/organize-pokemon-resources.js
* npm run organize:pokemon
*/
import puppeteer from 'puppeteer-extra';
import StealthPlugin from 'puppeteer-extra-plugin-stealth';
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
puppeteer.use(StealthPlugin());
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const BASE_URL =
'https://www.pokemon.com/us/play-pokemon/about/tournaments-rules-and-resources';
const RESOURCES_DIR = path.resolve(
__dirname,
'../../docs/projects/pokemon-professor/Pokemon Rules & Resources'
);
/**
* Clean filename for filesystem
*/
function sanitizeFilename(name) {
return name
.replace(/[<>:"/\\|?*]/g, '-')
.replace(/\s+/g, ' ')
.trim();
}
/**
* Main organization function
*/
async function organizeResources() {
console.log('🚀 Starting Pokémon Resources Organization');
console.log(`📁 Resources directory: ${RESOURCES_DIR}\n`);
const browser = await puppeteer.launch({
headless: true,
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-blink-features=AutomationControlled'
]
});
try {
const page = await browser.newPage();
await page.setViewport({ width: 1920, height: 1080 });
await page.setUserAgent(
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
);
console.log('🌐 Loading main page to extract structure...');
await page.goto(BASE_URL, { waitUntil: 'networkidle0', timeout: 90000 });
await new Promise(resolve => setTimeout(resolve, 3000));
// Extract the page structure: sections and their resources
const structure = await page.evaluate(() => {
const sections = [];
// Get the main content area
const mainContent =
document.querySelector('main, .main-content, article, #content') ||
document.body;
// Look for all text nodes and elements that might be section headers
// The page likely uses specific patterns for section titles
const allElements = Array.from(mainContent.querySelectorAll('*'));
for (let i = 0; i < allElements.length; i++) {
const element = allElements[i];
const text = element.innerText?.trim() || '';
// Check if this looks like a section header
// Pattern: ends with "Rules & Resources" or "Training Videos" or similar
const isSectionHeader =
(text.includes('Rules & Resources') ||
text.includes('Training Videos') ||
text === 'Further Resources for Players') &&
text.length < 100 &&
!text.includes('\n') &&
element.children.length < 3;
if (!isSectionHeader) continue;
const sectionTitle = text;
const links = [];
// Look ahead to find links belonging to this section
// Stop when we hit another section header
for (let j = i + 1; j < allElements.length && j < i + 50; j++) {
const nextEl = allElements[j];
const nextText = nextEl.innerText?.trim() || '';
// Stop if we hit another section header
if (
(nextText.includes('Rules & Resources') ||
nextText.includes('Training Videos') ||
nextText === 'Further Resources for Players') &&
nextText.length < 100 &&
!nextText.includes('\n') &&
nextEl.children.length < 3 &&
nextText !== sectionTitle
) {
break;
}
// Look for links in this element
if (nextEl.tagName === 'A' && nextEl.href) {
const linkText = nextEl.innerText.trim();
if (
linkText &&
!nextEl.href.includes('javascript:') &&
!nextEl.href.includes('#')
) {
links.push({ text: linkText, href: nextEl.href });
}
}
// Also check child links
const childLinks = nextEl.querySelectorAll('a[href]');
childLinks.forEach(a => {
const linkText = a.innerText.trim();
if (
linkText &&
!a.href.includes('javascript:') &&
!a.href.includes('#') &&
a.href.startsWith('http')
) {
links.push({ text: linkText, href: a.href });
}
});
}
if (links.length > 0) {
// Deduplicate links
const uniqueLinks = [];
const seen = new Set();
links.forEach(link => {
if (!seen.has(link.text)) {
seen.add(link.text);
uniqueLinks.push(link);
}
});
sections.push({
title: sectionTitle,
links: uniqueLinks
});
}
}
return sections;
});
console.log(`\n📋 Found ${structure.length} sections\n`);
// Deduplicate sections by title
const uniqueSections = [];
const seenTitles = new Set();
structure.forEach(section => {
if (!seenTitles.has(section.title)) {
seenTitles.add(section.title);
// Skip the main "Play! Pokémon Rules & Resources" section header
// as it's just a page title, not a content section
if (section.title !== 'Play! Pokémon Rules & Resources') {
uniqueSections.push(section);
}
}
});
console.log(
`📋 After deduplication: ${uniqueSections.length} unique sections\n`
);
// Get list of existing files
const existingFiles = fs
.readdirSync(RESOURCES_DIR)
.filter(
f =>
!f.startsWith('.') &&
!f.startsWith('debug') &&
(f.endsWith('.pdf') || f.endsWith('.txt'))
);
console.log(`📦 Found ${existingFiles.length} files to organize\n`);
let totalMoved = 0;
let sectionIndex = 1;
// Process each section
for (const section of uniqueSections) {
const sectionName = sanitizeFilename(section.title);
const folderName = `${sectionIndex.toString().padStart(2, '0')}-${sectionName}`;
const folderPath = path.join(RESOURCES_DIR, folderName);
// Create section folder
if (!fs.existsSync(folderPath)) {
fs.mkdirSync(folderPath, { recursive: true });
}
console.log(`📂 Section ${sectionIndex}: ${section.title}`);
console.log(` Folder: ${folderName}`);
console.log(` Resources: ${section.links.length}\n`);
let resourceIndex = 1;
// Process each resource in this section
for (const link of section.links) {
const resourceName = sanitizeFilename(link.text);
// Find matching file
const matchingFile = existingFiles.find(f => {
const baseName = f.replace(/\.(pdf|txt)$/, '');
return (
baseName === resourceName ||
baseName.includes(resourceName) ||
resourceName.includes(baseName)
);
});
if (matchingFile) {
const oldPath = path.join(RESOURCES_DIR, matchingFile);
const extension = path.extname(matchingFile);
const newName = `${sectionIndex.toString().padStart(2, '0')}-${resourceIndex.toString().padStart(2, '0')}-${resourceName}${extension}`;
const newPath = path.join(folderPath, newName);
// Move and rename file
if (fs.existsSync(oldPath)) {
fs.renameSync(oldPath, newPath);
console.log(`${resourceIndex}. ${resourceName}${extension}`);
totalMoved++;
}
} else {
console.log(` ⚠️ ${resourceIndex}. ${resourceName} (not found)`);
}
resourceIndex++;
}
console.log('');
sectionIndex++;
}
// Move any remaining files to an "Other" folder
const remainingFiles = fs
.readdirSync(RESOURCES_DIR)
.filter(
f =>
!f.startsWith('.') &&
!fs.statSync(path.join(RESOURCES_DIR, f)).isDirectory() &&
(f.endsWith('.pdf') || f.endsWith('.txt'))
);
if (remainingFiles.length > 0) {
const otherFolder = path.join(RESOURCES_DIR, '99-Other');
if (!fs.existsSync(otherFolder)) {
fs.mkdirSync(otherFolder, { recursive: true });
}
console.log(
`📂 Moving ${remainingFiles.length} unmatched files to Other folder\n`
);
remainingFiles.forEach((file, index) => {
const oldPath = path.join(RESOURCES_DIR, file);
const newName = `99-${(index + 1).toString().padStart(2, '0')}-${file}`;
const newPath = path.join(otherFolder, newName);
fs.renameSync(oldPath, newPath);
console.log(`${file}`);
});
}
console.log(`\n🎉 Organization complete!`);
console.log(`📊 Statistics:`);
console.log(` Sections created: ${sectionIndex - 1}`);
console.log(` Files organized: ${totalMoved}`);
console.log(` Files in Other: ${remainingFiles.length}`);
} catch (error) {
console.error('❌ Error:', error.message);
process.exit(1);
} finally {
await browser.close();
}
}
organizeResources();

View File

@@ -0,0 +1,389 @@
/**
* Pokémon Play! Resources Scraper
*
* Downloads official tournament rules, resources, and documentation from pokemon.com
* - PDFs: Downloads directly
* - Videos: Saves video URLs to text files
* - Web pages: Extracts and saves text content
*
* Usage:
* node code/utils/scrape-pokemon-resources.js
* npm run scrape:pokemon
*
* Output: docs/projects/pokemon-professor/Pokemon Rules & Resources/
*/
import puppeteer from 'puppeteer-extra';
import StealthPlugin from 'puppeteer-extra-plugin-stealth';
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
import https from 'https';
import http from 'http';
// Add stealth plugin to avoid bot detection
puppeteer.use(StealthPlugin());
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// Configuration
const BASE_URL =
'https://www.pokemon.com/us/play-pokemon/about/tournaments-rules-and-resources';
const OUTPUT_DIR = path.resolve(
__dirname,
'../../docs/projects/pokemon-professor/Pokemon Rules & Resources'
);
// Target resource names from the page
const TARGET_RESOURCES = [
// Rules & Resources for All
'Play! Pokémon Terms of Use',
'Play! Pokémon Standards of Conduct',
'Play! Pokémon Inclusion Policy',
'Play! Pokémon Accessibility Policy',
'Play! Pokémon Trainer Username and Team Name Policy',
'Play! Pokémon Premier Events Sponsorship Policy',
'Play! Pokémon Tournament Rules Handbook',
'Play! Pokémon COVID-19 Protocols',
'Play! Pokémon Attire and Cosplay Policy',
'Play! Pokémon Penalty Guidelines',
// Pokémon TCG Rules & Resources
'Pokémon TCG Rulebook',
'Play! Pokémon Deck List (8.5x11)',
'Play! Pokémon Deck List (A4)',
'TCG Errata',
'Pokémon TCG Banned Card List',
'Mega Evolution—Phantasmal Flames Banned List and Rule Changes Announcement',
'Pokémon TCG Promo Card Legality Status',
'Pokémon TCG Alternative Play Handbook',
'Pokémon TCG Tournament Handbook',
// Video Game Rules & Resources
'Play! Pokémon Video Game Championships Tournament Handbook',
'Pokémon Video Game Team List',
// Pokémon GO Rules & Resources
'Play! Pokémon Pokémon GO Tournament Handbook',
'Pokémon GO Team List',
'Play! Pokémon Pokémon GO Championship Series Banned Pokémon List',
'Organizing Pokémon GO Events',
// Pokémon UNITE Rules & Resources
'Pokémon UNITE Championship Series Handbook',
// Pokémon League Rules & Resources
'Play! Pokémon Store Handbook',
'Play! Pokémon League Challenges, Cups, and Prerelease Guide',
'League Roster',
'League Flyer',
// Pokémon Club Rules & Resources
'Pokémon Activity Sheets',
// Further Resources for Players
'World Championships Battle Dictionary',
'Play! Pokémon Scholarship Program Terms and Conditions',
'Championship Event Awards Disbursement Information',
// Training Videos
'League Management Demos',
'Tournament Software and Reporting Events',
'Championship Series Reporting',
'TOM Training Videos',
'Tools Overview',
'Installation and Set-up',
'Setting Up Your Tournament',
'Tournament Detail Verification',
'Running & Completing the Tournament',
'Reporting Matches',
'Adding Players'
];
/**
* Clean filename for filesystem
* @param {string} name - Original name
* @returns {string} Safe filename
*/
function sanitizeFilename(name) {
return name
.replace(/[<>:"/\\|?*]/g, '-')
.replace(/\s+/g, ' ')
.trim();
}
/**
* Download file from URL using page context with cookies
* @param {Page} page - Puppeteer page
* @param {string} url - File URL
* @param {string} filepath - Destination path
* @returns {Promise<void>}
*/
async function downloadFile(page, url, filepath) {
// Get cookies from the current page session
const cookies = await page.cookies();
const cookieString = cookies.map(c => `${c.name}=${c.value}`).join('; ');
// Use page.evaluate to download with fetch
const buffer = await page.evaluate(async downloadUrl => {
const response = await fetch(downloadUrl, {
method: 'GET',
credentials: 'include'
});
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const arrayBuffer = await response.arrayBuffer();
return Array.from(new Uint8Array(arrayBuffer));
}, url);
const bufferData = Buffer.from(buffer);
// Verify it's actually a PDF
const header = bufferData.slice(0, 5).toString();
if (!header.startsWith('%PDF')) {
throw new Error(`Downloaded file is not a PDF (got: ${header})`);
}
fs.writeFileSync(filepath, bufferData);
}
/**
* Extract text content from a web page
* @param {Page} page - Puppeteer page
* @returns {Promise<string>} Page text content
*/
async function extractPageText(page) {
return await page.evaluate(() => {
// Remove script and style elements
const scripts = document.querySelectorAll(
'script, style, nav, footer, header'
);
scripts.forEach(el => el.remove());
// Get main content
const main =
document.querySelector('main, article, .content, #content') ||
document.body;
return main.innerText.trim();
});
}
/**
* Main scraping function
*/
async function scrapeResources() {
console.log('🚀 Starting Pokémon Play! Resources Scraper');
console.log(`📁 Output directory: ${OUTPUT_DIR}\n`);
// Create output directory
if (!fs.existsSync(OUTPUT_DIR)) {
fs.mkdirSync(OUTPUT_DIR, { recursive: true });
console.log('✅ Created output directory\n');
}
const browser = await puppeteer.launch({
headless: true,
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-blink-features=AutomationControlled',
'--disable-web-security',
'--disable-features=IsolateOrigins,site-per-process'
]
});
try {
const page = await browser.newPage();
await page.setViewport({ width: 1920, height: 1080 });
// Set realistic user agent
await page.setUserAgent(
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
);
// Set extra headers to appear more like a real browser
await page.setExtraHTTPHeaders({
'Accept-Language': 'en-US,en;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
Accept:
'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
});
// Navigate to main page
console.log('🌐 Loading main page...');
await page.goto(BASE_URL, { waitUntil: 'networkidle0', timeout: 90000 });
// Wait for content to load - try waiting for a specific element
console.log('⏳ Waiting for content to render...');
try {
await page.waitForSelector('a[href*=".pdf"], .resource, article', {
timeout: 10000
});
} catch (e) {
console.log(
'⚠️ Timeout waiting for specific selectors, continuing anyway...'
);
}
await new Promise(resolve => setTimeout(resolve, 5000));
console.log('✅ Page loaded\n');
// Debug: Take a screenshot
await page.screenshot({
path: path.join(OUTPUT_DIR, 'debug-screenshot.png'),
fullPage: true
});
console.log('📸 Screenshot saved for debugging\n');
// Debug: Dump HTML content
const html = await page.content();
fs.writeFileSync(path.join(OUTPUT_DIR, 'debug-page-source.html'), html);
console.log('📄 HTML source saved for debugging\n');
// Get all links on the page with multiple strategies
const links = await page.evaluate(() => {
const anchors = Array.from(document.querySelectorAll('a'));
const allLinks = anchors
.map(a => ({
text: a.innerText.trim(),
href: a.href,
title: a.title || '',
ariaLabel: a.getAttribute('aria-label') || ''
}))
.filter(
link =>
(link.text || link.title || link.ariaLabel) &&
link.href &&
!link.href.startsWith('javascript:') &&
!link.href.includes('#')
);
// Also try to get download links specifically
const downloadLinks = Array.from(
document.querySelectorAll('[download], a[href*=".pdf"]')
).map(a => ({
text: a.innerText.trim() || a.getAttribute('download') || a.title,
href: a.href
}));
return [...allLinks, ...downloadLinks].filter(
(link, index, self) =>
index === self.findIndex(l => l.href === link.href)
);
});
console.log(`📋 Found ${links.length} total links on page`);
// Debug: Show first 10 links
if (links.length > 0) {
console.log('\n📝 Sample links found:');
links.slice(0, 10).forEach((link, i) => {
console.log(` ${i + 1}. ${link.text.substring(0, 60)}...`);
});
console.log('');
} else {
console.log(
'⚠️ No links found - page may require different loading strategy\n'
);
}
// Process each target resource
let processed = 0;
let downloaded = 0;
let skipped = 0;
for (const targetName of TARGET_RESOURCES) {
// Find matching link (case-insensitive, fuzzy match)
const link = links.find(
l =>
l.text.toLowerCase().includes(targetName.toLowerCase()) ||
targetName.toLowerCase().includes(l.text.toLowerCase())
);
if (!link) {
console.log(`⚠️ Could not find link for: ${targetName}`);
skipped++;
continue;
}
processed++;
const safeFilename = sanitizeFilename(targetName);
try {
// Check if it's a PDF
if (link.href.toLowerCase().endsWith('.pdf')) {
const filepath = path.join(OUTPUT_DIR, `${safeFilename}.pdf`);
console.log(`📥 Downloading PDF: ${targetName}`);
console.log(` URL: ${link.href}`);
await downloadFile(page, link.href, filepath);
console.log(` ✅ Saved: ${safeFilename}.pdf\n`);
downloaded++;
}
// Check if it's a video link (YouTube, Vimeo, etc.)
else if (
link.href.includes('youtube.com') ||
link.href.includes('youtu.be') ||
link.href.includes('vimeo.com') ||
link.href.includes('video')
) {
const filepath = path.join(
OUTPUT_DIR,
`${safeFilename} - Video URL.txt`
);
console.log(`🎥 Saving video URL: ${targetName}`);
fs.writeFileSync(
filepath,
`${targetName}\n\nVideo URL: ${link.href}\n`
);
console.log(` ✅ Saved: ${safeFilename} - Video URL.txt\n`);
downloaded++;
}
// Otherwise, extract page text
else {
console.log(`📄 Extracting text from: ${targetName}`);
console.log(` URL: ${link.href}`);
const contentPage = await browser.newPage();
await contentPage.goto(link.href, {
waitUntil: 'networkidle2',
timeout: 60000
});
const text = await extractPageText(contentPage);
await contentPage.close();
const filepath = path.join(OUTPUT_DIR, `${safeFilename}.txt`);
fs.writeFileSync(
filepath,
`${targetName}\n\nSource: ${link.href}\n\n${text}\n`
);
console.log(` ✅ Saved: ${safeFilename}.txt\n`);
downloaded++;
}
} catch (error) {
console.error(
` ❌ Error processing ${targetName}: ${error.message}\n`
);
skipped++;
}
}
console.log('🎉 Scraping complete!');
console.log(`📊 Statistics:`);
console.log(` Total targets: ${TARGET_RESOURCES.length}`);
console.log(` Processed: ${processed}`);
console.log(` Downloaded: ${downloaded}`);
console.log(` Skipped: ${skipped}`);
} catch (error) {
console.error('❌ Fatal error:', error.message);
process.exit(1);
} finally {
await browser.close();
}
}
// Run scraper
scrapeResources();

View File

@@ -0,0 +1,11 @@
# Use nginx alpine for lightweight serving
FROM nginx:alpine
# Copy website files to nginx html directory
COPY index.html /usr/share/nginx/html/
# Expose ports 80 (HTTP) and 443 (HTTPS)
EXPOSE 80 443
# Start nginx
CMD ["nginx", "-g", "daemon off;"]

View File

@@ -0,0 +1,214 @@
# Pokedex Online
A landing page for the Pokedex Online project, containerized and ready for deployment.
## 🚀 Local Development
### Quick Start
```bash
# Open index.html directly in browser
open index.html
```
## 🐳 Docker Deployment
### Build and Run Locally
```bash
# Build the image
docker build -t pokedex-online .
# Run the container
docker run -d -p 8080:80 --name pokedex-online pokedex-online
# View in browser
open http://localhost:8080
```
### Using Docker Compose
```bash
# Start the service
docker-compose up -d
# Stop the service
docker-compose down
# View logs
docker-compose logs -f
```
## 📦 Portainer Deployment
### Option 1: Stack Deployment (Recommended)
1. Log into Portainer
2. Navigate to **Stacks****Add stack**
3. Name: `pokedex-online`
4. Upload or paste the `docker-compose.yml` contents
5. Click **Deploy the stack**
### Option 2: Container Deployment
1. Build the image locally:
```bash
docker build -t pokedex-online:latest .
```
2. Tag for your registry (if using):
```bash
docker tag pokedex-online:latest your-registry/pokedex-online:latest
docker push your-registry/pokedex-online:latest
```
3. In Portainer:
- Navigate to **Containers** → **Add container**
- Name: `pokedex-online`
- Image: `pokedex-online:latest` (or your registry path)
- Port mapping: `8080:80`
- Restart policy: `unless-stopped`
- Deploy
### Option 3: Git Repository (Portainer with BuildKit)
1. In Portainer, navigate to **Stacks** → **Add stack**
2. Choose **Repository**
3. Repository URL: Your git repository URL
4. Compose path: `code/websites/pokedex.online/docker-compose.yml`
5. Deploy
## 🌐 Access
After deployment, access the site at:
- Local: http://localhost:8080
- Server: http://your-server-ip:8080
## <20> Automated Deployment to Synology
### Prerequisites
1. **SSH Configuration**: Ensure SSH keys are configured for Synology NAS:
- Host: `synology_internal` (10.0.0.81:2323) or `synology_external` (home.gregrjacobs.com:2323)
- User: `GregRJacobs`
- Key: `~/.ssh/ds3627xs_gregrjacobs`
2. **Remote Path**: Deployment target is `/volume1/docker/pokedex-online/base` on Synology
### Deployment Commands
```bash
# Deploy to internal Synology (10.0.0.81) on default port 8080
npm run deploy:pokedex
# Deploy to internal with custom port
npm run deploy:pokedex -- --port 8081
# Deploy to external Synology (home.gregrjacobs.com)
npm run deploy:pokedex:external
# Deploy to external with custom port
npm run deploy:pokedex:external -- --port 3000
# Full custom deployment
npm run deploy:pokedex -- --target internal --port 8082
```
### Deployment Process
The deployment script automatically:
1. **Connects** to Synology via SSH using configured host
2. **Captures** existing container state for rollback capability
3. **Transfers** files (index.html, Dockerfile, docker-compose.yml) via SFTP
4. **Modifies** docker-compose.yml port mapping based on `--port` argument
5. **Builds** and starts the Docker container with `docker-compose up -d --build`
6. **Health checks** the deployed container (5 retries with 3s intervals)
7. **Rolls back** to previous image on failure, or cleans up if no previous deployment existed
### Health Check
After deployment, the script verifies the container is responding by making HTTP requests to:
- Internal: `http://10.0.0.81:<port>`
- External: `http://home.gregrjacobs.com:<port>`
If health check fails after 5 attempts, the deployment is rolled back automatically.
### Rollback Behavior
- **Existing container**: Rolls back to previous Docker image
- **New deployment**: Runs `docker-compose down --volumes --remove-orphans` to clean up
### CLI Options
| Option | Values | Default | Description |
|--------|--------|---------|-------------|
| `--target` | `internal`, `external` | `internal` | SSH host to deploy to |
| `--port` | `1-65535` | `8080` | HTTP port to expose on host |
### Examples
```bash
# Production deployment to external Synology on port 80
npm run deploy:pokedex -- --target external --port 80
# Development deployment to internal Synology on port 8080
npm run deploy:pokedex:internal
# Test deployment on high port
npm run deploy:pokedex -- --port 9000
```
## 🔧 Configuration
### Change Port
Edit `docker-compose.yml`:
```yaml
ports:
- "3000:80" # Change 3000 to your desired port
```
Or use the `--port` argument during automated deployment.
### Custom Domain
If using a reverse proxy (nginx, Traefik, Caddy):
```yaml
labels:
- "traefik.enable=true"
- "traefik.http.routers.pokedex.rule=Host(`pokedex.yourdomain.com`)"
```
## 📁 Project Structure
```
pokedex.online/
├── index.html # Landing page
├── Dockerfile # Container configuration
├── docker-compose.yml # Compose configuration
└── README.md # This file
```
## 🛠️ Future Development
This is currently a landing page. Future plans:
- Interactive Pokédex with search
- Team builder
- Type effectiveness calculator
- Collection tracker
- Integration with Pokémon APIs
## 📝 Notes
- Uses nginx:alpine for minimal footprint (~23MB)
- Restart policy set to `unless-stopped`
- Watchtower compatible for auto-updates
- No environment variables needed for basic setup
---
**Status**: In Development
**Last Updated**: January 2026

View File

@@ -0,0 +1,12 @@
version: '3.8'
services:
pokedex-online:
build: .
container_name: pokedex-online
ports:
- '8083:80'
- '8444:443'
restart: unless-stopped
labels:
- 'com.centurylinklabs.watchtower.enable=true'

View File

@@ -0,0 +1,124 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Pokedex Online - Coming Soon</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
}
.container {
background: white;
border-radius: 20px;
padding: 60px 40px;
max-width: 600px;
width: 100%;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
text-align: center;
}
.pokeball {
width: 100px;
height: 100px;
margin: 0 auto 30px;
position: relative;
border-radius: 50%;
background: linear-gradient(180deg, #f44336 50%, white 50%);
border: 5px solid #333;
}
.pokeball::before {
content: '';
position: absolute;
width: 30px;
height: 30px;
background: white;
border: 5px solid #333;
border-radius: 50%;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.pokeball::after {
content: '';
position: absolute;
width: 100%;
height: 5px;
background: #333;
top: 50%;
left: 0;
transform: translateY(-50%);
}
h1 {
color: #333;
margin-bottom: 20px;
font-size: 2.5em;
}
.subtitle {
color: #667eea;
font-size: 1.2em;
margin-bottom: 30px;
}
.description {
color: #666;
line-height: 1.6;
margin-bottom: 30px;
}
.status {
background: #f0f0f0;
padding: 15px;
border-radius: 10px;
color: #666;
font-size: 0.9em;
}
.status strong {
color: #667eea;
}
@media (max-width: 600px) {
.container {
padding: 40px 20px;
}
h1 {
font-size: 2em;
}
}
</style>
</head>
<body>
<div class="container">
<div class="pokeball"></div>
<h1>Pokedex Online</h1>
<p class="subtitle">Your Digital Pokédex Companion</p>
<p class="description">
A modern web application for exploring Pokémon data, tracking collections,
and managing your Pokémon journey. Built with ❤️ for trainers everywhere.
</p>
<div class="status">
<strong>Status:</strong> In Development<br>
Check back soon for updates!
</div>
</div>
</body>
</html>

353
docs/OBSIDIAN_GUIDE.md Normal file
View File

@@ -0,0 +1,353 @@
---
type: reference
created: 2026-01-26
tags: [obsidian, guide, tutorial]
---
# Obsidian MD for VSCode Guide
A comprehensive guide to using Obsidian MD extension within VS Code for your Memory Palace.
## What is Obsidian MD for VSCode?
Obsidian MD for VSCode brings the power of Obsidian's knowledge management features directly into VS Code. You can use wiki-links, backlinks, graph view, and daily notes without leaving your editor.
## Key Features
### 1. Wiki-Links
Create bidirectional links between notes using `[[double brackets]]`:
```markdown
This is a note about [[Memory Techniques]] that relates to [[Spaced Repetition]].
```
- **Ctrl/Cmd + Click** on a link to navigate
- Links to non-existent notes show up differently (you can create them on click)
- Works with paths: `[[docs/concepts/memory-techniques]]`
### 2. Backlinks
See all notes that link to the current note:
- Open **Command Palette** (Cmd+Shift+P)
- Search for "Obsidian: Show Backlinks"
- A panel shows all incoming links to current note
### 3. Graph View
Visualize your note connections:
- Open **Command Palette** (Cmd+Shift+P)
- Search for "Obsidian: Open Graph View"
- See your knowledge graph with nodes (notes) and edges (links)
- Click nodes to navigate
### 4. Daily Notes
Quick access to today's note:
- **Command Palette** → "Obsidian: Open Today's Daily Note"
- Configured to save in `docs/daily/` as `daily-YYYY-MM-DD.md`
- Great for quick captures, journal entries, and daily logs
### 5. Quick Switcher
Fast navigation between notes:
- Open **Command Palette**
- Search for "Obsidian: Quick Switcher"
- Type note name to jump to it instantly
## Best Practices
### Organize Your Notes
```
docs/
├── daily/ # Daily journals and quick captures
├── concepts/ # Evergreen, refined knowledge
├── projects/ # Project-specific documentation
├── fleeting/ # Temporary notes to process later
└── reference-material/ # Resources and references
```
### Use Frontmatter
Add metadata to every note for better organization:
```markdown
---
type: concept|project|fleeting|reference
created: 2026-01-26
updated: 2026-01-26
tags: [programming, javascript, bookmarklets]
status: draft|in-progress|complete
---
# Note Title
```
### Link Liberally
Don't overthink links - add them as you write:
- Link to concepts: `[[memory techniques]]`
- Link to projects: `[[paperlyte]]`
- Link to daily notes: `[[daily-2026-01-26]]`
The graph view will reveal patterns over time.
### Progressive Summarization
1. **Capture** - Write fleeting notes in `docs/fleeting/`
2. **Connect** - Add links to related concepts
3. **Refine** - Move to `docs/concepts/` when mature
4. **Highlight** - Bold key insights
5. **Summarize** - Add overview sections
### Zettelkasten Method
Create atomic notes (one idea per note):
```markdown
# Memory Palace Technique
A mnemonic device using spatial memory.
## Core Concept
Associate information with specific locations in a familiar space.
## Related
- [[Spaced Repetition]]
- [[Mnemonic Devices]]
- [[Method of Loci]]
## References
- [[reference-material/moonwalking-with-einstein]]
```
### MOC (Map of Content)
Create index notes for topics:
```markdown
# JavaScript MOC
## Core Concepts
- [[ES Modules]]
- [[Async/Await]]
- [[Closures]]
## Projects
- [[bookmarklets/README]]
- [[scratchpad/experiments]]
## Resources
- [[reference-material/you-dont-know-js]]
```
## Workflows
### Capture Quick Thoughts
1. Open today's daily note (Command Palette → Obsidian: Open Today's Daily Note)
2. Write thoughts under `## Quick Captures`
3. Add links to related notes
4. Process later by moving to permanent notes
### Research & Learning
1. Create fleeting note in `docs/fleeting/`
2. Add source links and highlights
3. Connect to existing concepts with `[[wiki-links]]`
4. When understanding solidifies, refine into concept note
5. Archive or delete fleeting note
### Project Documentation
1. Create project folder in `docs/projects/[project-name]/`
2. Add `README.md` as entry point
3. Link to related concepts and resources
4. Use daily notes to log progress
5. Link daily entries back to project README
### Code + Documentation Together
Since this is a hybrid workspace:
```markdown
# Bookmarklet: Highlight Links
## Overview
Highlights all links on a page.
## Implementation
See [[code/bookmarklets/highlight-links.js]]
## Usage
Generated via: `npm run bookmarklet -- code/bookmarklets/highlight-links.js`
## Related
- [[JavaScript Bookmarklets]]
- [[Browser DOM Manipulation]]
```
## Keyboard Shortcuts
Configure these in VS Code settings for faster workflow:
- **Quick Switcher**: Set custom keybinding
- **Daily Note**: Set custom keybinding (e.g., Cmd+Shift+D)
- **Graph View**: Set custom keybinding (e.g., Cmd+Shift+G)
- **Follow Link**: Cmd+Click (built-in)
- **Go Back**: Cmd+- (VS Code navigation)
## Tips & Tricks
### Use Aliases in Frontmatter
```markdown
---
aliases: [ML, Machine Learning, AI Learning]
---
# Machine Learning Concepts
```
Now you can link with any alias: `[[ML]]` or `[[Machine Learning]]`
### Embed Notes
Show content from other notes:
```markdown
## Memory Technique Summary
![[memory-palace-technique]]
```
### Use Tags Strategically
```markdown
---
tags: [in-progress, needs-review, high-priority]
---
```
Search by tag using VS Code's search: `#in-progress`
### Combine with Todo Tree
```markdown
## TODO List
- TODO: Research spaced repetition algorithms
- FIXME: Update outdated references
- IDEA: Create MOC for learning techniques
```
These show up in Todo Tree extension sidebar.
### Use Templates
Create templates in `docs/templates/`:
```markdown
## <!-- docs/templates/concept-note.md -->
type: concept
created: {{date}}
tags: []
---
# {{title}}
## Overview
## Details
## Examples
## Related
-
## References
-
```
## Obsidian vs Foam
You've switched from Foam to Obsidian MD. Here are the differences:
| Feature | Foam | Obsidian MD |
| ------------------------ | ---- | -------------------------- |
| Graph View | ✓ | ✓ (Better visualization) |
| Backlinks | ✓ | ✓ |
| Wiki-links | ✓ | ✓ |
| Daily Notes | ✓ | ✓ |
| Quick Switcher | ✗ | ✓ |
| Community | Good | Larger |
| Obsidian App Integration | ✗ | ✓ Can open in Obsidian app |
| Performance | Good | Better for large vaults |
## Integration with Obsidian App (Optional)
You can also open this workspace in the actual Obsidian app:
1. Install [Obsidian](https://obsidian.md/)
2. Open as vault: `/Users/fragginwagon/Developer/MemoryPalace`
3. Edit in Obsidian or VS Code - they sync automatically
4. Use Obsidian's mobile app for notes on the go
Benefits:
- Richer graph view with filters
- More theme options
- Mobile app for capture
- Community plugins (dataview, calendar, etc.)
## Troubleshooting
**Links not working?**
- Check `obsidian.vaultPath` in [.vscode/settings.json](.vscode/settings.json)
- Ensure path is `/Users/fragginwagon/Developer/MemoryPalace`
**Graph view not showing?**
- Create more notes with `[[links]]`
- Graph appears when you have interconnected notes
**Daily notes in wrong location?**
- Check `obsidian.dailyNotePath` setting
- Should be `docs/daily`
## Resources
- [Obsidian Help](https://help.obsidian.md/)
- [Linking Your Thinking (YouTube)](https://www.youtube.com/c/NickMilo)
- [Zettelkasten Method](https://zettelkasten.de/)
- [Building a Second Brain](https://www.buildingasecondbrain.com/)
## Next Steps
1. Open today's daily note and start capturing thoughts
2. Create a few concept notes with `[[links]]`
3. View your graph to see connections
4. Explore backlinks panel for any note
5. Create a MOC for your main interest areas

View File

@@ -0,0 +1,7 @@
{
"attachmentFolderPath": "/attachments",
"alwaysUpdateLinks": true,
"newFileLocation": "current",
"promptDelete": false,
"readableLineLength": false
}

View File

@@ -0,0 +1,3 @@
{
"cssTheme": "Things"
}

View File

@@ -0,0 +1,4 @@
[
"obsidian-importer",
"obsidian-advanced-uri"
]

View File

@@ -0,0 +1,33 @@
{
"file-explorer": true,
"global-search": true,
"switcher": true,
"graph": true,
"backlink": true,
"canvas": true,
"outgoing-link": true,
"tag-pane": true,
"properties": false,
"page-preview": true,
"daily-notes": true,
"templates": true,
"note-composer": true,
"command-palette": true,
"slash-command": false,
"editor-status": true,
"bookmarks": true,
"markdown-importer": false,
"zk-prefixer": false,
"random-note": false,
"outline": true,
"word-count": true,
"slides": false,
"audio-recorder": false,
"workspaces": false,
"file-recovery": true,
"publish": false,
"sync": false,
"webviewer": false,
"footnotes": false,
"bases": true
}

View File

@@ -0,0 +1,22 @@
{
"collapse-filter": true,
"search": "",
"showTags": false,
"showAttachments": false,
"hideUnresolved": false,
"showOrphans": true,
"collapse-color-groups": true,
"colorGroups": [],
"collapse-display": true,
"showArrow": false,
"textFadeMultiplier": 0,
"nodeSizeMultiplier": 1,
"lineSizeMultiplier": 1,
"collapse-forces": true,
"centerStrength": 0.518713248970312,
"repelStrength": 10,
"linkStrength": 1,
"linkDistance": 250,
"scale": 1,
"close": true
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,11 @@
{
"id": "obsidian-advanced-uri",
"name": "Advanced URI",
"description": "Advanced modes for Obsidian URI",
"isDesktopOnly": false,
"js": "main.js",
"fundingUrl": "https://ko-fi.com/vinzent",
"version": "1.46.1",
"author": "Vinzent",
"authorUrl": "https://github.com/Vinzent03"
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,10 @@
{
"id": "obsidian-importer",
"name": "Importer",
"version": "1.8.2",
"minAppVersion": "0.15.0",
"description": "Import data from Notion, Evernote, Apple Notes, Microsoft OneNote, Google Keep, Bear, Roam, Textbundle, CSV, and HTML files.",
"author": "Obsidian",
"authorUrl": "https://obsidian.md",
"isDesktopOnly": false
}

View File

@@ -0,0 +1,173 @@
.modal.mod-importer {
max-height: var(--modal-height);
padding: var(--size-4-4) 0 0 0;
position: relative;
overflow: hidden;
}
.modal.mod-importer .modal-title {
padding: 0 var(--size-4-4);
}
.modal.mod-importer .modal-content {
overflow: auto;
padding: var(--size-4-4);
margin-bottom: calc(var(--input-height) + var(--size-4-8));
border-top: var(--border-width) solid var(--background-modifier-border);
}
.modal.mod-importer .modal-button-container {
margin: 0 0 0 calc(var(--size-4-4) * -1);
padding: var(--size-4-4);
gap: var(--size-4-2);
position: absolute;
bottom: 0;
background-color: var(--background-primary);
border-top: var(--border-width) solid var(--background-modifier-border);
width: 100%;
}
.importer-progress-bar {
width: 100%;
height: 8px;
background-color: var(--background-secondary);
overflow: hidden;
box-shadow: inset 0px 0px 0px 1px var(--background-modifier-border);
border-radius: var(--radius-s);
}
.importer-progress-bar-inner {
width: 0;
height: 100%;
background-color: var(--interactive-accent);
}
.importer-status {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
padding: var(--size-4-2) 0;
}
.importer-stats-container {
display: flex;
justify-content: space-evenly;
margin-top: var(--size-4-5);
margin-bottom: var(--size-4-5);
}
.importer-stat {
text-align: center;
}
.importer-stat-count {
font-size: var(--font-ui-large);
}
.importer-log {
overflow: auto;
flex-grow: 1;
font-family: var(--font-monospace);
font-size: var(--font-ui-smaller);
color: var(--text-muted);
border: 1px solid var(--background-modifier-border);
padding: var(--size-4-4);
background-color: var(--background-secondary);
border-radius: var(--radius-s);
max-height: 300px;
user-select: text;
}
.importer-log .list-item {
display: inline-block;
line-height: var(--line-height-normal);
white-space: pre;
margin: var(--size-2-1);
}
.importer-error {
color: var(--text-error);
}
/* Template configuration styles */
.importer-frontmatter-header {
display: flex;
flex-direction: column;
gap: var(--size-4-2);
}
.importer-frontmatter-header h4 {
margin: 0;
}
.importer-select-all-setting {
padding: 0;
border: none;
}
.importer-select-all-setting .setting-item-info {
padding-inline-end: var(--size-4-2);
}
.importer-column-list {
display: flex;
flex-direction: column;
gap: var(--size-4-1);
padding: var(--size-4-3) 0;
}
.importer-column-header-row {
display: flex;
align-items: center;
gap: var(--size-4-2);
font-size: var(--font-ui-smaller);
color: var(--text-muted);
padding: var(--size-2-1) 0;
}
.importer-column-row {
display: flex;
align-items: center;
gap: var(--size-4-2);
background-color: var(--background-primary);
border-radius: var(--radius-s);
}
.importer-column-name-col {
flex: 0 0 150px;
min-width: 0;
}
.importer-column-value-col {
flex: 0 0 200px;
min-width: 0;
}
.importer-column-property {
width: 100%;
}
.importer-column-example-col {
flex: 1;
min-width: 0;
font-size: var(--font-ui-smaller);
color: var(--text-muted);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
padding: var(--size-2-1) var(--size-4-1);
}
.importer-column-delete-col {
flex-shrink: 0;
width: 32px;
display: flex;
align-items: center;
justify-content: center;
}
/* Fixed width buttons to prevent resizing during loading */
.notion-load-button {
width: 70px;
}
.notion-toggle-button {
width: 95px;
}

View File

@@ -0,0 +1,3 @@
{
"folder": "templates"
}

View File

@@ -0,0 +1,7 @@
{
"name": "Blue Topaz",
"version": "2025071401",
"minAppVersion": "1.0.0",
"author": "WhyI & Pkmer",
"authorUrl": "https://github.com/whyt-byte"
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,8 @@
{
"name": "Minimal",
"version": "8.1.2",
"minAppVersion": "1.9.0",
"author": "@kepano",
"authorUrl": "https://twitter.com/kepano",
"fundingUrl": "https://www.buymeacoffee.com/kepano"
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,7 @@
{
"name": "Things",
"version": "2.1.20",
"minAppVersion": "1.0.0",
"author": "@colineckert",
"authorUrl": "https://twitter.com/colineckert"
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,5 @@
{
"openExternalURLs": true,
"enableAdblocking": true,
"searchEngine": "google"
}

View File

@@ -0,0 +1,161 @@
{
"main": {
"id": "2c1257aca1513630",
"type": "split",
"children": [
{
"id": "7e92419a36179d19",
"type": "tabs",
"children": [
{
"id": "f1c69d76fb041853",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Our story.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Our story"
}
}
]
}
],
"direction": "vertical"
},
"left": {
"id": "3d75710a1eb00275",
"type": "mobile-drawer",
"children": [
{
"id": "fb5e8b31532d68bc",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "f4f62730cb8857dc",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "d1347a1931227149",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "fd38b4aeca67db33",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
],
"currentTab": 0
},
"right": {
"id": "d91b0f39d8edd1fc",
"type": "mobile-drawer",
"children": [
{
"id": "beb239baa25881f4",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "Our story.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks"
}
},
{
"id": "2cacace8674d5157",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "Our story.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links"
}
},
{
"id": "13dfcdfda0102440",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "Our story.md",
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "Outline"
}
}
],
"currentTab": 0
},
"left-ribbon": {
"hiddenItems": {
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false,
"bases:Create new base": false
}
},
"active": "f1c69d76fb041853",
"lastOpenFiles": [
"Our story.md"
]
}

View File

@@ -0,0 +1,231 @@
{
"main": {
"id": "65118307aef94695",
"type": "split",
"children": [
{
"id": "fb78540f6b0817b8",
"type": "tabs",
"children": [
{
"id": "6bd06c473a6df9f7",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Random & To Sort/The Tower.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "The Tower"
}
},
{
"id": "db667fd073afcf6d",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Christina/Feelings Conversations/Christina Talk - Jan 15 2024.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Christina Talk - Jan 15 2024"
}
}
],
"currentTab": 1
}
],
"direction": "vertical"
},
"left": {
"id": "87ef67fcdb70cca7",
"type": "split",
"children": [
{
"id": "51896b8d031f12a7",
"type": "tabs",
"children": [
{
"id": "16c60370ceca95ef",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "67df3fa6c50b7b8f",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "4735c1046deb84d5",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"right": {
"id": "fa8d807905c5f186",
"type": "split",
"children": [
{
"id": "15acd1bca30e4e69",
"type": "tabs",
"children": [
{
"id": "ec633bee723e26ed",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "Christina/Feelings Conversations/Christina Talk - Jan 15 2024.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks for Christina Talk - Jan 15 2024"
}
},
{
"id": "76553812ae09d02a",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "Welcome.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links from Welcome"
}
},
{
"id": "a90689d024131f8e",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "b05875d99c295b3e",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "Welcome.md"
},
"icon": "lucide-list",
"title": "Outline of Welcome"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"left-ribbon": {
"hiddenItems": {
"bases:Create new base": false,
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false,
"obsidian-importer:Open Importer": false
}
},
"active": "db667fd073afcf6d",
"lastOpenFiles": [
"Christina/Feelings Conversations/Christina Feelings -.md",
"Christina/Feelings Conversations/Christina Feelings - - Dec 20.md",
"Christina/Feelings Conversations/Christina Feelings - 51624.md",
"Christina/Feelings Conversations/Christina Feelings - Jan 31 2024.md",
"Christina/Feelings Conversations/Christina Feelings - Apr 19.md",
"Christina/Feelings Conversations/Christina Feelings - Dec 24 2023.md",
"Christina/Feelings Conversations/Christina Feelings - Aug 11 2022.md",
"Christina/Feelings Conversations/Christina Feelings - May 16 2024.md",
"Christina/Feelings Conversations/Christina Feelings - Apr 17 2024.md",
"Christina/Feelings Conversations/Christina Feelings - Mar 20 2024.md",
"Christina/Feelings Conversations/Christina Feelings - Feb 9 2024.md",
"Christina/Feelings Conversations/Christina Feelings June 29.md",
"Christina/Feelings Conversations/Christina Feelings - Dec 11 2025.md",
"Christina/Feelings Conversations/Christina Feelings - Jan 8 2026.md",
"Home Setup/Used Ports Synology Server.md",
"Icon\r",
"Apple Notes/Gift ideas ChristmasBirthday.md",
"Random & To Sort/The Tower.md",
"Christina/Feelings Conversations/Christina Talks - May 10 2025.md",
"Christina/Feelings Conversations",
"Apple Notes/-250.md",
"Apple Notes/- httpswrapbootstrap.comthememonarch-admin-responsive-angularjs….md",
"Apple Notes/______ earli-isasmchdoes lanes lashed mmy..md",
"Apple Notes/Christina 1/Christina Happy Mothers Day!.md",
"Apple Notes/Christina 1/age0-14& !shiny& !shadow& !legendary& !mythical& !lucky& !hatched….md",
"Apple Notes/Christina 1/!+mime& !+togep& !+burm& !+riolu& !+larv& !+chime& !+happ& !+sable….md",
"Apple Notes/Animal Crossing/Ribbot.md",
"attachments/100 1.png",
"Apple Notes/Animal Crossing/Retro Action Items.md",
"attachments/IMG_1115.jpeg",
"attachments/Drawing 2.png",
"attachments/IMG_6415.heic",
"attachments/Drawing 1.png",
"attachments/Drawing.png",
"attachments/Image.png",
"attachments/Feelings Chat 0528.jpeg",
"attachments/Pasted Graphic 2 1.png",
"attachments/mapstogpx202101793729.gpx",
"attachments/FavoriteLists_iTools_202101793649.json",
"attachments/Pasted Graphic 5.png",
"attachments/Pasted Graphic 4.png",
"attachments/iSpooferLicense.txt",
"attachments/Naka.gpx",
"attachments/Pasted Graphic 1.pdf",
"Apple Notes/Milwaukee 2025 Staff Notes",
"Apple Notes/Christina 1"
]
}

View File

@@ -0,0 +1,231 @@
{
"main": {
"id": "65118307aef94695",
"type": "split",
"children": [
{
"id": "fb78540f6b0817b8",
"type": "tabs",
"children": [
{
"id": "6bd06c473a6df9f7",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Random & To Sort/The Tower.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "The Tower"
}
},
{
"id": "db667fd073afcf6d",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Home Setup/Used Ports Synology Server.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Used Ports Synology Server"
}
}
],
"currentTab": 1
}
],
"direction": "vertical"
},
"left": {
"id": "87ef67fcdb70cca7",
"type": "split",
"children": [
{
"id": "51896b8d031f12a7",
"type": "tabs",
"children": [
{
"id": "16c60370ceca95ef",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "67df3fa6c50b7b8f",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "4735c1046deb84d5",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"right": {
"id": "fa8d807905c5f186",
"type": "split",
"children": [
{
"id": "15acd1bca30e4e69",
"type": "tabs",
"children": [
{
"id": "ec633bee723e26ed",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "Home Setup/Used Ports Synology Server.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks for Used Ports Synology Server"
}
},
{
"id": "76553812ae09d02a",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "Welcome.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links from Welcome"
}
},
{
"id": "a90689d024131f8e",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "b05875d99c295b3e",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "Welcome.md"
},
"icon": "lucide-list",
"title": "Outline of Welcome"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"left-ribbon": {
"hiddenItems": {
"bases:Create new base": false,
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false,
"obsidian-importer:Open Importer": false
}
},
"active": "db667fd073afcf6d",
"lastOpenFiles": [
"Icon\r",
"Apple Notes/Gift ideas ChristmasBirthday.md",
"Random & To Sort/The Tower.md",
"Christina/Feelings Conversations/Christina Talks - May 10 2025.md",
"Christina/Feelings Conversations",
"Apple Notes/-250.md",
"Apple Notes/- httpswrapbootstrap.comthememonarch-admin-responsive-angularjs….md",
"Apple Notes/______ earli-isasmchdoes lanes lashed mmy..md",
"Apple Notes/Christina 1/Christina Happy Mothers Day!.md",
"Apple Notes/Christina 1/age0-14& !shiny& !shadow& !legendary& !mythical& !lucky& !hatched….md",
"Apple Notes/Christina 1/!+mime& !+togep& !+burm& !+riolu& !+larv& !+chime& !+happ& !+sable….md",
"Apple Notes/Animal Crossing/Ribbot.md",
"attachments/100 1.png",
"Apple Notes/Animal Crossing/Retro Action Items.md",
"Apple Notes/Animal Crossing/Looking for 10NMT per run, OR Real redd artsculptures, OR 500k bells….md",
"Apple Notes/Animal Crossing/-3 Islanders, you will only use 2. -All three have to have a plot….md",
"Christina/Feelings Conversations/Christina Feelings - Dec 6 2026.md",
"Apple Notes/13.99+10.99+10.99+2.79=38.76.md",
"Apple Notes/Greg Feelings - Dec 4 2025.md",
"Christina/Feelings Conversations/Christina Feelings - Dec 2 2025.md",
"Apple Notes/Charlie advocating.md",
"Apple Notes/Most password is.md",
"Apple Notes/I have worked with the people below and they can attest to my work….md",
"Apple Notes/Parking.md",
"attachments/IMG_1115.jpeg",
"Apple Notes/New Note 20.md",
"Apple Notes/age0-120 &!legendary &!mythical &!ultra beasts &!shiny &!4 &!xxl….md",
"attachments/Drawing 2.png",
"Apple Notes/Home events.md",
"Christina/Feelings Conversations/Christina Feelings - Oct 14 2025.md",
"attachments/IMG_6415.heic",
"attachments/Drawing 1.png",
"attachments/Drawing.png",
"attachments/Image.png",
"attachments/Feelings Chat 0528.jpeg",
"attachments/Pasted Graphic 2 1.png",
"attachments/mapstogpx202101793729.gpx",
"attachments/FavoriteLists_iTools_202101793649.json",
"attachments/Pasted Graphic 5.png",
"attachments/Pasted Graphic 4.png",
"attachments/iSpooferLicense.txt",
"attachments/Naka.gpx",
"attachments/Pasted Graphic 1.pdf",
"Apple Notes/Milwaukee 2025 Staff Notes",
"Apple Notes/Christina 1",
"Apple Notes/Christina"
]
}

View File

@@ -0,0 +1,231 @@
{
"main": {
"id": "65118307aef94695",
"type": "split",
"children": [
{
"id": "fb78540f6b0817b8",
"type": "tabs",
"children": [
{
"id": "6bd06c473a6df9f7",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Random & To Sort/The Tower.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "The Tower"
}
},
{
"id": "db667fd073afcf6d",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Christina/Feelings Conversations/Untitled.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Untitled"
}
}
],
"currentTab": 1
}
],
"direction": "vertical"
},
"left": {
"id": "87ef67fcdb70cca7",
"type": "split",
"children": [
{
"id": "51896b8d031f12a7",
"type": "tabs",
"children": [
{
"id": "16c60370ceca95ef",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "67df3fa6c50b7b8f",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "4735c1046deb84d5",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"right": {
"id": "fa8d807905c5f186",
"type": "split",
"children": [
{
"id": "15acd1bca30e4e69",
"type": "tabs",
"children": [
{
"id": "ec633bee723e26ed",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "Christina/Feelings Conversations/Untitled.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks for Untitled"
}
},
{
"id": "76553812ae09d02a",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "Welcome.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links from Welcome"
}
},
{
"id": "a90689d024131f8e",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "b05875d99c295b3e",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "Welcome.md"
},
"icon": "lucide-list",
"title": "Outline of Welcome"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"left-ribbon": {
"hiddenItems": {
"bases:Create new base": false,
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false,
"obsidian-importer:Open Importer": false
}
},
"active": "db667fd073afcf6d",
"lastOpenFiles": [
"Home Setup/Used Ports Synology Server.md",
"Christina/Feelings Conversations/Untitled.md",
"Icon\r",
"Apple Notes/Gift ideas ChristmasBirthday.md",
"Random & To Sort/The Tower.md",
"Christina/Feelings Conversations/Christina Talks - May 10 2025.md",
"Christina/Feelings Conversations",
"Apple Notes/-250.md",
"Apple Notes/- httpswrapbootstrap.comthememonarch-admin-responsive-angularjs….md",
"Apple Notes/______ earli-isasmchdoes lanes lashed mmy..md",
"Apple Notes/Christina 1/Christina Happy Mothers Day!.md",
"Apple Notes/Christina 1/age0-14& !shiny& !shadow& !legendary& !mythical& !lucky& !hatched….md",
"Apple Notes/Christina 1/!+mime& !+togep& !+burm& !+riolu& !+larv& !+chime& !+happ& !+sable….md",
"Apple Notes/Animal Crossing/Ribbot.md",
"attachments/100 1.png",
"Apple Notes/Animal Crossing/Retro Action Items.md",
"Apple Notes/Animal Crossing/Looking for 10NMT per run, OR Real redd artsculptures, OR 500k bells….md",
"Apple Notes/Animal Crossing/-3 Islanders, you will only use 2. -All three have to have a plot….md",
"Christina/Feelings Conversations/Christina Feelings - Dec 6 2026.md",
"Apple Notes/13.99+10.99+10.99+2.79=38.76.md",
"Apple Notes/Greg Feelings - Dec 4 2025.md",
"Christina/Feelings Conversations/Christina Feelings - Dec 2 2025.md",
"Apple Notes/Charlie advocating.md",
"Apple Notes/Most password is.md",
"Apple Notes/I have worked with the people below and they can attest to my work….md",
"Apple Notes/Parking.md",
"attachments/IMG_1115.jpeg",
"Apple Notes/New Note 20.md",
"Apple Notes/age0-120 &!legendary &!mythical &!ultra beasts &!shiny &!4 &!xxl….md",
"attachments/Drawing 2.png",
"Apple Notes/Home events.md",
"attachments/IMG_6415.heic",
"attachments/Drawing 1.png",
"attachments/Drawing.png",
"attachments/Image.png",
"attachments/Feelings Chat 0528.jpeg",
"attachments/Pasted Graphic 2 1.png",
"attachments/mapstogpx202101793729.gpx",
"attachments/FavoriteLists_iTools_202101793649.json",
"attachments/Pasted Graphic 5.png",
"attachments/Pasted Graphic 4.png",
"attachments/iSpooferLicense.txt",
"attachments/Naka.gpx",
"attachments/Pasted Graphic 1.pdf",
"Apple Notes/Milwaukee 2025 Staff Notes",
"Apple Notes/Christina 1"
]
}

View File

@@ -0,0 +1,231 @@
{
"main": {
"id": "65118307aef94695",
"type": "split",
"children": [
{
"id": "fb78540f6b0817b8",
"type": "tabs",
"children": [
{
"id": "6bd06c473a6df9f7",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Random & To Sort/The Tower.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "The Tower"
}
},
{
"id": "db667fd073afcf6d",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Christina/Feelings Conversations/Christina Feelings - Jan 8 2025.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Christina Feelings - Jan 8 2025"
}
}
],
"currentTab": 1
}
],
"direction": "vertical"
},
"left": {
"id": "87ef67fcdb70cca7",
"type": "split",
"children": [
{
"id": "51896b8d031f12a7",
"type": "tabs",
"children": [
{
"id": "16c60370ceca95ef",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "67df3fa6c50b7b8f",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "4735c1046deb84d5",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"right": {
"id": "fa8d807905c5f186",
"type": "split",
"children": [
{
"id": "15acd1bca30e4e69",
"type": "tabs",
"children": [
{
"id": "ec633bee723e26ed",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "Christina/Feelings Conversations/Christina Feelings - Jan 8 2025.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks for Christina Feelings - Jan 8 2025"
}
},
{
"id": "76553812ae09d02a",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "Welcome.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links from Welcome"
}
},
{
"id": "a90689d024131f8e",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "b05875d99c295b3e",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "Welcome.md"
},
"icon": "lucide-list",
"title": "Outline of Welcome"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"left-ribbon": {
"hiddenItems": {
"bases:Create new base": false,
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false,
"obsidian-importer:Open Importer": false
}
},
"active": "db667fd073afcf6d",
"lastOpenFiles": [
"Home Setup/Used Ports Synology Server.md",
"Christina/Feelings Conversations/Christina Feelings - Jan 8 2025.md",
"Icon\r",
"Apple Notes/Gift ideas ChristmasBirthday.md",
"Random & To Sort/The Tower.md",
"Christina/Feelings Conversations/Christina Talks - May 10 2025.md",
"Christina/Feelings Conversations",
"Apple Notes/-250.md",
"Apple Notes/- httpswrapbootstrap.comthememonarch-admin-responsive-angularjs….md",
"Apple Notes/______ earli-isasmchdoes lanes lashed mmy..md",
"Apple Notes/Christina 1/Christina Happy Mothers Day!.md",
"Apple Notes/Christina 1/age0-14& !shiny& !shadow& !legendary& !mythical& !lucky& !hatched….md",
"Apple Notes/Christina 1/!+mime& !+togep& !+burm& !+riolu& !+larv& !+chime& !+happ& !+sable….md",
"Apple Notes/Animal Crossing/Ribbot.md",
"attachments/100 1.png",
"Apple Notes/Animal Crossing/Retro Action Items.md",
"Apple Notes/Animal Crossing/Looking for 10NMT per run, OR Real redd artsculptures, OR 500k bells….md",
"Apple Notes/Animal Crossing/-3 Islanders, you will only use 2. -All three have to have a plot….md",
"Christina/Feelings Conversations/Christina Feelings - Dec 6 2026.md",
"Apple Notes/13.99+10.99+10.99+2.79=38.76.md",
"Apple Notes/Greg Feelings - Dec 4 2025.md",
"Christina/Feelings Conversations/Christina Feelings - Dec 2 2025.md",
"Apple Notes/Charlie advocating.md",
"Apple Notes/Most password is.md",
"Apple Notes/I have worked with the people below and they can attest to my work….md",
"Apple Notes/Parking.md",
"attachments/IMG_1115.jpeg",
"Apple Notes/New Note 20.md",
"Apple Notes/age0-120 &!legendary &!mythical &!ultra beasts &!shiny &!4 &!xxl….md",
"attachments/Drawing 2.png",
"Apple Notes/Home events.md",
"attachments/IMG_6415.heic",
"attachments/Drawing 1.png",
"attachments/Drawing.png",
"attachments/Image.png",
"attachments/Feelings Chat 0528.jpeg",
"attachments/Pasted Graphic 2 1.png",
"attachments/mapstogpx202101793729.gpx",
"attachments/FavoriteLists_iTools_202101793649.json",
"attachments/Pasted Graphic 5.png",
"attachments/Pasted Graphic 4.png",
"attachments/iSpooferLicense.txt",
"attachments/Naka.gpx",
"attachments/Pasted Graphic 1.pdf",
"Apple Notes/Milwaukee 2025 Staff Notes",
"Apple Notes/Christina 1"
]
}

View File

@@ -0,0 +1,231 @@
{
"main": {
"id": "65118307aef94695",
"type": "split",
"children": [
{
"id": "fb78540f6b0817b8",
"type": "tabs",
"children": [
{
"id": "6bd06c473a6df9f7",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Random & To Sort/The Tower.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "The Tower"
}
},
{
"id": "db667fd073afcf6d",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Christina/Feelings Conversations/Christina Feelings - Jan 8 2026.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Christina Feelings - Jan 8 2026"
}
}
],
"currentTab": 1
}
],
"direction": "vertical"
},
"left": {
"id": "87ef67fcdb70cca7",
"type": "split",
"children": [
{
"id": "51896b8d031f12a7",
"type": "tabs",
"children": [
{
"id": "16c60370ceca95ef",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "67df3fa6c50b7b8f",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "4735c1046deb84d5",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"right": {
"id": "fa8d807905c5f186",
"type": "split",
"children": [
{
"id": "15acd1bca30e4e69",
"type": "tabs",
"children": [
{
"id": "ec633bee723e26ed",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "Christina/Feelings Conversations/Christina Feelings - Jan 8 2026.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks for Christina Feelings - Jan 8 2026"
}
},
{
"id": "76553812ae09d02a",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "Welcome.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links from Welcome"
}
},
{
"id": "a90689d024131f8e",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "b05875d99c295b3e",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "Welcome.md"
},
"icon": "lucide-list",
"title": "Outline of Welcome"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"left-ribbon": {
"hiddenItems": {
"bases:Create new base": false,
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false,
"obsidian-importer:Open Importer": false
}
},
"active": "db667fd073afcf6d",
"lastOpenFiles": [
"Home Setup/Used Ports Synology Server.md",
"Christina/Feelings Conversations/Christina Feelings - Jan 8 2026.md",
"Icon\r",
"Apple Notes/Gift ideas ChristmasBirthday.md",
"Random & To Sort/The Tower.md",
"Christina/Feelings Conversations/Christina Talks - May 10 2025.md",
"Christina/Feelings Conversations",
"Apple Notes/-250.md",
"Apple Notes/- httpswrapbootstrap.comthememonarch-admin-responsive-angularjs….md",
"Apple Notes/______ earli-isasmchdoes lanes lashed mmy..md",
"Apple Notes/Christina 1/Christina Happy Mothers Day!.md",
"Apple Notes/Christina 1/age0-14& !shiny& !shadow& !legendary& !mythical& !lucky& !hatched….md",
"Apple Notes/Christina 1/!+mime& !+togep& !+burm& !+riolu& !+larv& !+chime& !+happ& !+sable….md",
"Apple Notes/Animal Crossing/Ribbot.md",
"attachments/100 1.png",
"Apple Notes/Animal Crossing/Retro Action Items.md",
"Apple Notes/Animal Crossing/Looking for 10NMT per run, OR Real redd artsculptures, OR 500k bells….md",
"Apple Notes/Animal Crossing/-3 Islanders, you will only use 2. -All three have to have a plot….md",
"Christina/Feelings Conversations/Christina Feelings - Dec 6 2026.md",
"Apple Notes/13.99+10.99+10.99+2.79=38.76.md",
"Apple Notes/Greg Feelings - Dec 4 2025.md",
"Christina/Feelings Conversations/Christina Feelings - Dec 2 2025.md",
"Apple Notes/Charlie advocating.md",
"Apple Notes/Most password is.md",
"Apple Notes/I have worked with the people below and they can attest to my work….md",
"Apple Notes/Parking.md",
"attachments/IMG_1115.jpeg",
"Apple Notes/New Note 20.md",
"Apple Notes/age0-120 &!legendary &!mythical &!ultra beasts &!shiny &!4 &!xxl….md",
"attachments/Drawing 2.png",
"Apple Notes/Home events.md",
"attachments/IMG_6415.heic",
"attachments/Drawing 1.png",
"attachments/Drawing.png",
"attachments/Image.png",
"attachments/Feelings Chat 0528.jpeg",
"attachments/Pasted Graphic 2 1.png",
"attachments/mapstogpx202101793729.gpx",
"attachments/FavoriteLists_iTools_202101793649.json",
"attachments/Pasted Graphic 5.png",
"attachments/Pasted Graphic 4.png",
"attachments/iSpooferLicense.txt",
"attachments/Naka.gpx",
"attachments/Pasted Graphic 1.pdf",
"Apple Notes/Milwaukee 2025 Staff Notes",
"Apple Notes/Christina 1"
]
}

View File

@@ -0,0 +1,231 @@
{
"main": {
"id": "65118307aef94695",
"type": "split",
"children": [
{
"id": "fb78540f6b0817b8",
"type": "tabs",
"children": [
{
"id": "6bd06c473a6df9f7",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Random & To Sort/The Tower.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "The Tower"
}
},
{
"id": "db667fd073afcf6d",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Christina/Feelings Conversations/Untitled.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Untitled"
}
}
],
"currentTab": 1
}
],
"direction": "vertical"
},
"left": {
"id": "87ef67fcdb70cca7",
"type": "split",
"children": [
{
"id": "51896b8d031f12a7",
"type": "tabs",
"children": [
{
"id": "16c60370ceca95ef",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "67df3fa6c50b7b8f",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "4735c1046deb84d5",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"right": {
"id": "fa8d807905c5f186",
"type": "split",
"children": [
{
"id": "15acd1bca30e4e69",
"type": "tabs",
"children": [
{
"id": "ec633bee723e26ed",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "Christina/Feelings Conversations/Untitled.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks for Untitled"
}
},
{
"id": "76553812ae09d02a",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "Welcome.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links from Welcome"
}
},
{
"id": "a90689d024131f8e",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "b05875d99c295b3e",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "Welcome.md"
},
"icon": "lucide-list",
"title": "Outline of Welcome"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"left-ribbon": {
"hiddenItems": {
"bases:Create new base": false,
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false,
"obsidian-importer:Open Importer": false
}
},
"active": "db667fd073afcf6d",
"lastOpenFiles": [
"Christina/Feelings Conversations/Christina Feelings - Jan 8 2026.md",
"Christina/Feelings Conversations/Untitled.md",
"Home Setup/Used Ports Synology Server.md",
"Icon\r",
"Apple Notes/Gift ideas ChristmasBirthday.md",
"Random & To Sort/The Tower.md",
"Christina/Feelings Conversations/Christina Talks - May 10 2025.md",
"Christina/Feelings Conversations",
"Apple Notes/-250.md",
"Apple Notes/- httpswrapbootstrap.comthememonarch-admin-responsive-angularjs….md",
"Apple Notes/______ earli-isasmchdoes lanes lashed mmy..md",
"Apple Notes/Christina 1/Christina Happy Mothers Day!.md",
"Apple Notes/Christina 1/age0-14& !shiny& !shadow& !legendary& !mythical& !lucky& !hatched….md",
"Apple Notes/Christina 1/!+mime& !+togep& !+burm& !+riolu& !+larv& !+chime& !+happ& !+sable….md",
"Apple Notes/Animal Crossing/Ribbot.md",
"attachments/100 1.png",
"Apple Notes/Animal Crossing/Retro Action Items.md",
"Apple Notes/Animal Crossing/Looking for 10NMT per run, OR Real redd artsculptures, OR 500k bells….md",
"Apple Notes/Animal Crossing/-3 Islanders, you will only use 2. -All three have to have a plot….md",
"Christina/Feelings Conversations/Christina Feelings - Dec 6 2026.md",
"Apple Notes/13.99+10.99+10.99+2.79=38.76.md",
"Apple Notes/Greg Feelings - Dec 4 2025.md",
"Christina/Feelings Conversations/Christina Feelings - Dec 2 2025.md",
"Apple Notes/Charlie advocating.md",
"Apple Notes/Most password is.md",
"Apple Notes/I have worked with the people below and they can attest to my work….md",
"Apple Notes/Parking.md",
"attachments/IMG_1115.jpeg",
"Apple Notes/New Note 20.md",
"Apple Notes/age0-120 &!legendary &!mythical &!ultra beasts &!shiny &!4 &!xxl….md",
"attachments/Drawing 2.png",
"attachments/IMG_6415.heic",
"attachments/Drawing 1.png",
"attachments/Drawing.png",
"attachments/Image.png",
"attachments/Feelings Chat 0528.jpeg",
"attachments/Pasted Graphic 2 1.png",
"attachments/mapstogpx202101793729.gpx",
"attachments/FavoriteLists_iTools_202101793649.json",
"attachments/Pasted Graphic 5.png",
"attachments/Pasted Graphic 4.png",
"attachments/iSpooferLicense.txt",
"attachments/Naka.gpx",
"attachments/Pasted Graphic 1.pdf",
"Apple Notes/Milwaukee 2025 Staff Notes",
"Apple Notes/Christina 1"
]
}

View File

@@ -0,0 +1,231 @@
{
"main": {
"id": "65118307aef94695",
"type": "split",
"children": [
{
"id": "fb78540f6b0817b8",
"type": "tabs",
"children": [
{
"id": "6bd06c473a6df9f7",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Random & To Sort/The Tower.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "The Tower"
}
},
{
"id": "db667fd073afcf6d",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Christina/Feelings Conversations/Christina Feelings - Dec 11 2025.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Christina Feelings - Dec 11 2025"
}
}
],
"currentTab": 1
}
],
"direction": "vertical"
},
"left": {
"id": "87ef67fcdb70cca7",
"type": "split",
"children": [
{
"id": "51896b8d031f12a7",
"type": "tabs",
"children": [
{
"id": "16c60370ceca95ef",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "67df3fa6c50b7b8f",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "4735c1046deb84d5",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"right": {
"id": "fa8d807905c5f186",
"type": "split",
"children": [
{
"id": "15acd1bca30e4e69",
"type": "tabs",
"children": [
{
"id": "ec633bee723e26ed",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "Christina/Feelings Conversations/Christina Feelings - Dec 11 2025.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks for Christina Feelings - Dec 11 2025"
}
},
{
"id": "76553812ae09d02a",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "Welcome.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links from Welcome"
}
},
{
"id": "a90689d024131f8e",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "b05875d99c295b3e",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "Welcome.md"
},
"icon": "lucide-list",
"title": "Outline of Welcome"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"left-ribbon": {
"hiddenItems": {
"bases:Create new base": false,
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false,
"obsidian-importer:Open Importer": false
}
},
"active": "db667fd073afcf6d",
"lastOpenFiles": [
"Christina/Feelings Conversations/Christina Feelings - Jan 8 2026.md",
"Christina/Feelings Conversations/Christina Feelings - Dec 11 2025.md",
"Home Setup/Used Ports Synology Server.md",
"Icon\r",
"Apple Notes/Gift ideas ChristmasBirthday.md",
"Random & To Sort/The Tower.md",
"Christina/Feelings Conversations/Christina Talks - May 10 2025.md",
"Christina/Feelings Conversations",
"Apple Notes/-250.md",
"Apple Notes/- httpswrapbootstrap.comthememonarch-admin-responsive-angularjs….md",
"Apple Notes/______ earli-isasmchdoes lanes lashed mmy..md",
"Apple Notes/Christina 1/Christina Happy Mothers Day!.md",
"Apple Notes/Christina 1/age0-14& !shiny& !shadow& !legendary& !mythical& !lucky& !hatched….md",
"Apple Notes/Christina 1/!+mime& !+togep& !+burm& !+riolu& !+larv& !+chime& !+happ& !+sable….md",
"Apple Notes/Animal Crossing/Ribbot.md",
"attachments/100 1.png",
"Apple Notes/Animal Crossing/Retro Action Items.md",
"Apple Notes/Animal Crossing/Looking for 10NMT per run, OR Real redd artsculptures, OR 500k bells….md",
"Apple Notes/Animal Crossing/-3 Islanders, you will only use 2. -All three have to have a plot….md",
"Christina/Feelings Conversations/Christina Feelings - Dec 6 2026.md",
"Apple Notes/13.99+10.99+10.99+2.79=38.76.md",
"Apple Notes/Greg Feelings - Dec 4 2025.md",
"Christina/Feelings Conversations/Christina Feelings - Dec 2 2025.md",
"Apple Notes/Charlie advocating.md",
"Apple Notes/Most password is.md",
"Apple Notes/I have worked with the people below and they can attest to my work….md",
"Apple Notes/Parking.md",
"attachments/IMG_1115.jpeg",
"Apple Notes/New Note 20.md",
"Apple Notes/age0-120 &!legendary &!mythical &!ultra beasts &!shiny &!4 &!xxl….md",
"attachments/Drawing 2.png",
"attachments/IMG_6415.heic",
"attachments/Drawing 1.png",
"attachments/Drawing.png",
"attachments/Image.png",
"attachments/Feelings Chat 0528.jpeg",
"attachments/Pasted Graphic 2 1.png",
"attachments/mapstogpx202101793729.gpx",
"attachments/FavoriteLists_iTools_202101793649.json",
"attachments/Pasted Graphic 5.png",
"attachments/Pasted Graphic 4.png",
"attachments/iSpooferLicense.txt",
"attachments/Naka.gpx",
"attachments/Pasted Graphic 1.pdf",
"Apple Notes/Milwaukee 2025 Staff Notes",
"Apple Notes/Christina 1"
]
}

View File

@@ -0,0 +1,228 @@
{
"main": {
"id": "65118307aef94695",
"type": "split",
"children": [
{
"id": "fb78540f6b0817b8",
"type": "tabs",
"children": [
{
"id": "6bd06c473a6df9f7",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "Random & To Sort/The Tower.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "The Tower"
}
},
{
"id": "db667fd073afcf6d",
"type": "leaf",
"state": {
"type": "release-notes",
"state": {
"currentVersion": "1.11.4"
},
"icon": "lucide-book-up",
"title": "Release Notes 1.11.4"
}
}
],
"currentTab": 1
}
],
"direction": "vertical"
},
"left": {
"id": "87ef67fcdb70cca7",
"type": "split",
"children": [
{
"id": "51896b8d031f12a7",
"type": "tabs",
"children": [
{
"id": "16c60370ceca95ef",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "67df3fa6c50b7b8f",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "4735c1046deb84d5",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"right": {
"id": "fa8d807905c5f186",
"type": "split",
"children": [
{
"id": "15acd1bca30e4e69",
"type": "tabs",
"children": [
{
"id": "ec633bee723e26ed",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks"
}
},
{
"id": "76553812ae09d02a",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "Welcome.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links from Welcome"
}
},
{
"id": "a90689d024131f8e",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "b05875d99c295b3e",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "Welcome.md"
},
"icon": "lucide-list",
"title": "Outline of Welcome"
}
}
]
}
],
"direction": "horizontal",
"width": 300
},
"left-ribbon": {
"hiddenItems": {
"bases:Create new base": false,
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false,
"obsidian-importer:Open Importer": false
}
},
"active": "16c60370ceca95ef",
"lastOpenFiles": [
"Icon\r",
"Apple Notes/Gift ideas ChristmasBirthday.md",
"Random & To Sort/The Tower.md",
"Christina/Feelings Conversations/Christina Talks - May 10 2025.md",
"Christina/Feelings Conversations",
"Apple Notes/-250.md",
"Apple Notes/- httpswrapbootstrap.comthememonarch-admin-responsive-angularjs….md",
"Apple Notes/______ earli-isasmchdoes lanes lashed mmy..md",
"Apple Notes/Christina 1/Christina Happy Mothers Day!.md",
"Apple Notes/Christina 1/age0-14& !shiny& !shadow& !legendary& !mythical& !lucky& !hatched….md",
"Apple Notes/Christina 1/!+mime& !+togep& !+burm& !+riolu& !+larv& !+chime& !+happ& !+sable….md",
"Apple Notes/Animal Crossing/Ribbot.md",
"attachments/100 1.png",
"Apple Notes/Animal Crossing/Retro Action Items.md",
"Apple Notes/Animal Crossing/Looking for 10NMT per run, OR Real redd artsculptures, OR 500k bells….md",
"Apple Notes/Animal Crossing/-3 Islanders, you will only use 2. -All three have to have a plot….md",
"Christina/Feelings Conversations/Christina Feelings - Dec 6 2026.md",
"Apple Notes/13.99+10.99+10.99+2.79=38.76.md",
"Apple Notes/Greg Feelings - Dec 4 2025.md",
"Christina/Feelings Conversations/Christina Feelings - Dec 2 2025.md",
"Apple Notes/Charlie advocating.md",
"Apple Notes/Most password is.md",
"Apple Notes/I have worked with the people below and they can attest to my work….md",
"Apple Notes/Parking.md",
"attachments/IMG_1115.jpeg",
"Apple Notes/New Note 20.md",
"Apple Notes/age0-120 &!legendary &!mythical &!ultra beasts &!shiny &!4 &!xxl….md",
"attachments/Drawing 2.png",
"Apple Notes/Home events.md",
"Christina/Feelings Conversations/Christina Feelings - Oct 14 2025.md",
"attachments/IMG_6415.heic",
"attachments/Drawing 1.png",
"attachments/Drawing.png",
"attachments/Image.png",
"attachments/Feelings Chat 0528.jpeg",
"attachments/Pasted Graphic 2 1.png",
"attachments/mapstogpx202101793729.gpx",
"attachments/FavoriteLists_iTools_202101793649.json",
"attachments/Pasted Graphic 5.png",
"attachments/Pasted Graphic 4.png",
"attachments/iSpooferLicense.txt",
"attachments/Naka.gpx",
"attachments/Pasted Graphic 1.pdf",
"Apple Notes/Milwaukee 2025 Staff Notes",
"Apple Notes/Christina 1",
"Apple Notes/Christina"
]
}

View File

@@ -0,0 +1,26 @@
#Christina #Feelings - Talk 5/16/24
- [ ] She would appreciate being able to ask questions without me blaming her
- [ ] From earlier today
- [ ] Sent points she thought pertinent to Alices doc apt
- [ ] Was following up on those points
- [ ] In no way was blaming me just looking for information on Alices medical info
- [ ] Turned into her feeling blaming her by saying it wasnt clear to me
- [ ] Dont appreciate the me telling her I gave her all the info and I had no secrets in what I was telling her
- [ ] Doesnt make me feel she can ask questions or follow up on questions that are important to know
- [ ] She feels there continues to be a lot of statements made that make her feel blamed
- [ ] For example today
- [ ] Asked about follow up from questionnaire right away I pulled out phone and said she wasnt clear
- [ ] Feels like garbage trying to figure out information about Alice
- [ ] I deflected saying she didnt give any appreciation
- [ ] Leads her to feel like she cant feel free to ask me about important medical appointments she wasnt a part of
- [ ] Another time feeling blamed today
- [ ] Me saying I was following an example she setup
- [ ] She felt frustrated and let me know she could look at the way she talked to Alice and she could let me know that she would appreciate me waiting giving time to apologize
- [ ] She doesnt feel I acknowledged what she said and saying i was following your example
- [ ] When she tried to bring it back to giving time and space I said she isnt the main character and that she needed to back down and check how others are feeling
- [ ] I needed break if she wouldnt acknowledge what I shared
- [ ] this leads to feel like what she brought up isnt being addressed and then being blamed for why I did it and then being deflected on
- [ ] She feels she was trying to get back to original point that didnt get addressed
- [ ] Feels really frustrating and upsetting to try and talk to me
- [ ] She wants to feel like Im listening g to and trying to understand what Im saying l to me
- [ ] She feels like things she says to me get misinterpreted and that I get defensive but all she is looking for is a little bit of understanding on how she is feeling

View File

@@ -0,0 +1,18 @@
#Christina #Feelings - discussion 8/11/22
- [ ] Feeling really hurt
- [ ] Can be really unkind when Im upset
- [ ] Doesnt feel like there is room for her to make mistakes in our relationship
- [ ] If she does make a mistake I go out of my way to make her feel as shitty as possible
- [ ] Let me know as soon as she was home she was sorry
- [ ] While trying to apologize the facial expressions I was making were upsetting
- [ ] Wasnt trying to minimize on it just get me to look how she was being treated
- [ ] I was trying to show I cared but I wasnt going to do it again - seemed cruel and defeating
- [ ] ESP if Im saying I see how hard its been
- [ ] Why couldnt she have been given a bit of grace?
- [ ] Was a shitty way to act
- [ ] Next morning trying to let her know how she felt while I was with Charlie
- [ ] Onus is on her to initiate the convo
- [ ] Wanted to be heard that she was hurt
- [ ] Something like “hey I fell asleep but would sure like what you have to say”
- [ ] Feels really shitty when she works so hard for our fam and things that she does for me to be thoughtful
- [ ] One mess up and no grace given

View File

@@ -0,0 +1,8 @@
#Christina #Feelings - 2/9/24
- [ ] Really disrespected from this morning
- [ ] Interrupted her multiple times
- [ ] Then when wasnt ready to share what she said bc it was light hearted and funny
- [ ] Took opportunity to talk about it later by asking the kids
- [ ] On top of that not responding to her saying I interrupted you multiple times
- [ ] I used a rude voice
- [ ] Overall this morning really hurt her and made her feel like complete crap

View File

@@ -0,0 +1,6 @@
#Christina #Feelings - 3/20/24
- [ ] Making facial expressions when talking to me
- [ ] Tone of voice as well
- [ ] Not addressing what I am saying before moving on
- [ ] Brought up that it seems what I am saying is minimized and dont feel it was addressed
- [ ] Defensive when talking to her and her not waiting 5 seconds to answer

View File

@@ -0,0 +1,20 @@
| Container | External (We use) | Internal (Docker Uses) | Project |
| ---------------------------------------------- | ------------------------------ | --------------------------------------------- | ----------------------------------------------------------------------- |
| [[Home Setup/Containers/Bookstack\|Bookstack]] | 6875 | 80 | [[Home Setup/Synology/Container Manager Projects/bookstack\|bookstack]] |
| mariadb | | | [[Home Setup/Synology/Container Manager Projects/bookstack\|bookstack]] |
| [[Home Setup/Containers/WikiJS\|WikiJS]]-app | 9999 | 3000 | [[Home Setup/Synology/Container Manager Projects/wikijs\|wikijs]] |
| [[Home Setup/Containers/WikiJS\|WikiJS]]-db | | | [[Home Setup/Synology/Container Manager Projects/wikijs\|wikijs]] |
| [[Speed Test Tracker]] | 8443 (https)<br>8888 (http) | 443/tcp<br>80/tcp | [[speediest-tracker]] |
| [[SABNzbd]] | 37070 | 8085/tcp | [[wirecutter]] |
| [[Radarr]] | 39095 | 7878/tcp | [[wirecutter]] |
| [[Tautulli]] | 38084 | 8181/tcp | [[wirecutter]] |
| [[Overseerr]] | 41001 | 5055/tcp | [[wirecutter]] |
| [[Prowlarr]] | 39696 | 9696/tcp | [[wirecutter]] |
| [[Deluge]] | 39090<br>6881<br>6881<br>39093 | 58846/tcp<br>6881/tcp<br>6881/udp<br>8112/tcp | [[wirecutter]] |
| [[Doplarr]] | | | [[wirecutter]] |
| [[Sonarr]] | 39092 | 8989/tcp | [[wirecutter]] |
| [[Socket Proxy]] | 2375 | 2375/tcp | [[docker-socket-proxy]] |
| [[Invoice Ninja]]-nginx | 8080<br>8081 | 443/tcp<br>80/tcp | [[invoice-ninja]] |
| [[Invoice Ninja]]-app | | | [[invoice-ninja]] |
| [[Invoice Ninja]]-db | | | [[invoice-ninja]] |

View File

@@ -0,0 +1 @@
DÕ!,I,'剹8¡tꤪ>03É4Qêó

View File

@@ -0,0 +1,54 @@
# IgnoreList is a UTF-8 encoded .txt file that helps you specify single files, paths and rules
# for ignoring during the synchronization job. It supports "?" and "*" wildcard symbols.
#
#
# OS generated files #
$RECYCLE.BIN
$Recycle.Bin
System Volume Information
ehthumbs.db
desktop.ini
Thumbs.db
lost+found
.DocumentRevisions-V100
.TemporaryItems
.fseventsd
.icloud
.iCloud
.DS_Store
.DS_Store?
.Spotlight-V100
.Trashes
.Trash-*
.trashed-*
~*
*~
.~lock.*
*.part
*.filepart
.csync_journal.db
.csync_journal.db.tmp
*.swn
*.swp
*.swo
*.crdownload
.@__thumb
.thumbnails
._*
*.tmp
*.tmp.chck
.dropbox
.dropbox.attr
.dropbox.cache
.streams
.caches
.Statuses
.teamdrive
.SynologyWorkingDirectory
@eaDir
@SynoResource
#SynoRecycle
#snapshot
#recycle
.!@#$recycle
DfsrPrivate

View File

@@ -0,0 +1,8 @@
# StreamsList is a UTF-8 encoded .txt file that helps you specify alternate streams,
# xattrs and resource forks white list. It supports "?" and "*" wildcard symbols.
#
#
#
com.apple.metadata:_kMDItemUserTags
com.apple.ResourceFork
com.apple.metadata:kMDItemFinderComment

View File

@@ -0,0 +1,21 @@
<span style="color:#000ff;"><div ng-controller="loginController"></span>
<span style="color:#000ff;"><div ng-switch on="isUserLoggedIn()"></span>
<span style="color:#000ff;"><div ng-switch-when="false"></span>
<span style="color:#000ff;"><div class="jumbotron text-center"></span>
<span style="color:#000ff;"><h1>Login</h1></span>
<span style="color:#000ff;"><form ng-submit="login()"></span>
<span style="color:#000ff;"><input type="text" class="input-medium" placeholder="User Name" ng-model="username"></span>
<span style="color:#000ff;"><input type="password" class="input-medium" placeholder="Password" ng-model="password"></span>
<span style="color:#000ff;"><button id="loginButton" class="btn">Login</button></span>
<span style="color:#000ff;"></form></span>
<span style="color:#000ff;"></div></span>
<span style="color:#000ff;"></div></span>
<span style="color:#000ff;"><div ng-switch-when="true"></span>
<span style="color:#000ff;"><div class="jumbotron text-center"></span>
<span style="color:#000ff;"><h1>Logged In</h1></span>
<span style="color:#000ff;"><div>Welcome, {{user.firstname}} {{user.lastname}}! You are already logged in. Do you want to log out?</div></span>
<span style="color:#000ff;"><button id="loginButton" class="btn" ng-click="logout()">Logout</button></span>
<span style="color:#000ff;"></div></span>
<span style="color:#000ff;"></div></span>
<span style="color:#000ff;"></div></span>
<span style="color:#000ff;"></div></span>

View File

@@ -0,0 +1 @@
!4*&!shiny&!mime&!+togep&age0-320&!burm&!hound&!pinsir&!riolu&!shadow&!larv&!audino&!chime&!happ&!ching&!sable&!&!gible&!klink&!bagon&!.&!snorl&&!tyna&!absol&!mantine&!vull&!mank&!scyth&!paras&!shuck&!beld&!legendary&!mythical&!deino&!+stee&!aero&!&!oma&!hipp&!&!noiba&!goom&!dod&!arch&!shield&!lileep&!scraggy&!feeb&!ditto&!lapr&!mare&!mien&!drud&!ruff&!electab&!dratini&!&!Stant&!cry&!magma&!glace&!munch&!axew&!eleki&!berg&!mr&!karra&!pawn&!mawi&!&!gole&!poli&!timbur&!$&!sand&!panc&!shed&!mudk&!yama&!mag&!&!chatot&!flygo&!costume&!tyranit&!hera&!sewaddle&!tirt&!kanga

View File

@@ -0,0 +1 @@
<span style="font-family:Menlo-Regular;font-size:11pt;color:#191919ff;">"<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>500 Internal Server Error</title> </head><body> <h1>Internal Server Error</h1> <p>The server encountered an internal error or misconfiguration and was unable to complete your request.</p> <p>Please contact the server administrator at [no address given] to inform them of the time this error occurred, and the actions you performed just before this error.</p> <p>More information about this error may be available in the server error log.</p> <hr> <address>Apache/2.4.10 (Ubuntu) Server at time.gregrjacobs.com Port 80</address> </body></html> "</span>

View File

@@ -0,0 +1,13 @@
<p style="text-align:center;margin:0">
</p>
!addcom -cd=5 hai $(eval a={`:fraggi7HAI:`:`<:fraggi7HAI:770683282656329738:>`,};b=decodeURIComponent(`$(querystring)`);(`$(provider)`==`discord`?b.split(` `).map(x=>a[x]||x).join(` `):b).slice(0,400)||`No input!`)
$(eval a=decodeURIComponent(`fraggi7Hai`);`$(provider)`==`discord`&&a==`:fraggi7HAI:`?`<:fraggi7HAI:770705395450511451>`:a)
$(eval a=decodeURIComponent(`fraggi7Hai`);`$(provider)`==`discord`&&a==`fraggi7HAI`?`<:fraggi7SAD:770708500081803264>`: `fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI`)
$(eval a=decodeURIComponent(`:fraggi7Hai:`);`$(provider)`==`discord`&&a==`:fraggi7HAI:`?`<:fraggi7SAD:770708500081803264>`: `fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI fraggi7HAI @$(touser)`)

View File

@@ -0,0 +1 @@
!shiny& !shadow& !legendary& !mythical& !traded& !4*& !.& +skarm, +foon, +basti, +scragg, +ruff, +stunfisk, +licki, +zang, +skrelp, +clau, +bina, +beldum, +chansey, +ferro, +chinc, +maw, +sands, +pancham, +litwick, +sableye, +goomy, +turt, +gible, +deino, +zigzag, +noibat, carv, toget, stunky, unown, mienfoo, +charmand, +emolg, +torch, +bron, +num, +oddis, dweb, +squirtl, +bell, snorlax, +slak, +hitmon, nosepa

View File

@@ -0,0 +1 @@
!spin&!gas&!misd&!ted&!trub&!daru&!osha&!shup&!dusk&!drow&!fril&!see&!sudo&!rat&!drif&!4*&!bunn&!lit&!gulp&!.&!weed&!nido&!+eevee&!woo&!krab&!fletch&!psyd&&!reli&!wing&!&&!chinc&!tenta&!dweb&!hors&!bas&!carv

View File

@@ -0,0 +1,8 @@
<span style="color:#000ff;">//var text = JSON.parse(data);</span>
<span style="color:#000ff;">this.people = data;</span>
<span style="color:#000ff;">alert(this.people[0].first);</span>
<span style="color:#000ff;">});</span>
<span style="color:#000ff;">1t$@fuzzyM@tt3r</span>

View File

@@ -0,0 +1,6 @@
Top light above door,
Door and door lite
California shutters and window above it
Window facing out downstairs
Picture has the door that picture taken

View File

@@ -0,0 +1,2 @@
<span style="color:#000ff;">For August Bill Date</span>
<span style="color:#000ff;">Confirmation of Payment -</span>

View File

@@ -0,0 +1 @@
kobioshi

View File

@@ -0,0 +1,10 @@
(43.0018940, -81.2931301)
(42.9984492, -81.2304985)
(42.9995600, -81.2685309)
**"axios": "^1.8.4",**

View File

@@ -0,0 +1,4 @@
- https://themeforest.net/item/remark-responsive-bootstrap-4-admin-template/11989202?ref=cirvitis
- https://themeforest.net/item/fuse-angularjs-material-design-admin-template/12931855?ref=cirvitis&ref=cirvitis&clickthrough_id=809693669&redirect_back=true
- https://themeforest.net/item/angulr-bootstrap-admin-web-app-with-angularjs/8437259?ref=milkakula
- https://themeforest.net/item/material-design-admin-with-angularjs/13582227?ref=milkakula

View File

@@ -0,0 +1,3 @@
<span style="color:#000ff;">56.50 - Cell BB Classic</span>
<span style="color:#000ff;">598</span>

View File

@@ -0,0 +1,15 @@
1. Archiving Messages works but I do not see a section to view those that have been deleted in the API GET response
2. DONE - Deleting a task we need to see the archived tasks
3. Log when a user has read a message
4. Password protected a folder in photos/scrapbook -saving and update
5. Expenses - Adjust for 3 -4 payers and re-work who is on top (aggregate API call) to reflect this
6. Commenting on journal entries needs to be done
7. Profile field level permissions need to be thought of and implemented
8. Expenses Payments (and possibly the expenses themselves) need to have a proposed status and accepted by the other parent
9. Need permissions to work on the backend and only show items that has the original owner matching or else the people that have read access
10. somehow in the backend we will need to accomplish joining the permissions row to the object to quickly show what the item is in the UI
11. remove requirement for category id on contact saving
12. File Vault permissions needs to be changed over to scrapbook or whatever we want to call it for Photos/Files section as that merged Photos and File Vault
13. Interacting with journal entry that is archived needs to restore it to the active list
14. Interacting with task entry that is archived needs to restore it to the active list
15. TBD

View File

@@ -0,0 +1 @@
0011010000110010

View File

@@ -0,0 +1 @@
Canada

View File

@@ -0,0 +1,10 @@
360 but is 323.88 for the year
500 but would be 480
2 years is 25 percent off which would be
611 but is 489 for two years
887 now it's 710
Coming up in two months
Those were used

View File

@@ -0,0 +1,7 @@
ldn
40k people
older app
Angular Spring Java
ADP
CDK Global
$38-39

View File

@@ -0,0 +1,2 @@
Dominique
Looking for her

View File

@@ -0,0 +1,10 @@
- [ ] 2
- [ ] 6
- [ ] 10
- [ ] 11
- [ ] 14
- [ ] 17
- [ ] 21
- [ ] 22
- [ ] 24
- [ ] 25

View File

@@ -0,0 +1 @@
<span style="color:#000ff;">1440</span>

View File

@@ -0,0 +1 @@
Gerry Degeeere

View File

@@ -0,0 +1,3 @@
**(unknown attachment: com.apple.notes.inlinetextattachment.calculateresult)**
38.76/2 **(unknown attachment: com.apple.notes.inlinetextattachment.calculateresult)**

View File

@@ -0,0 +1,5 @@
143.92
[Cooperators_st_thomas@cooperators.ca](mailto:Cooperators_st_thomas@cooperators.ca)
519.633.5347
Include date of pickup on bill of sale

View File

@@ -0,0 +1 @@
<span style="font-family:LucidaGrande;color:#191919ff;">1436846399</span>

View File

@@ -0,0 +1,7 @@
<span style="color:#000ff;">HS51 - HS22s</span>
<span style="color:#000ff;">250GB hard drives</span>
<span style="color:#000ff;">LTE</span>
<span style="color:#000ff;">Generator without fuel 2-3 days</span>

View File

@@ -0,0 +1,32 @@
136 Seen/Caught
——————————
Can not get yet:
——————————
Region Exclusives:
——————————
#083 - <a href="http://bulbapedia.bulbagarden.net/wiki/Farfetch%27d_(Pok%C3%A9mon)" rel="noopener" class="external-link" target="_blank" style="color:#dca0dff;"><u>Farfetch'd</u></a>
#115 - <a href="http://bulbapedia.bulbagarden.net/wiki/Kangaskhan_(Pok%C3%A9mon)" rel="noopener" class="external-link" target="_blank" style="color:#dca0dff;">Kangaskhan</a>
#122 - <a href="http://bulbapedia.bulbagarden.net/wiki/Mr._Mime_(Pok%C3%A9mon)" rel="noopener" class="external-link" target="_blank" style="color:#dca0dff;"><u>Mr. Mime</u></a>
——————————
Not Yet in Game:
——————————
#144 - <a href="http://bulbapedia.bulbagarden.net/wiki/Articuno_(Pok%C3%A9mon)" rel="noopener" class="external-link" target="_blank" style="color:#dca0dff;"><u>Articuno</u></a>
#145 - <a href="http://bulbapedia.bulbagarden.net/wiki/Zapdos_(Pok%C3%A9mon)" rel="noopener" class="external-link" target="_blank" style="color:#dca0dff;">Zapdos</a>
#146 - <a href="http://bulbapedia.bulbagarden.net/wiki/Moltres_(Pok%C3%A9mon)" rel="noopener" class="external-link" target="_blank" style="color:#dca0dff;"><u>Moltres</u></a>
#132 - <a href="http://bulbapedia.bulbagarden.net/wiki/Ditto_(Pok%C3%A9mon)" rel="noopener" class="external-link" target="_blank" style="color:#dca0dff;">Ditto</a>
#150 - <a href="http://bulbapedia.bulbagarden.net/wiki/Mewtwo_(Pok%C3%A9mon)" rel="noopener" class="external-link" target="_blank" style="color:#dca0dff;">Mewtwo</a>
#151 - <a href="http://bulbapedia.bulbagarden.net/wiki/Mew_(Pok%C3%A9mon)" rel="noopener" class="external-link" target="_blank" style="color:#dca0dff;"><u>Mew</u></a>
——————————
still need
---------------------
#065 - [Alakazam](http://bulbapedia.bulbagarden.net/wiki/Alakazam_(Pok%C3%A9mon)) - 77 / 100 Candies
#105 - <a href="http://bulbapedia.bulbagarden.net/wiki/Marowak_(Pok%C3%A9mon)" rel="noopener" class="external-link" target="_blank" style="color:#dca0dff;">Marowak</a> - 32 / 50 Candies
#139 - <a href="http://bulbapedia.bulbagarden.net/wiki/Omastar_(Pok%C3%A9mon)" rel="noopener" class="external-link" target="_blank" style="color:#dca0dff;"><u>Omastar</u></a> - 36 / 50 Candies
——————————
nice to haves:
——————————
#129 - <a href="http://bulbapedia.bulbagarden.net/wiki/Magikarp_(Pok%C3%A9mon)" rel="noopener" class="external-link" target="_blank" style="color:#dca0dff;"><u>Magikarp</u></a> - 163 Candies

View File

@@ -0,0 +1 @@
<span style="color:#000ff;">playpen high chair fridge</span>

View File

@@ -0,0 +1,8 @@
- [x] 2063 - Need to figure out the find accounts sosl query to add in type of account filter
- [x] 1697 - Attendance form needs to save attendance - DONE tested by Greg
- [ ] 2015 - Need to have apex for renewing membership
- [ ] 1724 - Need to have apex for cancelling membership
- [ ] 1669 - Need to know how to get information on third party account and who they owe money to
- [ ] 1670 - Need to have button on dashboard
- [ ] 2013 - Need button on dashboard
- [ ] 1758 - tell what facilities at a location are for childcare

View File

@@ -0,0 +1 @@
18003871963

View File

@@ -0,0 +1 @@
Homewood - Ask to speak to council right away

View File

@@ -0,0 +1 @@
Scotia fraud dept

View File

@@ -0,0 +1 @@
377WE69ZJRN

View File

@@ -0,0 +1 @@
18554462667

View File

@@ -0,0 +1 @@
<span style="color:#000ff;"><span class=“label label-xs bg-primary”>New</span></span>

View File

@@ -0,0 +1,20 @@
<span style="color:#000ff;">US FEDEX</span>
<span style="color:#000ff;">Austin Te Flintrock Terrance to O Werz</span>
<span style="color:#000ff;">print a PDF Copy</span>
<span style="color:#000ff;">sharon@flintrocksuites.com</span>
<span style="color:#000ff;">cc Mike</span>
<span style="color:#000ff;">greg s, mike and bk, alex</span>
<span style="color:#000ff;">9AM Sydny Time</span>
<span style="color:#000ff;">CANADA FEDEX:</span>
<span style="color:#000ff;">Va</span>
<span style="color:#000ff;">Dealervu</span>
<span style="color:#000ff;">B00tstrap</span>
<span style="color:#000ff;">36859804</span>
<span style="color:#000ff;">85077483</span>

View File

@@ -0,0 +1 @@
<span style="color:#000ff;">————————————</span>

View File

@@ -0,0 +1,12 @@
Traceback (most recent call last):
File "/usr/src/app/pogom/account.py", line 123, in rpc_login_sequence
request.call()
File "/usr/local/lib/python2.7/site-packages/pgoapi/pgoapi.py", line 251, in call
response = request.request(self._api_endpoint, self._req_method_list, self.get_position(), use_dict)
File "/usr/local/lib/python2.7/site-packages/pgoapi/rpc_api.py", line 131, in request
self.request_proto = self.request_proto or self._build_main_request(subrequests, player_position)
File "/usr/local/lib/python2.7/site-packages/pgoapi/rpc_api.py", line 213, in _build_main_request
self._hash_engine.hash(sig.timestamp, request.latitude, request.longitude, request.accuracy, ticket_serialized, sig.session_hash, request.requests)
File "/usr/local/lib/python2.7/site-packages/pgoapi/hash_server.py", line 50, in hash
raise BadHashRequestException("400: Bad request, error: {}".format(response.text))
BadHashRequestException: 400: Bad request, error: Unauthorized

View File

@@ -0,0 +1 @@
# 2037

View File

@@ -0,0 +1,2 @@
Nashville, TN
[37203](tel:37203)

Some files were not shown because too many files have changed in this diff Show More