This project uses bd (beads) for issue tracking. Run bd onboard to get started.
bd ready # Find available work
bd show <id> # View issue details
bd update <id> --claim # Claim work atomically
bd close <id> # Complete work
bd dolt push # Push beads data to remoteALWAYS use non-interactive flags with file operations to avoid hanging on confirmation prompts.
Shell commands like cp, mv, and rm may be aliased to include -i (interactive) mode on some systems, causing the agent to hang indefinitely waiting for y/n input.
Use these forms instead:
# Force overwrite without prompting
cp -f source dest # NOT: cp source dest
mv -f source dest # NOT: mv source dest
rm -f file # NOT: rm file
# For recursive operations
rm -rf directory # NOT: rm -r directory
cp -rf source dest # NOT: cp -r source destOther commands that may prompt:
scp- use-o BatchMode=yesfor non-interactivessh- use-o BatchMode=yesto fail instead of promptingapt-get- use-yflagbrew- useHOMEBREW_NO_AUTO_UPDATE=1env var
IMPORTANT: This project uses bd (beads) for ALL issue tracking. Do NOT use markdown TODOs, task lists, or other tracking methods.
- Dependency-aware: Track blockers and relationships between issues
- Version-controlled: Built on Dolt with cell-level merge
- Agent-optimized: JSON output, ready work detection, discovered-from links
- Prevents duplicate tracking systems and confusion
Check for ready work:
bd ready --jsonCreate new issues:
bd create "Issue title" --description="Detailed context" -t bug|feature|task -p 0-4 --json
bd create "Issue title" --description="What this issue is about" -p 1 --deps discovered-from:bd-123 --jsonClaim and update:
bd update <id> --claim --json
bd update bd-42 --priority 1 --jsonComplete work:
bd close bd-42 --reason "Completed" --jsonbug- Something brokenfeature- New functionalitytask- Work item (tests, docs, refactoring)epic- Large feature with subtaskschore- Maintenance (dependencies, tooling)
0- Critical (security, data loss, broken builds)1- High (major features, important bugs)2- Medium (default, nice-to-have)3- Low (polish, optimization)4- Backlog (future ideas)
- Check ready work:
bd readyshows unblocked issues - Claim your task atomically:
bd update <id> --claim - Work on it: Implement, test, document
- Discover new work? Create linked issue:
bd create "Found bug" --description="Details about what was found" -p 1 --deps discovered-from:<parent-id>
- Complete:
bd close <id> --reason "Done"
bd automatically syncs with git:
- Exports to
.beads/issues.jsonlafter changes (5s debounce) - Imports from JSONL when newer (e.g., after
git pull) - No manual export/import needed!
- ✅ Use bd for ALL task tracking
- ✅ Always use
--jsonflag for programmatic use - ✅ Link discovered work with
discovered-fromdependencies - ✅ Check
bd readybefore asking "what should I work on?" - ❌ Do NOT create markdown TODO lists
- ❌ Do NOT use external issue trackers
- ❌ Do NOT duplicate tracking systems
For more details, see README.md and docs/QUICKSTART.md.
This is The Learning Corner - an 11ty (Eleventy) static site blog with the following structure:
blog/
├── _includes/ # Nunjucks templates
│ ├── layout.njk # Base layout (header, theme toggle, analytics)
│ └── post-layout.njk # Post-specific layout wrapper
├── _11ty/ # Custom 11ty plugins
│ └── plantuml.js # PlantUML diagram generation plugin
├── posts/ # Blog posts (Markdown files)
│ ├── *.md # Individual posts
│ └── */ # Posts with assets (images, diagrams)
├── assets/ # Static assets (favicons, images)
├── css/ # Generated Tailwind CSS output
├── admin/ # Decap CMS configuration
├── _site/ # Build output (generated, not committed)
├── eleventy.config.js # 11ty configuration
├── tailwind.config.js # Tailwind CSS configuration
├── input.css # Tailwind source styles
├── package.json # Node dependencies
├── dockerfile # Multi-stage Docker build
└── nginx.conf # Nginx server configuration
- Static Site Generator: 11ty (Eleventy) v3.0
- Templating: Nunjucks (.njk)
- Styling: Tailwind CSS v4.0
- Content: Markdown with YAML frontmatter
- Diagrams: PlantUML (via custom plugin)
- CMS: Decap CMS (Git-based)
- Build: Docker multi-stage build
- Deployment: GitHub Actions → GHCR → Hetzner Cloud server
- Node.js 22+
- npm
- Java 17+ (for PlantUML diagrams)
- Graphviz (for PlantUML)
# Install dependencies
npm install
# Start development server (11ty + Tailwind watch)
npm start
# Build for production
npm run build
# Build only 11ty
npm run build:11ty
# Build only CSS
npm run build:cssPosts are Markdown files in the posts/ directory with YAML frontmatter:
---
title: Your Post Title
date: 2025-03-12
tags: post
layout: post-layout.njk
---
Your content here...
For PlantUML diagrams:
@startuml
Client -> Server : request
Server --> Client : response
@endumlFrontmatter fields:
title(required): Post titledate(required): Publication date (YYYY-MM-DD)tags: post(required): Marks as blog postlayout: post-layout.njk(required): Uses post template
For posts with images, create a subdirectory:
posts/
└── my-post/
├── my-post.md
└── image.png
Images in post subdirectories are automatically copied to _site.
Include PlantUML diagrams directly in Markdown:
- Use
@startuml/@endumlblocks - Diagrams are rendered during build (production only)
- Both inline and fenced code blocks supported
- Generated PNGs include tabbed UI (image/code view)
Requirements:
- Java must be installed
- PlantUML JAR at
~/.plantuml/plantuml.jar
- Local Development:
npm startruns both 11ty server and Tailwind watcher - Production Build: Docker multi-stage build
- Stage 1: Node.js + Java/Graphviz/PlantUML → builds static site
- Stage 2: Nginx Alpine → serves static files
Push to main → GitHub Actions → Build Docker image → Push to GHCR → Deploy to Hetzner
The workflow triggers on:
- Changes to
posts/** - Manual workflow dispatch
Date formatting in templates:
{{ date | formatDate("MMMM d, yyyy") }}Accessing post collections:
{%- for post in collections.post %}
{{ post.data.title }}
{{ post.url }}
{%- endfor %}TLDR shortcode:
{% tldr %}
Your summary here
{% endtldr %}When ending a work session, you MUST complete ALL steps below. Work is NOT complete until git push succeeds.
MANDATORY WORKFLOW:
- File issues for remaining work - Create issues for anything that needs follow-up
- Run quality gates (if code changed) - Tests, linters, builds
- Update issue status - Close finished work, update in-progress items
- PUSH TO REMOTE - This is MANDATORY:
git pull --rebase bd dolt push git push git status # MUST show "up to date with origin" - Clean up - Clear stashes, prune remote branches
- Verify - All changes committed AND pushed
- Hand off - Provide context for next session
CRITICAL RULES:
- Work is NOT complete until
git pushsucceeds - NEVER stop before pushing - that leaves work stranded locally
- NEVER say "ready to push when you are" - YOU must push
- If push fails, resolve and retry until it succeeds