Thanks for your interest in contributing! This guide covers the basics for getting set up and landing a change.
Loopany is a pnpm monorepo with two packages:
packages/server(@loopany/server, private) — the TanStack Start web app: UI + server functions + the in-process scheduler + machine/agent routes + Better Auth + artifact storage. Drizzle/SQLite. Deployed on Fly.packages/daemon(@crewlet/loopany, public on npm) — the machine-side daemon that runs on each user's own machine, polls the server for due runs, and executes them via the user's local coding agent (BYOA).
AGENTS.md is the in-repo design/decision log — read it for architecture context.
- Node.js
>= 22 - pnpm
8.15.0(pinned via the rootpackageManagerfield;corepack enablepicks it up automatically)
pnpm installpnpm dev # server on http://127.0.0.1:3000 (UI + scheduler + machine routes)Copy .env.example to packages/server/.env if you need to configure auth,
the artifact blob store, or other options. The app runs open (no auth) by default.
Changed
packages/server/src/db/schema.ts? Generate and apply the migration locally — dev does not auto-migrate:pnpm --filter @loopany/server db:generate # write the SQL + snapshot pnpm --filter @loopany/server db:migrate # apply to the dev DB
pnpm -r test # run every package's test suite
pnpm --filter @loopany/server test # server only
pnpm --filter @crewlet/loopany test # daemon only
pnpm -r typecheck # typecheck both packagesPlease keep tests and typecheck green before opening a PR.
- Branch off
mainfor your change; keep the branch focused. - Open a PR against
main. The CI deploy workflow runs on merge tomain. - Write a clear PR description: what changed and why.
- Server — deploys to Fly automatically on push to
main(.github/workflows/deploy.yml, stagingloopany-testing). Production (loopany-prod/ loopany.ai) ships only via a manualworkflow_dispatch(.github/workflows/deploy-prod.yml). Migrations are forward-only (an image rollback does not roll back schema); check themachines.daemon_versionfleet before removing legacy endpoints. - Daemon (
@crewlet/loopany) — publishes to npm on avX.Y.Zgit tag (.github/workflows/publish-daemon.yml, via npm OIDC trusted publishing). The tag must match the version inpackages/daemon/package.json.
Loopany is licensed under the MIT License, and every package is MIT:
Contributions are accepted under the MIT license (inbound=outbound): by opening a pull request you agree that your contribution is provided under the same MIT license as the project. There is no CLA and no DCO / sign-off requirement - nothing extra to sign, and you keep the copyright to your work.