LOS-starter — How I Built a File-Based OS for My Dev Work
The Idea
Public cold-start template for the Life Operating System. Users clone it, run onboarding, and get a working LOS instance with task-system, skills, and memory. Also the upstream source for /update-los.
Why it exists: Gives people a single place to understand LOS and bootstrap their own instance. Managed files are pulled from this repo during updates.
Repo: https://github.com/GadOfir/LOS-starter Version: v0.3.0
The Stack
Static HTML landing page (GitHub Pages) + Claude Code skills + markdown-based system.
What's in the box
- Task system (BMAD-inspired plan phase, loop mode, cross-repo support)
- Self-assembling routing (skills declare their own triggers via SKILL.md)
- Update mechanism (
/update-los— migration + regular updates) - Identity in
memory/identity.md(survives updates) -
LOS:managedmarkers on all updatable filesThe skills that make it work
Every workflow in LOS is a Claude Code skill. Here's what's actually in
.claude/skills/: /task-system— Manages a single-task-at-a-time project workflow inside the repo/build-project— Creates a new project in memory/projects/ with standard structure/learn— Captures and structures knowledge into memory/knowledge/. Handles two modes: topic learning and source ingestion/create-skill— Creates new Claude Code skills for LOS following Skills 2.0 conventions/design-html— Creates beautiful single-file HTML pages with modern CSS. No frameworks, no build tools/evolve— Runs a full LOS system review, health check, and improvement suggestions/update-los— Safely updates LOS from upstream (LOS-starter) while preserving user data/publish-project— Analyze a GitHub project, generate a real article with actual insights about how it uses the task system and LOS architecture, and publish...
Skills self-register by dropping a SKILL.md file into .claude/skills/{name}/. No central registry. No hardcoded lists. The routing layer reads the frontmatter and dispatches automatically.
The task system was the whole point
I didn't want another Notion database. I wanted tasks that live next to the code, survive every context window compaction, and pair with Claude Code's memory model.
The /task-system skill implements a BMAD-inspired lifecycle:
plan → build → verify → fix → learn → close
The plan phase uses three sequential "thinking hats":
- Analyst — what are we really solving, what's the domain context
- Architect — what's the technical approach, what could break
- PM — break it into 8-10 concrete steps, each one atomic
All three hats write into one file. Analysis, architecture notes, plan, work log, verify results, fix attempts, learnings — everything goes into .tasks/active/task-NNN.md. One file is the truth.
There are two modes:
- Gated — human approves each phase. Default.
- Loop — Claude auto-advances through phases until STUCK, BLOCKED, or PASS. Use this when you're away.
Status vocabulary is deliberately small: IN_PROGRESS, FAIL, STUCK, BLOCKED, PASS, ABANDONED. STUCK is the only full-stop — two failed fix attempts and the loop exits, waiting for a human.
Real tasks that built this project
This isn't theoretical. Here are the actual tasks from memory/projects/LOS-starter/tasks.md:
| Task | Why | Status |
|---|---|---|
| Adopt BMAD patterns (task-001) | Onboarding gate, state tracking, enriched skills | Done |
| Cross-repo sync (task-002) | Both repos need identical task-system structure | Done |
| Autonomy + handoff guards (task-003) | Loop mode pausing, cross-repo build in wrong repo | Done |
| Update mechanism (task-004) | No safe way to update old LOS instances | Done |
| Self-assembling routing (task-005) | Updates wiped custom skill entries from CLAUDE.md | Done |
Each of these was a single task file, planned with three hats, built, verified, and closed. The fact that they're all Done is the task system working.
The decisions I had to make
Every decision is logged in decisions.md with a reason. This file answers the question "why is it done this way?" without anyone having to read the code:
Host on GitHub Pages as static HTML
2026-03-28 — Zero-cost, zero-ops, fast to iterate
Single landing page (no framework)
2026-03-28 — Keeps it simple, matches LOS philosophy
Identity in memory/identity.md, not CLAUDE.md
2026-03-29 — Makes CLAUDE.md 100% replaceable on update
LOS:managed markers for update boundary
2026-03-29 — Any file with marker gets replaced, everything else untouched
Self-assembling routing from skill frontmatter
2026-03-29 — No hardcoded skill lists — custom skills auto-route
No CLI for updates — Claude is the update tool
2026-03-29 — /update-los skill fetches from GitHub, simpler than npm tooling
What makes it different
Most dev tooling fights Claude Code. LOS works with it:
-
Memory survives updates. Your identity lives in
memory/identity.md, which is never replaced by/update-los. CLAUDE.md can be overwritten cleanly. -
Skills are self-assembling. Drop a new skill into
.claude/skills/my-thing/SKILL.md, and the routing layer finds it. No config to edit. -
LOS:managedmarkers — every updatable file is tagged. The update mechanism knows exactly what it's allowed to touch. -
One file per task. No task trackers, no Jira, no scatter. If it's not in
.tasks/active/task-NNN.md, it's not happening.
Try it
git clone https://github.com/GadOfir/LOS-starter.git
cd LOS-starter
claude
Then say "start session" and let it bootstrap your first task.
Repo: https://github.com/GadOfir/LOS-starter
Built with: Claude Code + markdown + zero frameworks
This article was originally published by DEV Community and written by Gad Ofir.
Read original article on DEV Community