{"id":49690995,"url":"https://github.com/afurm/draftmora","last_synced_at":"2026-05-07T15:12:36.136Z","repository":{"id":355687315,"uuid":"1229146780","full_name":"afurm/draftmora","owner":"afurm","description":"Local-first AI agent board with chat, SQLite storage, and OpenAI account auth.","archived":false,"fork":false,"pushed_at":"2026-05-04T19:30:43.000Z","size":2348,"stargazers_count":0,"open_issues_count":10,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-04T21:12:41.808Z","etag":null,"topics":["agent-board","agent-chat","ai","ai-agent","local-first","openai","openai-auth","productivity","sqlite","task-board","task-management"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/afurm.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-04T18:44:35.000Z","updated_at":"2026-05-04T19:30:48.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/afurm/draftmora","commit_stats":null,"previous_names":["afurm/draftmora"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/afurm/draftmora","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/afurm%2Fdraftmora","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/afurm%2Fdraftmora/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/afurm%2Fdraftmora/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/afurm%2Fdraftmora/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/afurm","download_url":"https://codeload.github.com/afurm/draftmora/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/afurm%2Fdraftmora/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32743349,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-07T02:14:30.463Z","status":"ssl_error","status_checked_at":"2026-05-07T02:14:29.405Z","response_time":62,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent-board","agent-chat","ai","ai-agent","local-first","openai","openai-auth","productivity","sqlite","task-board","task-management"],"created_at":"2026-05-07T15:12:35.260Z","updated_at":"2026-05-07T15:12:36.129Z","avatar_url":"https://github.com/afurm.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Draftmora\n\n[![CI](https://github.com/afurm/draftmora/actions/workflows/ci.yml/badge.svg)](https://github.com/afurm/draftmora/actions/workflows/ci.yml)\n[![npm](https://img.shields.io/npm/v/draftmora?color=CB3837\u0026logo=npm\u0026logoColor=white)](https://www.npmjs.com/package/draftmora)\n[![License: MIT](https://img.shields.io/badge/license-MIT-111111.svg)](LICENSE)\n![Node.js 24 recommended](https://img.shields.io/badge/node-24%20recommended-339933?logo=node.js\u0026logoColor=white)\n![TypeScript](https://img.shields.io/badge/TypeScript-6.0-3178C6?logo=typescript\u0026logoColor=white)\n![SQLite](https://img.shields.io/badge/storage-SQLite-003B57?logo=sqlite\u0026logoColor=white)\n![OpenAI account auth](https://img.shields.io/badge/OpenAI-account%20auth-412991?logo=openai\u0026logoColor=white)\n![Local-first](https://img.shields.io/badge/local--first-yes-111111)\n\n![Draftmora app preview](https://raw.githubusercontent.com/afurm/draftmora/main/.github/assets/draftmora-preview.png)\n\n**Messy ideas in. Clear tasks out.**\n\nDraftmora is a local-first AI agent board for people who want AI help inside\ntheir own task workflow, not another hosted project-management system. Capture\nrough notes, turn them into structured tasks, chat with the agent, and keep\nexecution history next to the work.\n\nThe app runs on your machine, stores board data in SQLite, and can use OpenAI\nthrough account auth or a local API key when a task needs execution help. With\naccount auth, eligible OpenAI accounts can connect from Settings instead of\npasting an API key.\n\n## Why Draftmora\n\n- Start with messy notes and finish with a status-aware task board.\n- Use agent chat to propose task changes before anything is applied.\n- Keep project data local by default in SQLite and plain memory files.\n- Connect OpenAI from the app when account auth is available, or use an API key.\n- Prepared with a real npm CLI, Fastify API, React UI, and CI validation.\n\n## Highlights\n\n- Local-first AI agent board with SQLite storage.\n- Task status, priority, focus area, tags, and execution history.\n- OpenAI account auth through the app settings, with API-key fallback.\n- Agent chat with task proposals and explicit memory writes.\n- Durable local memory files: USER.md and MEMORY.md.\n- React, Vite, TypeScript, Fastify, shadcn/Radix UI, and Vitest.\n\n## How It Works\n\n1. Capture rough work as a draft.\n2. Add priority, focus area, tags, and notes.\n3. Ask the agent to break down work, propose next tasks, or plan follow-ups.\n4. Approve proposed changes explicitly and track execution history on the board.\n\n## Requirements\n\n- Node.js 24 is recommended. Node.js 22.14 or newer remains supported.\n- npm 11 or newer.\n- Optional: an OpenAI account connection for supported account-auth models, or\n  `OPENAI_API_KEY` for API-key backed task execution.\n\n## Quick Start\n\nRun from npm:\n\n```bash\nnpx draftmora\n```\n\nThen open `http://127.0.0.1:4141`.\n\nOr run from a local checkout:\n\n```bash\ngit clone https://github.com/afurm/draftmora.git\ncd draftmora\nnpm install\nnpm run dev\n```\n\nOpen `http://localhost:5173`.\n\nThe API runs on `http://127.0.0.1:4141` by default. Local board data is stored\nin `./data/board.db`.\n\n## Configuration\n\nCopy `.env.example` to `.env` when you need local overrides:\n\n```bash\ncp .env.example .env\n```\n\nExample local override:\n\n```bash\nWEB_PORT=3000\nAPI_PORT=3001\nBOARD_DB_PATH=./data/board.db\nOPENAI_API_KEY=\nOPENAI_BASE_URL=https://api.openai.com/v1\nOPENAI_ORG_ID=\nOPENAI_PROJECT_ID=\n```\n\n`WEB_PORT` controls the Vite dev and preview server. `API_PORT` controls the\nFastify API and the packaged `npx draftmora` server. Without these variables,\nthe dev web server uses `5173` and the API uses `4141`. The older `PORT`\nvariable still works as an API port fallback when `API_PORT` is not set.\n\nOpen Settings in the app to choose an auth mode:\n\n- OpenAI account auth: connect an eligible OpenAI account/subscription from the\n  app, without pasting an API key.\n- API-key mode: save a key locally or provide `OPENAI_API_KEY` through the\n  environment.\n\nThe OpenAI settings screen also supports advanced request controls for model\nbehavior and transport: max output tokens, temperature, reasoning effort,\nreasoning summaries, text verbosity, request timeout, retries, retry delay,\nprompt cache retention, and Codex transport. In API-key mode you can also set\nOpenAI organization/project headers in the app or through `OPENAI_ORG_ID` and\n`OPENAI_PROJECT_ID`.\n\nAPI keys, OAuth tokens, SQLite databases, build output, and dependency folders\nshould not be committed.\n\n## Checks\n\nRun the same validation before opening a PR or pushing release changes:\n\n```bash\nnpm audit\nnpm run typecheck\nnpm test\nnpm run build\nnpm pack --dry-run\n```\n\n## npm Package\n\nDraftmora is published on npm as\n[`draftmora`](https://www.npmjs.com/package/draftmora). The package includes\nthe built Fastify server and Vite client assets.\n\n```bash\nnpx draftmora\n```\n\nOr install it globally:\n\n```bash\nnpm install -g draftmora\ndraftmora\n```\n\nThe package starts on `http://127.0.0.1:4141` and stores data in\n`./data/board.db` from the directory where the command is run. Set\n`BOARD_DB_PATH` when you want a fixed database location.\n\n## Changelog\n\nRelease notes are tracked in [CHANGELOG.md](CHANGELOG.md).\n\n## Security Model\n\nDraftmora is designed as a personal, local-first app. The Fastify API binds to\n`127.0.0.1` by default and assumes the local operator is trusted. Do not expose\nthe API or Vite dev server to the public internet without a separate auth,\nfirewall, VPN, or reverse-proxy policy.\n\nProject memory is plain text in `USER.md` and `MEMORY.md`. Treat those files as\nlocal operator state and review them before publishing a branch.\n\n## Memory\n\nDraftmora uses a built-in local memory pattern:\n\n- `USER.md` stores durable user preferences and profile facts.\n- `MEMORY.md` stores durable agent and project notes.\n- Entries are compact plain text separated with `§`.\n- There is no Memory page or dated memory log.\n- Chat turns run through an automatic durable-memory review; explicit\n  \"remember\" requests are high-confidence save candidates, but memory is\n  inferred from meaning rather than fixed wording.\n- Successful task executions also run the same fail-open memory review for\n  durable project notes.\n- Memory review uses the selected OpenAI model, so there is no separate memory\n  model setting to configure.\n\n## Development Notes\n\nThe interface is tuned for a dense SaaS dashboard workflow: left rail\nnavigation, status-aware board columns, compact task cards, a responsive command\nheader, and settings for focus areas.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fafurm%2Fdraftmora","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fafurm%2Fdraftmora","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fafurm%2Fdraftmora/lists"}