- Rust 87.4%
- HTML 7.2%
- CSS 5.4%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
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. |
||
| crates | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| README.md | ||
| rustfmt.toml | ||
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.