Ways to help

Good first issuesAll issues

How the work is organised

Homestead is developed one task at a time. Each task in work/tasks.yaml has a brief in docs/tasks/, a list of paths it may touch, dependencies and acceptance criteria. Right now 17 of 63 tasks are still open. An overseer reviews every branch, runs the checks again and merges into main.

  1. One task, one branch, one worktree. Branch task/<ID>-<short-slug> from the latest main, and touch only the paths your task allows.
  2. Contracts aren't yours to change. api/openapi.yaml, the database migrations, platforms/platforms.yaml, design/tokens.json and work/tasks.yaml belong to the overseer. Ask for a change in your handoff under Contract change request, with the exact diff.
  3. Never hand-edit generated files. Run make gen and commit the output; CI fails on drift.
  4. No analytics, telemetry, ads, trackers or remote fonts, and no Google services. Homestead must work in mainland China.
  5. New user-visible strings go in your feature's ARB namespace in all three locales.
  6. Accessibility is part of done: labels, focus order, 44 × 44 pt touch targets, contrast from tokens, and prefers-reduced-motion.

Read CONTRIBUTING.md, AGENTS.md (short, and binding) and docs/13-parallel-workflow.md before your first change.

Set up your tools

The toolchains are pinned in mise.toml: Go 1.26, Node 22, pnpm 9, Flutter 3.24.5 and Java 17 (for the Dart API client generator), plus sqlc, oapi-codegen, staticcheck and govulncheck.

git clone https://github.com/aprajnaparamita/homestead.git
cd homestead

Install the pinned toolchains with mise, then the JS workspace

make tools

Server on :8080 and the web app on :5173

make dev

Other useful targets: make mock-api (a Prism mock of the API on :4010, from the OpenAPI examples) and pnpm --dir web dev:mock (the web app against mock data).

Find your way around

PathWhat it holds
server/Go server: REST API, MCP, connectors, feed engine, media, jobs.
web/React 19 + TypeScript web app (Vite, React Router v7, Tailwind CSS v4).
mobile/Flutter app for iOS and Android.
extension/Firefox companion (WXT, Manifest V3).
helper/Homestead Helper: native-messaging host that reads the Firefox cache.
api/openapi.yamlThe API contract. Clients are generated from it.
platforms/platforms.yamlThe platform registry.
design/tokens.jsonDesign tokens for every client.
i18n/Message files for en, zh_Hans and th.
agents/Agent Skill and config examples for Hermes and OpenClaw.
docs/The specification: product, architecture, API, feed, agents and more.
work/tasks.yamlThe task board.

Checks and tests

Before you hand off, from your task branch:

git fetch && git rebase origin/main
make gen
make check
make scope-check TASK=<ID>

make check runs every area: OpenAPI lint and contract checks, gofmt, go vet, staticcheck, govulncheck and race tests for the server and helper, typecheck, lint, tests, build and Storybook for the web app, dart format, flutter analyze and tests for mobile, the extension's checks plus web-ext lint, and a drift check on generated files. Targets for code that hasn't landed yet print not yet: <task>.

Pull requests and commits

  • Fill the ## Result section of your task brief and use the pull request template: what changed, acceptance criteria and where each is tested, checks run, UI evidence (light and dark, three languages, 160 % text, narrow width), new dependencies, and any contract change request.
  • Commits follow Conventional Commits with the task ID, for example feat(server): parse share-sheet text into candidates (S-03).
  • Reviewers check scope, checks, acceptance criteria, spec fidelity, security, quality, i18n and accessibility. Expect requests for changes; that's the process working.

Code of conduct

Homestead follows the Contributor Covenant: be welcoming, be kind, and keep the project free of harassment for everyone, whatever their background or experience. Report problems to the community leaders as described in the code of conduct.

Security issues never go in public issues. Use private vulnerability reporting.