{"id":44826277,"url":"https://github.com/zorya-development/north","last_synced_at":"2026-04-01T21:58:28.421Z","repository":{"id":338854982,"uuid":"1153452404","full_name":"zorya-development/north","owner":"zorya-development","description":"A self-hosted, GTD-inspired task management system built entirely in Rust.","archived":false,"fork":false,"pushed_at":"2026-03-20T05:15:58.000Z","size":6229,"stargazers_count":7,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-03-20T10:34:54.920Z","etag":null,"topics":["axum","leptos","rust","self-hosted","todolist","vibe-coding"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zorya-development.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-09T10:12:48.000Z","updated_at":"2026-03-01T20:23:47.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/zorya-development/north","commit_stats":null,"previous_names":["zorya-development/north"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/zorya-development/north","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zorya-development%2Fnorth","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zorya-development%2Fnorth/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zorya-development%2Fnorth/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zorya-development%2Fnorth/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zorya-development","download_url":"https://codeload.github.com/zorya-development/north/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zorya-development%2Fnorth/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31292631,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T21:15:39.731Z","status":"ssl_error","status_checked_at":"2026-04-01T21:15:34.046Z","response_time":53,"last_error":"SSL_read: 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":["axum","leptos","rust","self-hosted","todolist","vibe-coding"],"created_at":"2026-02-16T22:10:19.794Z","updated_at":"2026-04-01T21:58:28.414Z","avatar_url":"https://github.com/zorya-development.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# North\n\n![North screenshot](.assets/screenshot.jpg)\n\n\u003e **Disclaimer:** I started this project to see how far I could get with [Claude Code](https://claude.ai/claude-code) on a stack I've never worked with before. I deliberately chose Rust, Leptos, and Diesel so I'd have less temptation to write the code myself — I lead the architecture and design, and Claude Code writes the implementation, which turns out to be pretty close to a tech lead job. I've been quite impressed with the results, though I've also learned a lot about what AI-assisted development can and can't do. For context, I have 15 years of experience in web development — I know how to write code, design systems, deploy, and maintain things — but this project is an exercise in agentic coding. I do aim to bring it to a stable release, though it's not there yet. **Use it at your own risk.**\n\nA self-hosted, GTD-inspired task management system built entirely in Rust. North combines a full-stack Rust architecture with practical Getting Things Done workflows — sequential subtask execution, structured review cycles, and a powerful query language for filtering tasks.\n\n## Features\n\n- **Inbox \u0026 Today views** — capture tasks quickly, then focus on what's actionable today\n- **Sequential subtasks** — configurable N-next visibility so you only see the tasks you should work on now; fold/collapse subtrees with `Z`\n- **Recurring tasks** — flexible recurrence rules (daily, weekly, monthly, yearly) with fixed-schedule or after-completion modes\n- **GTD review cycles** — per-task review tracking with configurable intervals to keep your system current\n- **Projects \u0026 tags** — organize work with colored projects (list or kanban view) and user-defined tags, including `key:value` tags for faceted filtering (e.g. `priority:high`, `type:bug`)\n- **Tag filter toolbar** — per-page toolbar with tag toggles, search, and visibility controls for completed and non-actionable tasks\n- **Filter DSL** — JQL-like query language with autocomplete for building saved filters (`status = 'ACTIVE' AND tags =~ 'work:*' ORDER BY due_date ASC`)\n- **Keyboard-driven task management** — full keyboard navigation with tree-aware cursor, inline editing, task creation, and reordering (press `?` to see all shortcuts)\n- **Inline parsing** — type `#tag` or `@project` directly in task titles to assign tags and projects on the fly; tags are preserved and editable across inline edit sessions\n- **Markdown support** — full CommonMark rendering in task descriptions\n- **Drag and drop** — reorder tasks, nest subtasks, and organize with drag-and-drop or keyboard shortcuts\n- **Mobile-friendly** — responsive layout with touch-optimized theme\n- **Dark \u0026 light themes** — respects system preference with manual toggle\n- **Timezone support** — per-user timezone setting for accurate scheduling and recurrence display\n- **REST API** — full CRUD API for external integrations alongside the web UI\n- **Single binary** — one Rust binary serves both the server-rendered pages and the WASM-hydrated client\n\n## Tech Stack\n\nNorth is a full-stack Rust application — no JavaScript runtime, no Node.js, no npm.\n\n| Layer | Technology |\n|---|---|\n| Language | **Rust** (stable, edition 2021) |\n| Frontend | [Leptos](https://github.com/leptos-rs/leptos) 0.7 (SSR + WASM hydration) |\n| Backend | [Axum](https://github.com/tokio-rs/axum) |\n| Database | PostgreSQL 17 via [Diesel](https://diesel.rs/) (async) |\n| Styling | TailwindCSS 4 |\n| Auth | JWT (httpOnly cookies) with Argon2 password hashing |\n\n## Quick Start\n\n### Prerequisites\n\n- Docker \u0026 Docker Compose\n\n### Running with Docker Compose\n\n```bash\n# Clone the repository\ngit clone https://github.com/zorya-development/north.git\ncd north\n\n# Build and start all services\ndocker compose up -d\n\n# Run database migrations and seed the admin account\ndocker compose exec app just migrate\ndocker compose exec app just seed\n```\n\nThe application will be available at **http://localhost:5000**.\n\nDefault admin credentials: `admin@north.local` / `admin`\n\n\u003e There is no self-registration. The admin account creates all other users.\n\n---\n\n## Deploy with Helm\n\nThe included Helm chart deploys North to any Kubernetes cluster with PostgreSQL, automatic migrations, uploads persistence, and optional ingress/TLS.\n\n### Prerequisites\n\n- Kubernetes 1.24+\n- Helm 3.x\n- `kubectl` configured for your cluster\n\n### Install\n\n```bash\n# From OCI registry (published automatically on chart changes)\nhelm install north oci://ghcr.io/zorya-development/north/charts/north \\\n  -n north --create-namespace\n\n# Or from a local clone\nhelm install north ./chart -n north --create-namespace\n```\n\nThe admin account is seeded automatically on first install. Default credentials: `admin@north.app` / `admin`. **Password change is not yet implemented — do not expose this to the public internet.**\n\n### Configuration\n\n#### Custom domain with TLS\n\n```bash\nhelm install north ./chart -n north --create-namespace \\\n  --set ingress.enabled=true \\\n  --set ingress.className=nginx \\\n  --set ingress.hosts[0].host=tasks.example.com \\\n  --set ingress.hosts[0].paths[0].path=/ \\\n  --set ingress.hosts[0].paths[0].pathType=Prefix \\\n  --set ingress.tls[0].hosts[0]=tasks.example.com \\\n  --set ingress.tls[0].secretName=north-tls\n```\n\n#### External PostgreSQL\n\n```bash\nhelm install north ./chart -n north --create-namespace \\\n  --set postgresql.enabled=false \\\n  --set externalDatabase.host=postgres.example.com \\\n  --set externalDatabase.password=secret\n```\n\n#### Pre-created secrets\n\n```bash\nkubectl create secret generic north-secrets -n north \\\n  --from-literal=database-url='postgres://user:pass@host:5432/north' \\\n  --from-literal=jwt-secret='your-secret-here'\n\nhelm install north ./chart -n north \\\n  --set existingSecret.name=north-secrets\n```\n\n### Key values\n\n| Value | Default | Description |\n|---|---|---|\n| `image.tag` | Chart appVersion | Docker image tag |\n| `postgresql.enabled` | `true` | Deploy in-cluster PostgreSQL (Bitnami) |\n| `postgresql.auth.password` | auto-generated | PostgreSQL password |\n| `secret.jwtSecret` | auto-generated | JWT signing secret (preserved across upgrades) |\n| `secret.databaseUrl` | — | Explicit DATABASE_URL (overrides all other DB config) |\n| `existingSecret.name` | — | Use a pre-created Secret (keys: `database-url`, `jwt-secret`) |\n| `externalDatabase.host` | — | External PostgreSQL host (when `postgresql.enabled=false`) |\n| `ingress.enabled` | `false` | Create an Ingress resource |\n| `ingress.className` | — | Ingress class (e.g. `nginx`, `traefik`) |\n| `persistence.enabled` | `true` | PVC for uploads (`/app/uploads`) |\n| `persistence.size` | `5Gi` | Uploads volume size |\n| `migration.enabled` | `true` | Run Diesel migrations as a pre-install/pre-upgrade hook |\n| `autoscaling.enabled` | `false` | Enable HPA (scales 1–3 replicas on CPU) |\n| `resources.requests.memory` | `128Mi` | Memory request |\n| `resources.limits.memory` | `512Mi` | Memory limit |\n\nFull values reference: [`chart/values.yaml`](chart/values.yaml)\n\n---\n\n## Development\n\n### Prerequisites\n\n- Docker \u0026 Docker Compose\n\n### Setup\n\n```bash\n# Build the base and dev images\ndocker compose build\n\n# Start the database\ndocker compose up -d db\n\n# Enter the app container\ndocker compose run --rm -ti --service-ports app bash\n\n# Inside the container:\njust migrate          # Apply database migrations\njust seed             # Seed admin account\njust dev              # Start dev server with hot reload\n```\n\n### Commands\n\nAll commands run inside the app container via [just](https://github.com/casey/just):\n\n| Command | Description |\n|---|---|\n| `just dev` | Dev server with hot reload (cargo-leptos) |\n| `just test` | Run all tests |\n| `just test crate_name` | Run tests for a specific crate |\n| `just fmt` | Format code |\n| `just lint` | Run clippy |\n| `just check` | fmt + lint + test |\n| `just migrate` | Apply database migrations |\n| `just migration name` | Create a new migration |\n| `just migrate-revert` | Revert last migration |\n| `just migrate-redo` | Revert + reapply last migration |\n| `just build` | Release build |\n| `just seed` | Seed admin account |\n\nFor CI or non-interactive use: `docker compose exec app just \u003ccommand\u003e`\n\n### End-to-End Tests\n\nE2E tests use [Playwright](https://playwright.dev/) and run against the full app in Docker. Commands run from the host (not inside the app container):\n\n```bash\njust playwright              # Start test stack + Playwright UI mode (port 8080)\njust playwright-exec         # Run tests headless in already-running containers\njust playwright-down         # Tear down test containers and volumes\n\n# Rebuild test containers (needed after migrations, schema changes, or new features)\njust playwright-down \u0026\u0026 docker compose -p north-test -f docker-compose.test.yml up -d --build\n```\n\n### Project Structure\n\nNorth is organized as a Cargo workspace with layered crates:\n\n```\nnorth/\n├── crates/\n│   ├── dto/            # Shared data types (no IO) — compiled for server and WASM\n│   ├── db/             # Diesel schema, models, connection pool\n│   ├── core/           # Business logic, services, filter DSL engine\n│   ├── server-fns/     # Leptos #[server] RPC boundary\n│   ├── repositories/   # Thin async facade over server functions\n│   ├── stores/         # Reactive client state (signals, memos, optimistic updates)\n│   ├── ui/             # Generic UI component library (no domain deps)\n│   ├── app/            # Leptos pages, containers, components (SSR + WASM)\n│   └── server/         # Axum binary, REST API, auth middleware\n├── migrations/         # Diesel reversible migrations (up.sql + down.sql)\n├── style/              # TailwindCSS entry point\n├── public/             # Static assets\n├── chart/              # Helm chart for Kubernetes deployment\n├── docker/             # Base, dev, and prod Dockerfiles\n└── docs/               # Product requirements, design system, and architecture reference\n```\n\nData flows through the layers in one direction:\n\n```\nPage → Store → Repository → ServerFn ──RPC──→ Service → Diesel → PostgreSQL\n```\n\n### Docker Images\n\n| Image | Path | Purpose |\n|---|---|---|\n| **base** | `docker/base/Dockerfile` | Rust toolchain, cargo-leptos, diesel_cli, wasm32 target |\n| **dev** | `docker/dev/Dockerfile` | Extends base — adds just and tailwindcss CLI |\n| **prod** | `docker/prod/Dockerfile` | Runtime-only: debian:bookworm-slim with pre-built binary |\n\nBase image version is tracked in `docker/base/VERSION`. Bump with:\n\n```bash\njust bump-base patch    # 1.0.0 → 1.0.1\njust bump-base minor    # 1.0.0 → 1.1.0\njust bump-base major    # 1.0.0 → 2.0.0\n```\n\n### CI/CD\n\n- **test.yml** — runs on pushes to master and all PRs: format check, clippy, tests. Conditionally rebuilds the base image if `docker/base/**` changed.\n- **release.yml** — runs on pushes to master: builds a production Docker image, pushes to ghcr.io, generates a changelog via git-cliff, and creates a GitHub release.\n\n### Releasing\n\n1. Bump version: `just bump-version {major,minor,patch}`\n2. Push to master (via PR or direct push)\n3. The release workflow automatically builds and publishes the Docker image, changelog, and GitHub release\n\n---\n\n## License\n\nProprietary — Zorya Development\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzorya-development%2Fnorth","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzorya-development%2Fnorth","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzorya-development%2Fnorth/lists"}