Initial commit

This commit is contained in:
2026-01-26 16:43:01 -05:00
commit 23cb27503e
39 changed files with 96557 additions and 0 deletions

16
.eslintrc.json Normal file
View File

@@ -0,0 +1,16 @@
{
"env": {
"browser": true,
"es2021": true,
"node": true
},
"extends": "eslint:recommended",
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"rules": {
"no-unused-vars": "warn",
"no-console": "off"
}
}

View File

@@ -0,0 +1,23 @@
---
type: concept
created: ${CURRENT_YEAR}-${CURRENT_MONTH}-${CURRENT_DATE}
tags: []
---
# ${TM_FILENAME_BASE}
## Overview
## Key Ideas
-
## Related Concepts
-
## References
-
---

View File

@@ -0,0 +1,20 @@
---
date: ${CURRENT_YEAR}-${CURRENT_MONTH}-${CURRENT_DATE}
type: daily
---
# ${CURRENT_YEAR}-${CURRENT_MONTH}-${CURRENT_DATE}
## 📝 Notes
## ✅ Completed
## 🎯 Focus
## 🔗 Links
-
---
[[daily-notes]]

View File

@@ -0,0 +1,43 @@
---
name: 🔖 Bookmarklet Request
about: Idea for a new bookmarklet or browser utility
title: "[BOOKMARKLET] "
labels: ["bookmarklet", "enhancement"]
assignees: ""
---
## Purpose
<!-- What should this bookmarklet do? -->
## Use Case
<!-- When/where would you use this? -->
## Behavior
<!-- Describe the expected behavior -->
1.
2.
3.
## Technical Considerations
<!-- Any specific requirements or constraints? -->
- Browser compatibility:
- Required permissions:
- Dependencies: None (bookmarklets should be self-contained)
## Inspiration
<!-- Any existing tools or examples? -->
-
## Implementation Notes
<!-- Technical approach or ideas -->
-

40
.github/ISSUE_TEMPLATE/bug-report.md vendored Normal file
View File

@@ -0,0 +1,40 @@
---
name: 🐛 Bug/Issue
about: Report a problem with code or documentation
title: "[BUG] "
labels: ["bug"]
assignees: ""
---
## Description
<!-- Clear description of the issue -->
## Location
<!-- Where is the problem? -->
- File:
- Section:
## Expected Behavior
<!-- What should happen? -->
## Actual Behavior
<!-- What actually happens? -->
## Steps to Reproduce
1.
2.
3.
## Possible Fix
<!-- If you have ideas on how to fix it -->
## Additional Context
<!-- Screenshots, error messages, etc. -->

View File

@@ -0,0 +1,46 @@
---
name: 🧪 Code Experiment
about: Track a code experiment or prototype
title: "[EXPERIMENT] "
labels: ["experiment", "code"]
assignees: ""
---
## Experiment Goal
<!-- What are you trying to learn or build? -->
## Language/Stack
<!-- Python, JavaScript, TypeScript, etc. -->
-
## Hypothesis
<!-- What do you expect to discover or achieve? -->
## Steps
<!-- Outline the experiment -->
- [ ] Setup/preparation
- [ ] Implementation
- [ ] Testing
- [ ] Documentation
## Location
<!-- Where will this code live? -->
- Path: `/code/scratchpad/`
## Success Criteria
<!-- How will you know if this experiment succeeded? -->
-
## Notes
<!-- Any additional context or considerations -->

36
.github/ISSUE_TEMPLATE/concept-idea.md vendored Normal file
View File

@@ -0,0 +1,36 @@
---
name: 💡 Concept/Idea
about: Capture a new concept or idea to develop
title: "[CONCEPT] "
labels: ["concept", "documentation"]
assignees: ""
---
## Concept Summary
<!-- Brief description of the concept or idea -->
## Context
<!-- Where did this idea come from? What problem does it address? -->
## Related Concepts
<!-- Link to related notes or concepts -->
-
## Actions
<!-- What needs to be done to develop this concept? -->
- [ ] Create initial note in `/docs/fleeting/` or `/docs/concepts/`
- [ ] Research and gather information
- [ ] Link to related concepts
- [ ] Refine and expand
## Resources
<!-- Links, references, inspiration -->
-

16
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,16 @@
name: Choose a template
description: Select the appropriate issue template for your needs
title: ""
labels: []
body:
- type: markdown
attributes:
value: |
## Welcome to Memory Palace Issues!
Choose the template that best fits your need:
- 💡 **Concept/Idea** - Capture new concepts or ideas
- 🔖 **Bookmarklet** - Request or plan a browser utility
- 🧪 **Code Experiment** - Track experiments and prototypes
- 📚 **Project** - Document larger projects
- 🐛 **Bug/Issue** - Report problems

View File

@@ -0,0 +1,55 @@
---
name: 📚 Project Documentation
about: Track documentation for a larger project
title: "[PROJECT] "
labels: ["project", "documentation"]
assignees: ""
---
## Project Name
<!-- What is this project? -->
## Description
<!-- Brief overview -->
## Goals
<!-- What are you trying to accomplish? -->
-
-
## Documentation Structure
- [ ] Create project folder in `/docs/projects/`
- [ ] Project overview/README
- [ ] Technical documentation
- [ ] Decision log
- [ ] Resources and references
## Related Code
<!-- Any code components? -->
- Location:
## Status
<!-- Current state of the project -->
- [ ] Planning
- [ ] In Progress
- [ ] Paused
- [ ] Completed
- [ ] Archived
## Next Steps
- [ ]
- [ ]
## Links & Resources
-

44
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,44 @@
## Description
<!-- Brief description of changes -->
## Type of Change
<!-- Mark the relevant option -->
- [ ] 📝 Documentation (notes, concepts, project docs)
- [ ] 🔖 Bookmarklet (new or updated browser utility)
- [ ] 🧪 Code (scratchpad experiments, templates)
- [ ] 🔧 Configuration (settings, tools, structure)
- [ ] 🐛 Bug fix
## Changes Made
<!-- List specific changes -->
-
-
## Related Issues
<!-- Link any related issues -->
Closes #
## Files Changed
<!-- Key files or areas affected -->
-
## Checklist
- [ ] Changes are documented
- [ ] Code is tested (if applicable)
- [ ] Links are valid
- [ ] Follows project conventions
- [ ] Commits follow conventional format
## Notes
<!-- Any additional context or considerations -->

69
.github/README.md vendored Normal file
View File

@@ -0,0 +1,69 @@
# Memory Palace - GitHub Structure
This directory contains templates and configurations for GitHub.
## 📁 Structure
### `copilot-instructions.md`
GitHub Copilot instructions that guide AI assistance for this workspace. Defines:
- Project overview and structure
- Documentation and code conventions
- File organization and naming
- Commit practices
### `ISSUE_TEMPLATE/`
Issue templates for tracking:
- **concept-idea.md** - New concepts and ideas
- **bookmarklet-request.md** - Browser utility requests
- **code-experiment.md** - Code experiments and prototypes
- **project-documentation.md** - Larger project tracking
- **bug-report.md** - Bug reports and issues
- **config.yml** - Template configuration
### `PULL_REQUEST_TEMPLATE.md`
Template for pull requests (if collaborating or tracking larger changes)
## 🎯 Usage
### For Issues
Use issues to track:
- Ideas you want to develop into notes
- Bookmarklets you want to build
- Code experiments
- Project planning
- Problems to fix
### For Copilot
The instructions file helps Copilot:
- Understand your project structure
- Suggest appropriate file locations
- Follow your naming conventions
- Generate code matching your style
- Create documentation in your format
## 🔧 Customization
Feel free to:
- Add new issue templates for your workflows
- Modify the copilot instructions as your needs evolve
- Create additional GitHub workflows
- Add labels in the repository settings
## 📝 Future Additions
Consider adding:
- `workflows/` - GitHub Actions for automation
- `CODEOWNERS` - If you collaborate with others
- `FUNDING.yml` - If you want to add sponsorship options
- Label definitions and automation

188
.github/copilot-instructions.md vendored Normal file
View File

@@ -0,0 +1,188 @@
# GitHub Copilot Instructions for Memory Palace
## Project Overview
This is a hybrid workspace combining:
- **Documentation**: Obsidian-style knowledge management with wiki-links and backlinks
- **Code Development**: Bookmarklets, scratchpad code, and project prototypes
## Documentation Guidelines
### Writing Style
- 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/`
### Note Structure
```markdown
---
type: concept|project|fleeting
created: YYYY-MM-DD
tags: []
---
# Title
## Overview
Brief summary
## Content
Main content with [[links]]
## Related
- [[other-note]]
```
## Code Development Guidelines
### Bookmarklets (`/code/bookmarklets/`)
- 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
**Conversion Process:**
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
### Scratchpad Code (`/code/scratchpad/`)
- 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
### Code Style
- **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
### Module System
**This project uses ES modules (import/export), not CommonJS (require).**
- 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';`
## File Organization
### When to Create Files
- **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/`
### Naming Conventions
- 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`)
## 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)

38
.gitignore vendored Normal file
View File

@@ -0,0 +1,38 @@
# Operating System
.DS_Store
Thumbs.db
# Editor
.vscode/*
!.vscode/settings.json
!.vscode/extensions.json
*.swp
*.swo
*~
# Node
node_modules/
npm-debug.log
yarn-error.log
# Python
__pycache__/
*.py[cod]
*$py.class
.Python
*.so
.venv/
venv/
ENV/
# Logs
*.log
# Temporary files
*.tmp
.temp/
temp/
# Personal
docs/fleeting/*.md
!docs/fleeting/README.md

11
.vscode/extensions.json vendored Normal file
View File

@@ -0,0 +1,11 @@
{
"recommendations": [
"foam.foam-vscode",
"yzhang.markdown-all-in-one",
"kortina.vscode-markdown-notes",
"gruntfuggly.todo-tree",
"formulahendry.code-runner",
"alefragnani.bookmarks",
"alefragnani.project-manager"
]
}

98
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,98 @@
{
// 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"
],
// 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",
"FIXME",
"NOTE",
"IDEA",
"HACK",
"QUESTION"
],
"todo-tree.highlights.defaultHighlight": {
"icon": "check",
"type": "text",
"foreground": "white",
"background": "green",
"opacity": 50
},
"todo-tree.regex.regex": "(//|#|<!--|;|/\\*|^|^[ \\t]*(-|\\d+.))\\s*($TAGS)",
// Code Runner Configuration
"code-runner.clearPreviousOutput": true,
"code-runner.showExecutionMessage": true,
"code-runner.saveFileBeforeRun": true,
"code-runner.runInTerminal": true,
"code-runner.executorMap": {
"javascript": "node",
"python": "python3",
"typescript": "ts-node"
},
// File Associations
"files.associations": {
"*.md": "markdown"
},
// Search Configuration
"search.exclude": {
"**/node_modules": true,
"**/bower_components": true,
"**/*.code-search": true,
"**/docs/assets/**": true
},
// Auto Save
"files.autoSave": "afterDelay",
"files.autoSaveDelay": 1000,
// Editor Configuration for Markdown
"[markdown]": {
"editor.wordWrap": "on",
"editor.quickSuggestions": {
"comments": "on",
"strings": "on",
"other": "on"
},
"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,
"gitdoc.commitMessageFormat": "docs: ${message}",
"gitdoc.commitValidationLevel": "none",
"gitdoc.autoPush": "off",
// ESLint Configuration
"eslint.validate": [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact"
]
}

113
README.md Normal file
View File

@@ -0,0 +1,113 @@
# Memory Palace
A hybrid workspace combining Obsidian-style knowledge management with code development.
## 📁 Structure
### Documentation (`/docs`)
- **daily/** - Daily notes and journal entries
- **projects/** - Project-specific documentation
- **concepts/** - Evergreen notes and core concepts
- **fleeting/** - Quick captures and temporary notes
- **assets/** - Images, diagrams, and attachments
### Code (`/code`)
- **bookmarklets/** - Browser bookmarklets and utilities
- **scratchpad/** - Experimental code organized by language
- python/
- javascript/
- typescript/
- **templates/** - Reusable code templates
- **utils/** - Build tools and generators (bookmarklet maker, etc.)
## 🚀 Getting Started
### Creating Notes
- Press `Cmd+Shift+P` and type "Foam: Create New Note" to create a linked note
- Use `[[wiki-style links]]` to connect notes
- Daily notes: "Foam: Open Daily Note"
### Linking Notes
- Type `[[` to search and link to other notes
- Right-click on a note to see backlinks
- Use the graph view to visualize connections
### Writing Code
- Navigate to `/code` folders for development
- Use `Cmd+Shift+P` → "Code Runner: Run Code" to execute scripts
- Bookmarks extension: `Cmd+Alt+K` to toggle bookmarks
## 📚 Key Features
### Documentation Features
- **Wiki-style linking** - Connect ideas with `[[links]]`
- **Backlinks** - See which notes reference the current note
- **Graph visualization** - Visual map of your knowledge
- **Daily notes** - Automatic daily note creation
### Code Features
- **Multi-language support** - Python, JavaScript, TypeScript
- **Quick execution** - Run code snippets instantly
- **Code bookmarks** - Mark important code sections
- **Todo tracking** - Track TODOs across all files
## 🎯 Useful Commands
| 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 |
## 🔍 Search Tips
- Use `Cmd+P` for quick file navigation
- `Cmd+Shift+F` for workspace-wide search
- Todo Tree automatically finds TODO, FIXME, NOTE, IDEA tags
## 📝 Note-Taking Tips
1. Use descriptive filenames (automatically slugified)
2. Start with fleeting notes, refine into concepts
3. Link liberally - connections create value
4. Review backlinks regularly to discover patterns
## 💡 Bookmarklet Development
1. Write bookmarklets as regular JavaScript in `/code/bookmarklets/`
2. Run `npm run bookmarklet -- code/bookmarklets/your-file.js`
3. Generator removes comments, minifies, and copies to clipboard
4. Paste into browser bookmark URL field
See [code/bookmarklets/README.md](code/bookmarklets/README.md) for detailed instructions.
## 🔧 Customization
Edit `.vscode/settings.json` to customize:
- Daily note location and format
- Todo tags and highlighting
- Code execution behavior
- Search exclusions
## 📦 Module System
This project uses **ES modules** (import/export), not CommonJS (require):
- `package.json` is configured with `"type": "module"`
- Use `import` and `export` statements in all JavaScript files
- See [code/templates/](code/templates/) for examples
---
_Start exploring by creating your first note or diving into the code folders!_

78
code/README.md Normal file
View File

@@ -0,0 +1,78 @@
# Code Section
Development workspace for bookmarklets, experiments, and scratch code.
## 🔖 Bookmarklets
Browser-based JavaScript utilities. **See [bookmarklets/README.md](bookmarklets/README.md) for full documentation.**
### Quick Start
1. Write regular JavaScript in `bookmarklets/` (use comments, modern syntax)
2. Run: `npm run bookmarklet -- code/bookmarklets/your-file.js`
3. Paste clipboard contents into browser bookmark URL
### Example
```javascript
/**
* My Bookmarklet
* Does something cool
*/
const elements = document.querySelectorAll("a");
elements.forEach((el) => {
el.style.backgroundColor = "yellow";
});
alert(`Highlighted ${elements.length} links!`);
```
The generator automatically removes comments, minifies, and wraps in IIFE format.
## 🛠️ Utils
Build tools and generators:
- **bookmarkletMaker.js** - Converts JS files to bookmarklets
- Removes comments
- Minifies code
- Wraps in `javascript:(function(){...})();` format
- Copies to clipboard
## 🧪 Scratchpad
Experiment with code organized by language. Use this for:
- Testing new ideas
- Prototyping features
- Learning new concepts
- Code snippets for other projects
### Running Code
- **Python:** `Cmd+Shift+P` → "Code Runner: Run Code"
- **JavaScript:** Same as above (uses Node.js)
- **TypeScript:** Install `ts-node` globally first
## 📄 Templates
Reusable code templates and boilerplate:
- **function-template.js** - Function with ES module exports
- **class-template.js** - Class definition with methods
- **module-template.js** - Multi-export module pattern
- Common patterns and structures
**Note:** All templates use ES modules (import/export). See `package.json` with `"type": "module"`.
## 💡 Tips
- Use `// TODO:` comments for tracking work
- Bookmark important code sections
- Test in scratchpad before moving to bookmarklets
- Keep snippets small and focused
---
**Remember:** This is your experimental playground. Break things, learn, iterate!

142
code/bookmarklets/README.md Normal file
View File

@@ -0,0 +1,142 @@
# Bookmarklets
Browser-based JavaScript utilities that run with a single click from your bookmarks bar.
## 🚀 Creating a Bookmarklet
### 1. Write Your JavaScript
Create a new `.js` file in this directory with regular, readable JavaScript:
```javascript
/**
* My Awesome Bookmarklet
* Does something cool on any webpage
*/
// Your code here
const elements = document.querySelectorAll(".some-class");
elements.forEach((el) => {
// Do something
});
alert("Done!");
```
### 2. Generate the Bookmarklet
Run the generator:
```bash
npm run bookmarklet -- code/bookmarklets/your-file.js
```
The generator will:
- ✂️ Remove all comments
- 🗜️ Minify the code
- 📦 Wrap in bookmarklet format
- 📋 Copy to your clipboard
### 3. Install in Browser
1. Create a new bookmark (Cmd+D or Ctrl+D)
2. Paste the clipboard content as the URL
3. Name it and save
4. Click to use!
## 📚 Available Bookmarklets
### [highlight-links.js](highlight-links.js)
Highlights all links on a page in yellow and shows count.
**Generate:** `npm run bookmarklet -- code/bookmarklets/highlight-links.js`
### [example-bookmarklet.js](example-bookmarklet.js)
Example template showing basic structure.
## 💡 Tips
- **Test first**: Try your logic in the browser console before creating bookmarklet
- **Be browser-safe**: Stick to vanilla JS, avoid ES6+ features in production if supporting old browsers
- **Keep it simple**: Bookmarklets should be quick utilities, not full apps
- **Comment generously**: Comments are stripped out, so explain your code
- **Use descriptive names**: Variables and functions will be minified
## 🔧 Bookmarklet Generator
The generator ([code/utils/bookmarkletMaker.js](../utils/bookmarkletMaker.js)) handles:
- Comment removal (single-line `//` and multi-line `/* */`)
- Code minification (whitespace removal, single-line conversion)
- IIFE wrapping with `javascript:` protocol
- Clipboard copying
## 📝 Common Patterns
### Getting Page Info
```javascript
// Current URL
const url = window.location.href;
// Page title
const title = document.title;
// Selected text
const selected = window.getSelection().toString();
```
### Modifying the Page
```javascript
// Find elements
const elements = document.querySelectorAll(".selector");
// Style them
elements.forEach((el) => {
el.style.backgroundColor = "yellow";
});
// Add content
const div = document.createElement("div");
div.textContent = "Hello!";
document.body.appendChild(div);
```
### Opening New Windows
```javascript
// Open in new tab
window.open("https://example.com", "_blank");
// With specific size
window.open("https://example.com", "_blank", "width=800,height=600");
```
### Copying to Clipboard
```javascript
navigator.clipboard
.writeText("text to copy")
.then(() => alert("Copied!"))
.catch((err) => alert("Failed: " + err));
```
## 🐛 Debugging
If your bookmarklet doesn't work:
1. Open browser console (F12)
2. Paste your original code (without `javascript:` wrapper)
3. Debug errors
4. Update the source file
5. Regenerate bookmarklet
## 🔗 Resources
- [Bookmarklet Best Practices](https://en.wikipedia.org/wiki/Bookmarklet)
- [MDN: DOM API](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model)
- [Browser Compatibility](https://caniuse.com/)

View File

@@ -0,0 +1,30 @@
/**
* Example Bookmarklet Template
*
* This is a template for creating browser bookmarklets.
* To use: Wrap in javascript: protocol and minify
*/
(function () {
"use strict";
// Example: Highlight all links on a page
const links = document.querySelectorAll("a");
links.forEach((link) => {
link.style.backgroundColor = "yellow";
link.style.padding = "2px";
});
// Show confirmation
alert(`Highlighted ${links.length} links!`);
})();
/**
* To convert to bookmarklet:
* 1. Minify the code
* 2. Wrap in: javascript:(function(){YOUR_MINIFIED_CODE})();
* 3. Add to browser bookmarks
*
* Example bookmarklet format:
* javascript:(function(){'use strict';const links=document.querySelectorAll('a');links.forEach(link=>{link.style.backgroundColor='yellow';});alert(`Highlighted ${links.length} links!`);})();
*/

View File

@@ -0,0 +1,23 @@
/**
* Highlight Links Bookmarklet
*
* Highlights all links on the current page with a yellow background
* and displays a count of total links found.
*
* Usage: Click the bookmarklet on any webpage
*/
// Find all anchor tags
const links = document.querySelectorAll("a");
// Style each link
links.forEach((link) => {
link.style.backgroundColor = "yellow";
link.style.padding = "2px 4px";
link.style.borderRadius = "3px";
});
// Show result
alert(
`Highlighted ${links.length} link${links.length !== 1 ? "s" : ""} on this page!`,
);

View File

@@ -0,0 +1,110 @@
/*
* This script extracts event data from a table on a webpage and generates an iCalendar (.ics) file for download.
* It looks for a table with specific headers ('event', 'date', 'venue', 'address'), parses the event details,
* and then creates an iCalendar file with the extracted event information. The file is then automatically
* downloaded to the user's device.
*/
javascript: (() => {
function extractEventData() {
let tables = document.querySelectorAll('table');
if (tables.length > 1) {
tables = [tables[0]];
}
const data = [];
tables.forEach(table => {
const headers = [];
const rows = table.querySelectorAll('tr');
const firstRow = rows[0];
firstRow.querySelectorAll('td').forEach(td => {
headers.push(td.textContent.trim().toLowerCase());
});
if (
headers.includes('event') &&
headers.includes('date') &&
headers.includes('venue') &&
headers.includes('address')
) {
Array.from(rows)
.slice(1)
.forEach(row => {
const cells = row.querySelectorAll('td');
const rowData = {};
cells.forEach((cell, j) => {
const header = headers[j];
let cellText = cell.innerHTML
.replace(/<br\s*\/?>/gi, ', ')
.trim();
cellText = cellText.replace(/<\/?[^>]+(>|$)/g, '').trim();
if (header === 'event') {
rowData.event = cellText;
} else if (header === 'date') {
const month = cellText.split(' ')[0];
const year = cellText.split(',')[1].trim();
const startDay = cellText
.split(' ')[1]
.split(cellText.includes(' ') ? ' ' : '')[0]
.trim();
const endDay = cellText
.split(cellText.includes(' ') ? ' ' : '')[1]
.split(',')[0]
.trim();
rowData.startDate = `${month} ${startDay}, ${year}`;
rowData.endDate = `${month} ${endDay}, ${year}`;
} else if (header === 'venue') {
rowData.venue = cellText;
} else if (header === 'location') {
rowData.address = cellText;
}
});
data.push(rowData);
});
}
});
console.log(data);
return data;
}
const data = extractEventData();
function createICal(events) {
let icalContent =
'BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//FragginWagon//International-Championships\n';
events.forEach(event => {
icalContent += 'BEGIN:VEVENT\n';
icalContent += `DTSTART:${new Date(event.startDate).toISOString().replace(/[-:]/g, '').split('.')[0]}Z\n`;
icalContent += `DTEND:${new Date(event.endDate).toISOString().replace(/[-:]/g, '').split('.')[0]}Z\n`;
icalContent += `SUMMARY:${event.event} \n`;
icalContent += `LOCATION:${event.location}\n`;
icalContent += 'END:VEVENT\n';
});
icalContent += 'END:VCALENDAR';
return icalContent;
}
function downloadICal(content, filename) {
const blob = new Blob([content], { type: 'text/calendar' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
}
const newIcalContent = createICal(data);
downloadICal(
newIcalContent,
'play_pokemon_international_championships_events.ics'
);
})();

View File

@@ -0,0 +1,117 @@
/**
*
* This bookmarklet extracts event data from the first four tables on a webpage,
* specifically looking for tables that contain 'date', 'venue', and 'location' headers.
* It processes the event data to identify special events and formats the dates.
* The extracted data is then used to create an iCalendar (.ics) file, which is
* automatically downloaded to the user's device.
*
* Functions:
* - extractEventData: Extracts event data from the first four tables on the webpage.
* - createICal: Creates an iCalendar (.ics) content string from the extracted event data.
* - downloadICal: Initiates the download of the iCalendar (.ics) file with the given content and filename.
*/
javascript: (() => {
function extractEventData() {
let tables = document.querySelectorAll('table');
if (tables.length > 4) {
tables = Array.from(tables).slice(0, 4);
}
const data = [];
tables.forEach(table => {
const headers = [];
const rows = table.querySelectorAll('tr');
const firstRow = rows[0];
firstRow.querySelectorAll('td').forEach(td => {
headers.push(td.textContent.trim().toLowerCase());
});
if (
headers.includes('date') &&
headers.includes('venue') &&
headers.includes('location')
) {
Array.from(rows)
.slice(1)
.forEach(row => {
const cells = row.querySelectorAll('td');
const rowData = {};
if (
Array.from(cells).some(cell =>
cell.querySelector('span[style*="color: #2dc26b"]')
)
) {
rowData.specialEvent = true;
}
cells.forEach((cell, j) => {
const header = headers[j];
let cellText = cell.innerHTML.replace(/<br\s*\/?>/gi, ', ').trim();
cellText = cellText.replace(/<\/?[^>]+(>|$)/g, '').trim();
if (header === 'date') {
const month = cellText.split(' ')[0];
const year = cellText.split(',')[1].trim();
const startDay = cellText
.split(' ')[1]
.split(cellText.includes(' ') ? ' ' : '')[0]
.trim();
const endDay = cellText
.split(cellText.includes(' ') ? ' ' : '')[1]
.split(',')[0]
.trim();
rowData.startDate = `${month} ${startDay}, ${year}`;
rowData.endDate = `${month} ${endDay}, ${year}`;
} else if (header === 'venue') {
rowData.venue = cellText;
} else if (header === 'location') {
rowData.location = cellText;
}
});
data.push(rowData);
});
}
});
return data;
}
const data = extractEventData(tables);
function createICal(events) {
let icalContent =
'BEGIN:VCALENDAR\nVERSION:2.0\nPRODID:-//FragginWagon//P!P //Regional-Special-Championships\n';
events.forEach(event => {
icalContent += 'BEGIN:VEVENT\n';
icalContent += `DTSTART:${new Date(event.startDate).toISOString().replace(/[-:]/g, '').split('.')[0]}Z\n`;
icalContent += `DTEND:${new Date(event.endDate).toISOString().replace(/[-:]/g, '').split('.')[0]}Z\n`;
icalContent += `SUMMARY:${event.specialEvent ? 'Special Event' : 'Regional'} - ${event.venue} \n`;
icalContent += `LOCATION:${event.location}\n`;
icalContent += 'END:VEVENT\n';
});
icalContent += 'END:VCALENDAR';
return icalContent;
}
function downloadICal(content, filename) {
const blob = new Blob([content], { type: 'text/calendar' });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
}
const newIcalContent = createICal(extractEventData());
downloadICal(newIcalContent, 'play_pokemon_regional_special_events.ics');
})();

125
code/junk-drawer/scrape.js Normal file
View File

@@ -0,0 +1,125 @@
/**
* This script scrapes a website for table data using Puppeteer and Cheerio.
* It specifically looks for tables with headers "Date", "Venue", and "Location",
* and extracts the data from these tables.
*
* The script performs the following steps:
* 1. Launches a Puppeteer browser instance.
* 2. Sets the user agent and viewport to mimic a real browser.
* 3. Navigates to the specified URL.
* 4. Simulates human-like interactions (mouse movements and delays).
* 5. Extracts the HTML content of the page.
* 6. Loads the HTML content into Cheerio for parsing.
* 7. Finds all table elements and checks if they contain the headers "Date", "Venue", and "Location".
* 8. Extracts the data from the matching tables and returns it.
*
* @param {string} url - The URL of the website to scrape.
* @returns {Promise<Array<Object>>} - A promise that resolves to an array of objects containing the scraped data.
*
* Example usage:
* const url = 'https://www.pokemon.com/us/play-pokemon/pokemon-events/championship-series/2025/regional-special-championships';
* scrapeWebsite(url)
* .then(data => console.log(data))
* .catch(error => console.error(error));
*
* Required npm packages:
* - puppeteer: ^10.0.0
* - cheerio: ^1.0.0-rc.10
*
* Currently not working due to recaptch on P!P site
*/
const puppeteer = require("puppeteer");
const cheerio = require("cheerio");
async function scrapeWebsite(url) {
// Launch Puppeteer
const browser = await puppeteer.launch({
headless: false, // Run in headless mode
args: [
"--no-sandbox",
"--disable-setuid-sandbox",
"--disable-dev-shm-usage",
"--disable-accelerated-2d-canvas",
"--disable-gpu",
"--window-size=1920x1080",
],
});
const page = await browser.newPage();
// Set user agent to mimic a real browser
await page.setUserAgent(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
);
// Set viewport to mimic a real browser
await page.setViewport({ width: 1920, height: 1080 });
// Navigate to the URL
await page.goto(url, { waitUntil: "networkidle2" });
// Simulate human-like interactions
await page.waitForTimeout(2000); // Wait for 2 seconds
await page.mouse.move(100, 100); // Move mouse to a specific position
await page.mouse.move(200, 200, { steps: 10 }); // Move mouse with steps
await page.waitForTimeout(1000); // Wait for 1 second
// Get the HTML content
const content = await page.content();
await browser.close();
// Load the HTML content into Cheerio
const $ = cheerio.load(content);
// Find all table elements
const tables = $("table");
const data = [];
// Loop through each table
tables.each((index, table) => {
const headers = [];
const rows = $(table).find("tr");
// Check if the first row contains the headers Date, Venue, and Location
const firstRow = rows.first();
firstRow.find("tr").each((i, th) => {
headers.push($(th).text().trim().toLowerCase());
});
if (
headers.includes("date") &&
headers.includes("venue") &&
headers.includes("location")
) {
// Loop through the remaining rows and extract data
rows.slice(1).each((i, row) => {
const cells = $(row).find("td");
const rowData = {};
cells.each((j, cell) => {
const header = headers[j];
const cellText = $(cell).text().trim();
if (header === "date") {
const dates = cellText.split(" - ");
rowData.startDate = dates[0];
rowData.endDate = dates[1] || dates[0];
} else if (header === "venue") {
rowData.venue = cellText;
} else if (header === "location") {
rowData.location = cellText;
}
});
data.push(rowData);
});
}
});
return data;
}
// Example usage
const url =
"https://www.pokemon.com/us/play-pokemon/pokemon-events/championship-series/2025/regional-special-championships";
scrapeWebsite(url)
.then((data) => console.log(data))
.catch((error) => console.error(error));

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,26 @@
/**
* Example JavaScript scratchpad file
*
* Use this area to test JavaScript/Node.js code
* This project uses ES modules (import/export)
*/
// Example imports (uncomment to use)
// import fs from 'fs';
// import path from 'path';
// import { someFunction } from './other-file.js';
function helloWorld() {
console.log("Hello from Memory Palace!");
return "Success";
}
// TODO: Add your experimental code here
// Run the example
const result = helloWorld();
console.log(`Result: ${result}`);
// Export for use in other modules
export { helloWorld };
export default helloWorld;

View File

@@ -0,0 +1,19 @@
#!/usr/bin/env python3
"""
Example Python scratchpad file
Use this area to test Python code, experiment with libraries,
or prototype features for other projects.
"""
def hello_world():
"""Example function"""
print("Hello from Memory Palace!")
return "Success"
# TODO: Add your experimental code here
if __name__ == "__main__":
result = hello_world()
print(f"Result: {result}")

View File

@@ -0,0 +1,43 @@
/**
* Class Template
*
* @class ClassName
* @description Description of what this class does
*/
export class ClassName {
/**
* Create a new instance
* @param {type} param - Description
*/
constructor(param) {
this.param = param;
// TODO: Initialize properties
}
/**
* Method description
* @param {type} arg - Description
* @returns {type} Description
*/
methodName(arg) {
// TODO: Implement method logic
return result;
}
/**
* Static method example
* @param {type} arg - Description
* @returns {type} Description
*/
static staticMethod(arg) {
// TODO: Implement static method
return result;
}
}
// Alternative export:
// export default ClassName;
// Usage example:
// import { ClassName } from './class-template.js';
// const instance = new ClassName(param);

View File

@@ -0,0 +1,16 @@
/**
* Function Template
*
* @param {type} paramName - Description
* @returns {type} Description
*/
export function functionName(paramName) {
// TODO: Implement function logic
return result;
}
// Alternative export styles:
// export default functionName; // Default export
// export { functionName }; // Named export
// export { functionName as myFunction }; // Renamed export

View File

@@ -0,0 +1,51 @@
/**
* Module Template
*
* Example of a utility module with multiple exports
*/
/**
* Function one
* @param {type} param - Description
* @returns {type} Description
*/
export function functionOne(param) {
// Implementation
return result;
}
/**
* Function two
* @param {type} param - Description
* @returns {type} Description
*/
export function functionTwo(param) {
// Implementation
return result;
}
/**
* Constant export
*/
export const CONSTANT_VALUE = "value";
/**
* Object export
*/
export const config = {
option1: true,
option2: "value",
};
// Default export (optional)
export default {
functionOne,
functionTwo,
CONSTANT_VALUE,
config,
};
// Usage examples:
// import { functionOne, functionTwo } from './module-template.js';
// import utils from './module-template.js'; // Default import
// import * as utils from './module-template.js'; // Namespace import

View File

@@ -0,0 +1,106 @@
/**
* Bookmarklet Generator
*
* Converts a regular JavaScript file into a bookmarklet format.
* - Removes all comments (single-line and multi-line)
* - Wraps code in IIFE for bookmarklet format
* - Minifies to a single line
* - Copies to clipboard
*
* Usage:
* node code/utils/bookmarkletMaker.js <path-to-js-file>
* npm run bookmarklet -- <path-to-js-file>
*
* 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";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
/**
* Remove all comments from JavaScript code
* @param {string} code - The JavaScript code
* @returns {string} Code without comments
*/
function removeComments(code) {
// Remove multi-line comments /* ... */
code = code.replace(/\/\*[\s\S]*?\*\//g, "");
// Remove single-line comments //
code = code.replace(/\/\/.*$/gm, "");
return code;
}
/**
* Minify code to a single line
* @param {string} code - The JavaScript code
* @returns {string} Minified 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");
}
/**
* Generate bookmarklet from JavaScript file
* @param {string} filePath - Path to the JavaScript file
* @returns {string} The bookmarklet code
*/
function generateBookmarklet(filePath) {
// Validate file exists
if (!fs.existsSync(filePath)) {
throw new Error(`File not found: ${filePath}`);
}
// Read the JavaScript file
const jsCode = fs.readFileSync(filePath, "utf8");
// Clean and minify
let cleanedCode = removeComments(jsCode);
cleanedCode = minify(cleanedCode);
// Wrap in IIFE and add javascript: protocol
const bookmarklet = `javascript:(function(){${cleanedCode}})();`;
return bookmarklet;
}
// Main execution
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");
process.exit(1);
}
const bookmarklet = generateBookmarklet(filePath);
const fileName = path.basename(filePath);
// Copy to clipboard
clipboardy.writeSync(bookmarklet);
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");
} catch (error) {
console.error("❌ Error:", error.message);
process.exit(1);
}

53
docs/README.md Normal file
View File

@@ -0,0 +1,53 @@
# Documentation Hub
Welcome to your knowledge base! This is your personal wiki for capturing ideas, projects, and concepts.
## 📖 How to Use
### Daily Notes
Capture thoughts, tasks, and reflections each day. These form the foundation of your memory palace.
**Quick Start:** Use "Foam: Open Daily Note" command
### Projects
Document ongoing projects, including goals, progress, and decisions.
### Concepts
Evergreen notes on core ideas, principles, and frameworks. These should be:
- Atomic (one concept per note)
- Concept-oriented (not task or project-specific)
- Densely linked
### Fleeting Notes
Quick captures that need to be processed later. Review regularly and:
- Elaborate into concept notes
- Move to project documentation
- Archive or delete
## 🔗 Linking Strategy
Use `[[wiki-links]]` to connect ideas:
- Link to related concepts
- Reference projects
- Connect daily notes
- Build a web of knowledge
## 📋 Templates
Create templates in your notes for consistency:
- Meeting notes
- Project kickoffs
- Book/article notes
- Decision logs
---
**Tip:** Start with fleeting notes, let patterns emerge, then organize into concepts and projects.

16
docs/fleeting/README.md Normal file
View File

@@ -0,0 +1,16 @@
# Fleeting Notes
Quick captures and temporary notes go here.
Use this folder for:
- Random thoughts
- Quick ideas
- Meeting jots
- Things to process later
**Tip:** Review this folder weekly and either:
- Elaborate into concept notes
- Move to project docs
- Archive or delete

0
docs/projects/README.md Normal file
View File

View File

@@ -0,0 +1,56 @@
# Paperlyte Project
Documentation and development for Paperlyte-related projects and features.
## 📁 Project Structure
### [iPhone Media Playback When Plugged In](iPhone_Media_Playback_When_Plugged_In/)
iOS automation for switching media playback and volume when device is plugged in.
**Contents:**
- iOS Automation configuration
- iOS Shortcut setup for media bridge switching
- Volume control automation
**Status:** ⚙️ In Progress
---
## 🎯 About Paperlyte
<!-- Add project overview here -->
## 📋 Projects Overview
| Project | Status | Description |
| --------------------------------------------------------------- | -------------- | ------------------------------------------- |
| [iPhone Media Playback](iPhone_Media_Playback_When_Plugged_In/) | ⚙️ In Progress | Automated media switching on device plug-in |
## 🚀 Getting Started
<!-- Add general setup instructions for Paperlyte development -->
## 📝 Adding New Projects
When creating a new project folder:
1. Create folder in `/docs/projects/paperlyte/`
2. Add project README inside the folder
3. Update this README:
- Add folder to **Project Structure** section
- Add entry to **Projects Overview** table
- Update any relevant links or references
## 🔗 Related Resources
<!-- Add links to related documentation, repositories, tools, etc. -->
## 📅 Project Timeline
<!-- Track major milestones and deadlines -->
---
**Last Updated:** January 20, 2026

View File

@@ -0,0 +1,94 @@
# iPhone Media Playback When Plugged In
iOS automation project for automatically switching media playback and adjusting volume when iPhone is plugged into power.
## 📸 Documentation
### iOS Automation Setup
![iOS Automation - Run iOS Shortcut to switch media and turn volume up](iOS%20Automation%20-%20Run%20iOS%20Shortcut%20to%20switch%20media%20and%20turn%20volume%20up.PNG)
Configuration for iOS Automation that triggers when device is connected to power.
### iOS Shortcut
![iOS Shortcut - Switch media to bridge and volume to 100](iOS%20Shortcut%20-%20Switch%20media%20to%20bridge%20and%20volume%20to%20100.PNG)
Shortcut configuration that:
- Checks if audio bridge device is available/connected
- Switches media playback to audio bridge (if available)
- Sets volume to 100%
## 🎯 Purpose
Automatically configure iPhone media settings when plugged in for optimal audio playback through external speakers/bridge. Only switches output if the target device is physically connected and available.
## ⚙️ Setup
1. **Create iOS Shortcut:**
- Open Shortcuts app on iOS
- Create new shortcut with the following actions:
1. **Get Available Playback Destinations** (or **Get Audio Output**)
2. **If** [Playback Destinations] **contains** [Your Audio Bridge Name]
3. **Set Playback Destination** → Select your audio bridge
4. **Set Volume** → 100%
5. **End If**
- Name it appropriately (e.g., "Media Bridge Setup")
2. **Configure Automation:**
- Open Settings → Shortcuts → Automation
- Create new automation with "Charger" trigger
- Select "Is Connected" condition
- Add action to run the shortcut created above
- Disable "Ask Before Running" for automatic execution
## 🔧 Requirements
- iOS device
- Shortcuts app (built-in on iOS)
- Audio bridge/external speaker system
## <20> Shortcut Logic
```
Get Available Playback Destinations
IF [Playback Destinations] [contains] [Your Audio Bridge]
Set Playback Destination → [Your Audio Bridge]
Set Volume → 100%
END IF
```
**Alternative approach using text matching:**
```
Get Audio Output
Get Text from [Audio Output]
IF [Text] [contains] [Bridge Name]
Set Playback Destination → [Your Audio Bridge]
Set Volume → 100%
END IF
```
## 📝 Notes
- Automation runs automatically when device is plugged in
- Shortcut checks for device availability before attempting to switch
- Volume is set to maximum (100%) - adjust in shortcut if needed
- If audio bridge is not available/connected, shortcut will do nothing (silent fail)
- Media output device name can be customized in the conditional check
- No error messages or notifications if device unavailable (prevents interruptions)
## 🚀 Future Enhancements
- [ ] Add volume level customization based on time of day
- [ ] Include notification when automation runs successfully
- [ ] Support for different audio devices based on location
- [ ] Add volume fade-in instead of instant 100%
- [x] Check device availability before switching (implemented)
- [ ] Add fallback device if primary bridge unavailable
---
**Status:** ⚙️ In Progress
**Last Updated:** January 20, 2026

1400
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

23
package.json Normal file
View File

@@ -0,0 +1,23 @@
{
"name": "memorypalace",
"version": "1.0.0",
"description": "A hybrid workspace combining Obsidian-style knowledge management with code development.",
"main": "index.js",
"directories": {
"doc": "docs"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"bookmarklet": "node code/utils/bookmarkletMaker.js"
},
"keywords": [],
"author": "FragginWagon <greg.r.jacobs@gmail.com> (http://binarywasteland.com/)",
"license": "ISC",
"type": "module",
"devDependencies": {
"eslint": "^9.39.2"
},
"dependencies": {
"clipboardy": "^5.0.2"
}
}