A project doesn't have to be anything more than a series of documents. The source code can be filled in later.
This is a unified monorepo containing 53 interconnected software development projects. What makes it unusual is not its size, but its methodology: every change requires an issue file, every issue follows a naming convention, and every phase produces a working demonstration.
The system emerged from a simple observation: code without documentation becomes unmaintainable, but documentation without structure becomes unreadable. The solution is to make structure itself the documentation.
If you're a wizard who wields power through knowledge and want a more rigorous foundation, see Structure and Interpretation of Computer Programs.
This repository is for sorcerers - those who use vision to see a problem and solution, language to describe that path, and will to compel reality to stitch itself into the proper configuration.
No code change exists without a corresponding issue file. This is the central rule.
An issue file is not a ticket in a tracking system. It is a markdown document that lives in the repository, versioned alongside the code it describes. Each issue contains three required sections: what the system does now (Current Behavior), what it should do instead (Intended Behavior), and how to get there (Suggested Implementation Steps).
The workflow is simple:
- Identify a change that needs to be made
- Create or find the issue file that describes it
- Read and understand the issue
- Implement the change
- Update the issue with what actually happened
- Move the issue to
issues/completed/ - Commit
This creates a development history that can be read like a narrative. Each issue tells a story: here was a problem, here was a plan, here is what we learned.
Work is organized into phases. Each phase has a progress file (phase-X-progress.md) that tracks completed issues and remaining work. When a phase completes, a demonstration program is created that shows—not describes—what was accomplished.
Phase demos live in issues/completed/demos/ and run via simple bash scripts. They produce real output: rendered graphics, processed data, working interfaces. The ability to demonstrate progress at any phase boundary keeps the work honest.
Issue files follow a precise naming scheme: {PHASE}{ID}-{DESCR}.md
522-fix-update-script.md
│ │ │
│ │ └── Description: "fix update script"
│ └─── ID: 22 (22nd issue in this phase)
└──── Phase: 5
This encoding serves multiple purposes. Files sort chronologically within each phase. The filename alone tells you when the issue was created and what it addresses. Automated tools can parse phase and ID without reading file contents.
For complex issues, sub-issues use an alphabetical suffix: 522a-design-token-format.md, 522b-implement-token-generation.md. The parent issue completes only when all children complete.
Twenty-eight projects currently have active issue tracking, with 659 issues completed out of 1,221 total (54% overall completion).
| Project | Focus | Status |
|---|---|---|
| neocities-modernization | Poetry website with GPU-accelerated LLM similarity navigation | Phase 9 |
| world-edit-to-execute | Warcraft 3 map parser and Lua runtime engine | Phase 4 |
| symbeline-realms | Symbol-based learning and exploration | Phase 3 (89% complete) |
| delta-version | Repository management and cross-project tooling | Phase 2 |
| RPG-autobattler | Auto-battler RPG with procedural mechanics | Phase 2 |
| handheld-office | Portable productivity tools | Phase 2 (70% complete) |
The most mature projects have completion rates above 60%:
| Project | Progress | Complete |
|---|---|---|
| symbeline-realms | 177/198 | 89% |
| handheld-office | 38/54 | 70% |
| world-edit-to-execute | 201/300 | 67% |
| neocities-modernization | 151/231 | 65% |
| adroit | 14/23 | 61% |
| RPG-autobattler | 35/66 | 53% |
| words-pdf | 8/19 | 42% |
| delta-version | 29/101 | 29% |
Feel free to poke around. I recommend reading the notes/, docs/, and issues/ directories.
Meta & Tooling forms the foundation: delta-version manages the repository itself, scripts/ provides shared utilities, progress-ii handles visualization, and project-orchestration coordinates multi-project work.
AI & Language Processing includes neocities-modernization (LLM embeddings for poetry navigation), words-pdf (PDF text extraction), llm-transcripts (conversation management), and intelligence-system (reasoning frameworks).
Games & Game Engines is the largest category, with 18 projects spanning world-edit-to-execute (WC3 map parsing), RPG-autobattler, healer-td, console-demakes (Game Boy Color), and various game design experiments in game-design/.
Learning & Symbolic Systems explores symbeline-realms, risc-v-university, and lua-stories.
Tools & Utilities covers handheld-office, resume-generation, authorship-tool, and the factorIDE projects.
Every project follows a canonical directory layout:
project-name/
├── docs/ Documentation and guides
├── notes/ Planning, vision, brainstorming
├── src/ Source code
├── libs/ Project-specific libraries
├── issues/ Issue tracking
│ ├── phase-n/ Issues organized by phase
│ └── completed/ Archived completed issues
├── input/ Input files for processing
├── output/ Generated outputs
└── tmp/ Project-specific temporary files
The first thing a program should do is read input/. The last thing it should do is write to output/. This lifecycle makes programs composable: one project's output becomes another's input.
Functions use vimfolds for consistent structure:
-- {{{ print_hello_world
local function print_hello_world(text)
print(text or "Hello, World!")
end
-- }}}Scripts begin with a header comment explaining purpose and usage at an executive level—fit for someone who needs to know what a script does without reading its implementation.
Scripts accept a DIR argument and use it for all path resolution, allowing execution from any working directory.
Libraries install locally to each project rather than globally. This keeps projects self-contained and reproducible—anyone cloning a project gets exactly the dependencies it needs without polluting their system or conflicting with other projects.
Each project maintains its dependencies in libs/:
project-name/
├── libs/
│ ├── json.lua # Vendored directly
│ ├── socket/ # Multi-file library
│ └── install.sh # Fetches external deps
└── scripts/
└── run.sh # Entry point
The install.sh script handles all dependency acquisition. It should be idempotent (safe to run multiple times) and explicit about what it fetches:
#!/bin/bash
# install.sh - Fetch all project dependencies
# Downloads json.lua and luasocket to libs/
DIR="${1:-$(dirname "$0")/..}"
LIBS_DIR="$DIR/libs"
mkdir -p "$LIBS_DIR"
# Fetch json.lua if missing
if [ ! -f "$LIBS_DIR/json.lua" ]; then
curl -o "$LIBS_DIR/json.lua" \
"https://raw.githubusercontent.com/rxi/json.lua/master/json.lua"
fi
# Fetch luasocket if missing
if [ ! -d "$LIBS_DIR/socket" ]; then
# ... installation steps
fiThe run.sh script serves as the single entry point. It ensures dependencies exist, sets up the environment, and launches the application:
#!/bin/bash
# run.sh - Launch the application
# Ensures dependencies are installed, then runs main.lua
DIR="${1:-$(dirname "$0")/..}"
# Ensure dependencies
"$DIR/scripts/install.sh" "$DIR"
# Set library path to include project libs
export LUA_PATH="$DIR/libs/?.lua;$DIR/src/?.lua;;"
# Launch
luajit "$DIR/src/main.lua" "$@"This creates a clean workflow: clone the repo, run libs/install.sh, then ./scripts/run.sh and everything works. No manual dependency hunting. No "works on my machine." The install script documents exactly what external code the project needs, configured to spec, and the run script pipelines the entire launch process into a single command.
In C, header files (.h) declare what a module exposes without revealing implementation. Compilers use them to verify correct usage. Many languages don't have this concept, and even in C, headers serve compilers rather than humans.
The .info.md pattern solves this. Each source file gets a corresponding markdown file listing its external functions, their signatures, and brief descriptions. This creates language-agnostic header files optimized for human and LLM consumption.
Here's an example documenting a task worker module with a dispatch table pattern:
# task_worker.lua
## Overview
Executes tasks by ID using a dispatch table. Call `run_task(id, args)`
where `id` indexes into the task registry. More efficient than switch
statements; adding tasks requires no control flow changes.
## Dispatch Table
| ID | Task | Required Args | Optional Args | Returns |
|----|------------------|------------------|---------------|-----------------|
| 1 | parse_document | filepath | encoding | ast, errors |
| 2 | validate_schema | ast, schema_id | strict_mode | valid, messages |
| 3 | transform_output | ast, format | pretty_print | output_string |
| 4 | write_file | out_string, dest | overwrite | bytes_written |
| 5 | notify_complete | task_chain_id | webhook_url | status_code |
(each of the task functions, arguments, and return values could be documented here as well, but omitted for brevity)
## External Functions
### run_task(id: int, args: table) → result, error
Executes task by dispatch table index. Returns nil, error if ID invalid
or required args missing.
### queue_task(id: int, args: table) → task_handle
Adds task to threadpool queue. Returns handle for status polling.
### await_task(handle: task_handle, timeout_ms: int) → result, error
Blocks until task completes or timeout. Returns nil, "timeout" on timeout.
### get_task_info(id: int) → { name, required_args, optional_args, description }
Returns metadata for task ID without executing.
## Internal (not exported)
- _dispatch_table (the function pointer array)
- _validate_args
- _worker_thread_mainThe dispatch table format makes the module's capabilities scannable at a glance. A caller can see all available operations, their IDs, and argument requirements without reading implementation code.
The benefit is token efficiency. An LLM exploring a codebase can read task_worker.info.md (40 lines) instead of task_worker.lua (800 lines) to understand what the module offers. Only when the interface description proves insufficient does it need the full source.
This creates a layered reading strategy: table of contents → info.md summaries → full source. Each layer filters out readers who got what they needed at the previous level.
When a change is made, a comment explains why. Not what the code does—that's visible in the code itself—but why this approach was chosen, what alternatives were considered, what constraints apply.
-- Retry up to 3 times before failing. We chose 3 over 5 based on
-- latency measurements in issue 423: beyond 3 retries, user-perceived
-- delay exceeds acceptable thresholds.
if counter < 3 then counter = counter + 1 else return falsePrefer errors over fallbacks. Silent degradation masks problems that compound over time. When a fallback must be used, log it visibly and create an issue to eliminate it.
When a bug is fixed, create a test that validates the fix. The test serves as documentation of expected behavior and prevents regression.
Read the issue. Implement the change. Update the issue with what happened. Move to issues/completed/. Commit.
Some tasks decompose naturally into independent chunks: processing 1000 files, running tests across modules, applying transformations to data partitions. When chunks don't depend on each other's results, they can execute simultaneously.
The work-stealing pattern coordinates this:
- Create a manifest listing all chunks before starting work
- Claim chunks atomically — a worker marks a chunk "in_progress" with their identifier
- Process independently — each worker handles their claimed chunks
- Aggregate results when all chunks reach "completed"
-- Task manifest (stored in issues/.tasks/ or similar)
{
id = "process-dataset",
created = "2026-02-24",
chunks = {
{ id = 1, status = "completed", claimed_by = "worker-1", completed_at = "..." },
{ id = 2, status = "in_progress", claimed_by = "worker-2", started_at = "..." },
{ id = 3, status = "unclaimed" },
{ id = 4, status = "unclaimed" },
}
}When to apply this pattern:
- Issue phases — when a phase has many independent issues, multiple agents can claim different issues
- Large refactors — updating 50 files to use a new API can be split by file or directory
- Test suites — running tests across independent modules
- Data processing — transforming datasets that partition cleanly
When not to apply:
- Tasks with sequential dependencies (step 2 needs step 1's output)
- Small tasks where coordination overhead exceeds parallelism benefit
- Work requiring shared mutable state
The manifest serves as both coordination mechanism and progress tracker. Anyone can inspect it to see what's done, what's in progress, and what remains.
Respect your predecessors: don't undo prior work without justification. Leave clear notes for successors. FIXME comments are unsigned work items—investigate the reasoning before modifying.
When multiple agents align on a decision, the system state changes qualitatively. Document consensus decisions and their rationale.
The interest here is software design, not product development. Architectural elegance matters. Structure matters. Design documents are as important as working code.
Data generation and data viewing are separate systems. Generators write to standardized formats. Viewers read from those formats. Neither crosses the boundary. Errors localize to one side.
Don't throw away and rebuild. Extend existing capabilities. Maintain compatibility with old interfaces. Provide migration paths rather than breaking changes.
"De-selected" is more informative than "not selected." The former implies history: something was selected, then un-selected. Apply this principle to variable names, log messages, error reports.
To understand a project, read its notes/vision document first, then docs/roadmap.md, then browse issues/ to see current and completed work.
To contribute, find or create an issue file before making changes. Follow the naming convention. Update the phase progress file when completing issues. Commit atomically—one issue, one commit.
A sandboxed environment is available for experimenting without affecting your system. The container includes LuaJIT, Vulkan, OpenGL, SDL2, and all project dependencies.
Quick start:
# Build the container image
./docker-run.sh build
# Run (auto-detects your GPU and display setup)
./docker-run.shDisplay modes:
| Mode | Command | Use case |
|---|---|---|
| X11 | ./docker-run.sh x11 |
Linux with X11 display (lowest latency) |
| VNC | ./docker-run.sh vnc |
Any OS, access via browser at http://localhost:6080 |
| Headless | ./docker-run.sh headless |
Compute-only, no graphics |
GPU support:
The sandbox auto-detects your GPU:
- NVIDIA: Requires
nvidia-container-toolkiton the host. Run./docker-run.sh gpu-infoto check if it's detected. - AMD/Intel: Works automatically via
/dev/dri. - No GPU: Falls back to software rendering (functional but slow).
What's inside:
/workspace/ # The monorepo (your working directory)
~/scripts/detect-gpu.sh # Run to see GPU detection details
All changes inside the container are isolated. Exit and restart to reset to a clean state. For VNC mode, the password is sandbox.
Using docker-compose:
For more control, use docker-compose directly:
# Standard (AMD/Intel/software)
docker compose up sandbox-x11
docker compose up sandbox-vnc
# NVIDIA-specific (requires nvidia-container-toolkit)
docker compose up sandbox-x11-nvidia
docker compose up sandbox-vnc-nvidiaQUICK-START.md— Quick reference for common operationsTROUBLESHOOTING.md— Solutions to common problemsdelta-version/docs/— Comprehensive documentation suitedelta-guide.md— Full mono-repo guideworktree-guide.md— Git worktree workflowsdevelopment-guide.md— Development standardsissue-template.md— Standard issue format
The following directives govern development. Priority indicates enforcement level.
| ID | Directive | Priority |
|---|---|---|
| D-003 | Canonical directory structure | Critical |
| D-005 | Issue naming convention | Critical |
| D-007 | Issue-first development | Critical |
| D-041 | No changes without issues | Critical |
| D-051 | Info.md interface files | Critical |
| D-021 | Change comments with rationale | Critical |
| D-028 | Consensus decision documentation | Critical |
| D-008 | Fail-loud error handling | High |
| D-009 | Phase progress tracking | High |
| D-014 | Script header comments | High |
| D-019 | Separation of concerns | High |
| D-045 | Agent etiquette | High |
| D-054 | Work-stealing coordination | High |
| D-055 | Local lib installation with install.sh | High |
| D-056 | Single-command launch via run.sh | High |
| D-001 | Script portability via DIR | Medium |
| D-002 | Vimfold function organization | Medium |
| D-011 | Commits on issue completion | Medium |
| D-038 | Program lifecycle (input→output) | Medium |
| D-043 | Informative negation | Medium |
28 projects with issue tracking. 659 completed. 1,221 total. 54% overall.
| Project | Progress | % |
|---|---|---|
| symbeline-realms | 177/198 | 89% |
| handheld-office | 38/54 | 70% |
| world-edit-to-execute | 201/300 | 67% |
| neocities-modernization | 151/231 | 65% |
| adroit | 14/23 | 61% |
| RPG-autobattler | 35/66 | 53% |
| words-pdf | 8/19 | 42% |
| delta-version | 29/101 | 29% |
| games/wow-chat-2 | 3/11 | 27% |
| ai-playground | 1/7 | 14% |
| scripts | 1/27 | 4% |
| translation-layer-wow-chat-city-of-chat | 0/55 | 0% |
| progress-ii | 0/31 | 0% |
| ao3-source-code-import | 0/21 | 0% |
| dark-volcano | 0/12 | 0% |
| healer-td | 0/12 | 0% |
| continual-co-operation | 0/9 | 0% |
| authorship-tool | 0/8 | 0% |
| games/city-of-chat | 0/8 | 0% |
| games/gameboy-color-rpg | 0/7 | 0% |
| symbeline-2 | 0/6 | 0% |
| factor-IDE-2 | 0/5 | 0% |
| risc-v-university | 0/5 | 0% |
| console-demakes | 0/1 | 0% |
| game-design/pyrrhic-victory | 0/1 | 0% |
| links-awakening | 0/1 | 0% |
| llm-http | 0/1 | 0% |
| spatial-drones | 0/1 | 0% |
"They want you to think about then, so that you aren't able to think about now."
License: Individual projects may have their own licenses. See each project's directory for details.