lific 1.1.2

Local-first, lightweight issue tracker. Single binary, SQLite-backed, MCP-native.
<p align="center">
  <img src="LificHero.png" alt="Lific — Issue tracking built for AI-driven development" width="800">
</p>

<p align="center">
  <a href="https://github.com/VoidNullable/lific/actions/workflows/ci.yml"><img src="https://github.com/VoidNullable/lific/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
  <a href="https://crates.io/crates/lific"><img src="https://img.shields.io/crates/v/lific" alt="crates.io"></a>
  <a href="https://github.com/VoidNullable/lific/releases"><img src="https://img.shields.io/github/v/release/VoidNullable/lific" alt="Release"></a>
  <a href="LICENSE"><img src="https://img.shields.io/github/license/VoidNullable/lific" alt="License"></a>
</p>

<p align="center">
  <strong>Lightweight issue tracking built for AI-driven development.</strong><br>
  Single binary. MCP built in. Clean web UI.
</p>

---

Lific's full MCP schema fits in ~2,500 tokens. It uses human-readable identifiers (`APP-42`, not UUIDs), runs as a single binary with an embedded SQLite database, and includes a web UI for when you want to look at things yourself.

## Install

```bash
cargo install lific
```

Or grab a binary from the [releases page](https://github.com/VoidNullable/lific/releases).

## Quickstart

```bash
lific init     # creates lific.toml + lific.db
lific start    # starts on port 3456
```

On first run, Lific generates an API key and prints it to the console. Save it — it won't be shown again. This key is used for MCP and API access.

Open `http://localhost:3456` to use the web UI. The first account you create is the admin.

## Connecting AI tools

Point your MCP client at the server. Replace `your-api-key` with the key from first run (or create one with `lific key create --name my-key`).

**Remote (network):**

```json
{
  "lific": {
    "type": "remote",
    "url": "http://localhost:3456/mcp",
    "headers": {
      "Authorization": "Bearer your-api-key"
    }
  }
}
```

**Local (stdio, no network):**

```json
{
  "lific": {
    "type": "local",
    "command": ["lific", "--db", "path/to/lific.db", "mcp"]
  }
}
```

<details>
<summary>Web UI setup (if you prefer clicking)</summary>

Go to **Settings > Connected Tools** in the web UI. Pick your tool, click Connect, and paste the generated config snippet. Supported tools: OpenCode, Cursor, Claude Code, Claude Desktop, Codex.

Each connection creates a bot identity tied to your account. Changes show up attributed to you, tagged with which tool made them.

</details>

## MCP tools

| Tool | What it does |
|------|-------------|
| `list_issues` | Filter by status, priority, module, label, or workable |
| `get_issue` | Full issue details with relations, labels, and comments |
| `create_issue` / `update_issue` | Create or partially update by identifier |
| `get_board` | Board view grouped by status, priority, or module |
| `search` | Full-text search across issues and pages |
| `link_issues` / `unlink_issues` | Dependency tracking (blocks, relates_to, duplicate) |
| `get_page` / `create_page` / `update_page` | Markdown documents in folders |
| `add_comment` / `list_comments` | Comments on issues |
| `list_resources` | Discover projects, modules, labels, folders |
| `manage_resource` | Create/update projects, modules, labels, folders |
| `delete` | Delete anything by identifier |

Everything uses human-readable identifiers: `project="APP"` not `project_id=7`.

**Workable filter:** `list_issues(project="APP", workable=true)` returns only issues with all blockers resolved — one call to answer "what can I work on right now?"

## Features

| Category | What you get |
|----------|-------------|
| **Issue tracking** | Status, priority, modules, labels, relations, comments, board view |
| **Documentation** | Markdown pages in recursive folders |
| **MCP interface** | 16 tools, ~2,500 token schema, human-readable identifiers |
| **REST API** | Full CRUD for all resources, search, board view |
| **Web UI** | Inline editing, drag-and-drop, dark/light theme |
| **User accounts** | Individual auth, per-tool bot identities, project lead permissions |
| **OAuth 2.1** | PKCE, dynamic client registration, token revocation |
| **Backups** | Automatic SQLite snapshots with configurable retention |
| **Single binary** | No runtime dependencies, embedded SQLite, ~15MB |

## Configuration

<details>
<summary><code>lific.toml</code></summary>

`lific init` generates this:

```toml
[server]
host = "0.0.0.0"
port = 3456

[database]
path = "lific.db"

[backup]
enabled = true
dir = "backups"
interval_minutes = 60
retain = 24

[log]
level = "info"
```

CLI flags (`--db`, `--port`, `--host`) override config values.

</details>

## Building from source

```bash
git clone https://github.com/VoidNullable/lific
cd lific
cd web && bun install && bun run build && cd ..
cargo build --release
```

Requires Rust 1.88+ (edition 2024). SQLite is bundled. The web frontend is optional — the binary works without it, you just won't have the UI.

## Contributing

Issues and PRs welcome. If you're planning something big, open an issue first so we can talk about it before you put in the work.

## License

[Apache-2.0](LICENSE)