No description
- Elixir 88.2%
- TypeScript 7.5%
- JavaScript 4.1%
- Shell 0.1%
- Nix 0.1%
| .agents/skills/heroui-react | ||
| .pi/skills | ||
| config | ||
| demos/linearlite | ||
| lib | ||
| priv | ||
| scripts | ||
| spec | ||
| test | ||
| .formatter.exs | ||
| .gitignore | ||
| AGENTS.md | ||
| flake.lock | ||
| flake.nix | ||
| justfile | ||
| mix.exs | ||
| mix.lock | ||
| PLAN.md | ||
| README.md | ||
| skills-lock.json | ||
Orbit
Linear-compatible backend foundation.
Current stack:
- Nix flakes
- Phoenix
- Absinthe GraphQL
- Ecto + Postgres
- Oban
Current runtime slice:
/uphealth endpoint/graphqlendpoint/oauth/tokenand/oauth/revoketoken endpoints- API-key auth via
Authorizationheader - bearer auth via minted access tokens
viewer,teams,projects,issues,webhooksqueriesissueCreate,issueUpdate,webhookCreatemutationsissueCreated,issueUpdatedsubscriptions- webhook delivery job + delivery history
Demo app:
demos/linearliteis a Typescript/TanStack Start SSR frontend adapted from ElectricSQL's example- uses Orbit GraphQL directly for issues, projects, cycles, comments, notifications
- uses
/socketfor live inbox updates when subscriptions are available
Boot
Preferred:
nix --extra-experimental-features 'nix-command flakes' develop
scripts/bootstrap.sh
mix phx.server
Without entering the shell manually:
nix --extra-experimental-features 'nix-command flakes' develop -c scripts/bootstrap.sh
nix --extra-experimental-features 'nix-command flakes' develop -c mix phx.server
Default local database:
- host:
127.0.0.1 - port:
55432 - user:
postgres - password:
postgres
Seeded Dev Auth
priv/repo/seeds.exs creates:
- user:
zero@orbit.local - API key:
orbit_dev_key - teammate:
teammate@orbit.local - teammate API key:
orbit_teammate_key - observer:
observer@orbit.local - observer API key:
orbit_observer_key - OAuth client id:
orbit_dev_client - OAuth client secret:
orbit_dev_secret
Use it like:
curl -s http://127.0.0.1:4000/graphql \
-H 'content-type: application/json' \
-H 'authorization: orbit_dev_key' \
-d '{"query":"{ viewer { id name email } }"}'
Storage config:
- default: filesystem
- S3-compatible adapters supported via
ORBIT_STORAGE_PROVIDER=tigris|r2|aws|minio - S3 provider requests are now signed/performed through official
aws-elixirprimitives plushackney - supporting env vars:
ORBIT_STORAGE_ACCESS_KEY_ID,ORBIT_STORAGE_SECRET_ACCESS_KEY,ORBIT_STORAGE_BUCKET,ORBIT_STORAGE_ENDPOINT,ORBIT_STORAGE_REGION,ORBIT_UPLOAD_ROOT
Token exchange example:
curl -s http://127.0.0.1:4000/oauth/token \
-H 'content-type: application/json' \
-d '{
"grant_type":"api_key",
"client_id":"orbit_dev_client",
"client_secret":"orbit_dev_secret",
"api_key":"orbit_dev_key"
}'
Example Mutation
mutation CreateIssue($input: IssueCreateInput!) {
issueCreate(input: $input) {
success
issue {
id
identifier
title
}
}
}
Variables:
{
"input": {
"title": "Ship Orbit",
"description": "Make Linear clients happy",
"teamId": "TEAM_ID",
"projectId": "PROJECT_ID",
"priority": 1
}
}
Status
This is not full Linear parity yet.
It is the working backend foundation:
- schema/runtime shell in place
- local reproducible dev env in place
- database boot/migrations in place
- GraphQL vertical slice in place
- reactive hooks/subscriptions/webhook jobs in place
Next work is breadth:
- larger schema coverage
- richer filtering/pagination
- more webhook payload parity
- SDK/client compatibility testing against real Linear consumers