No description
  • Rust 87.4%
  • HTML 7.2%
  • CSS 5.4%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Josh Quinlan 38ce396db6
feat(web): filter bar, saved views and kanban board
The project page gains a query-language filter bar with per-user
saved views, and a drag-and-drop board view groups issues by
workflow state, so triage no longer means scanning one flat
table. SortableJS 1.15.7 and htmx 2.0.10 are vendored and served
locally; every page still works with JavaScript disabled.
2026-08-28 18:37:58 +01:00
crates feat(web): filter bar, saved views and kanban board 2026-08-28 18:37:58 +01:00
.gitignore feat: bootstrap wyrmd with users, sessions and web login 2026-08-28 18:06:56 +01:00
Cargo.lock feat(api): sub-tasks, relations and attachments 2026-08-28 18:37:54 +01:00
Cargo.toml feat(api): OpenAPI v1 with personal access tokens 2026-08-28 18:18:12 +01:00
LICENSE feat: bootstrap wyrmd with users, sessions and web login 2026-08-28 18:06:56 +01:00
README.md docs: reflect milestone 1 and the API in the README 2026-08-28 18:25:47 +01:00
rustfmt.toml feat: bootstrap wyrmd with users, sessions and web login 2026-08-28 18:06:56 +01:00

Wyrm

Wyrm is a self-hosted issue tracker for projects of every shape: software with commits and pull requests to link, and recurring real-world chores with deadlines to keep. One Rust binary serves a calm, server-rendered web UI for humans and, in later milestones, an SSH command protocol for agents and an OpenAPI-described HTTP API, all over a single SQLite database.

The name is the Old English word for a serpent or dragon. The theming keeps that as flavour, never vocabulary: the tool stays plain-spoken.

Status

Early development, moving quickly. Working today: local users and sessions, projects with per-project workflows, issues with labels, priorities, estimates, comments and an activity trail, a query language with full-text search, the web UI for all of it, and an OpenAPI-described HTTP API authenticated by personal access tokens. Still to come: SSH command protocol, OIDC/SCIM, recurrence and calendars, notifications, git linking.

Build

cargo build --release

The binary is target/release/wyrmd. Run the tests with:

cargo test --workspace

Run

Create a data directory, an admin user (password on stdin) and start the server:

wyrmd admin create --username you --display-name You \
    --instance-admin
wyrmd serve

Then sign in at http://127.0.0.1:8484/login.

API

Everything the web UI does is exposed under /api/v1, described by OpenAPI at /api/openapi.json with interactive documentation at /api/docs. Authenticate with a personal access token:

wyrmd admin token --username you --name my-agent

curl -H "Authorization: Bearer wyrm_..." \
    https://wyrm.example.com/api/v1/projects

Issue listings accept the shared query language, for example ?q=state:open due:<7d "reload". The same grammar drives the web filter bar and saved views.

Configuration

Configuration comes from a TOML file (--config wyrm.toml), overridden by environment variables. Everything has a default.

Key Env Default
listen WYRM_LISTEN 127.0.0.1:8484
data_dir WYRM_DATA_DIR data
database WYRM_DATABASE data/wyrm.db

All state (database, and later attachments and SSH host keys) lives under data_dir, so backup is one directory copy.

Layout

Crate Responsibility
wyrm-domain Entities and pure logic, no IO
wyrm-store SQLite persistence and migrations
wyrm-web Server-rendered web UI and sessions
wyrmd The binary: config, CLI, serving

Contributing

The canonical repository is https://forge.quinlan.cloud/joshquinlan/wyrm. Patches are welcome once the tracker tracks itself; until then, issues in the forge are the front door.

Licence

AGPL-3.0-or-later. See LICENSE.