https://github.com/c00llin/thingstodo
Self-hosted Things 3 / Todoist inspired task manager
https://github.com/c00llin/thingstodo
self-host self-hosted selfhosted task-list task-management tasks-manager things3 todoist
Last synced: 10 days ago
JSON representation
Self-hosted Things 3 / Todoist inspired task manager
- Host: GitHub
- URL: https://github.com/c00llin/thingstodo
- Owner: c00llin
- License: agpl-3.0
- Created: 2026-02-15T19:28:35.000Z (23 days ago)
- Default Branch: main
- Last Pushed: 2026-02-28T08:13:19.000Z (11 days ago)
- Last Synced: 2026-02-28T13:57:58.912Z (11 days ago)
- Topics: self-host, self-hosted, selfhosted, task-list, task-management, tasks-manager, things3, todoist
- Language: TypeScript
- Homepage:
- Size: 1010 KB
- Stars: 1
- Watchers: 0
- Forks: 0
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# ThingsToDo
A self-hosted, Things 3 / Todoist inspired task manager.

## Features
- **Projects & Areas** — organize tasks into projects (completable) and areas (ongoing)
- **Tags** — flexible labeling with inline `#tag` syntax and customizable colors
- **Review Tasks** — tasks not edited for a configurable number of days surface in a Review section in Inbox, so nothing falls through the cracks
- **Checklists** — subtasks within any task
- **File Attachments & Links** — attach files or URLs to tasks
- **Multi-Date Scheduling** — schedule tasks across multiple dates with optional start/end times (up to 12 entries per task)
- **Repeating Tasks** — daily, weekly, monthly, and custom schedules
- **Natural Language Dates** — type "tomorrow", "next friday", etc.
- **Keyboard-Driven** — full keyboard navigation and shortcuts
- **Filters** — filter any view by area, project, tag, priority, date, and deadline with saved filter presets
- **Search** — full-text search across tasks and notes
- **Dark Mode** — automatic or manual theme switching
- **PWA** — installable on mobile and desktop
- **Single Binary** — Go backend with embedded SPA frontend, SQLite database
## Quick Start
```yaml
# docker-compose.yml
services:
app:
image: ghcr.io/c00llin/thingstodo:latest
container_name: thingstodo
volumes:
- ./data:/data
ports:
- "2999:2999"
environment:
- AUTH_MODE=builtin
- JWT_SECRET=change-me-to-a-random-string
- LOGIN_PASSWORD=your-password-here
restart: unless-stopped
```
```sh
docker compose up -d
```
Open [http://localhost:2999](http://localhost:2999) and log in with the password you set.
## Configuration
| Variable | Default | Description |
|---|---|---|
| `PORT` | `2999` | Server port (must match container port) |
| `LOG_LEVEL` | `info` | Log level |
| `MAX_UPLOAD_SIZE` | `26214400` | Max file upload size in bytes (25 MB) |
| `AUTH_MODE` | `builtin` | Auth mode: `builtin`, `proxy`, or `oidc` |
### Builtin Auth
| Variable | Default | Description |
|---|---|---|
| `JWT_SECRET` | — | Secret for signing JWT tokens (required) |
| `LOGIN_PASSWORD` | — | Seeds an "admin" user on first start |
### Proxy Auth
For use behind an authenticating reverse proxy (Authelia, Authentik, etc.).
| Variable | Default | Description |
|---|---|---|
| `AUTH_PROXY_HEADER` | `Remote-User` | Header containing the authenticated username |
### OIDC Auth
Log in via any OpenID Connect provider (Google, Keycloak, Authelia, etc.). On first login the existing user is automatically linked to your OIDC identity. Only a single user is allowed — other OIDC accounts are rejected.
| Variable | Default | Description |
|---|---|---|
| `JWT_SECRET` | — | Secret for signing JWT tokens (required) |
| `OIDC_ISSUER` | — | OIDC provider URL (e.g. `https://auth.example.com`) |
| `OIDC_CLIENT_ID` | — | OAuth2 client ID |
| `OIDC_CLIENT_SECRET` | — | OAuth2 client secret |
| `OIDC_REDIRECT_URI` | — | Callback URL: `https://your-domain/api/auth/oidc/callback` |
## Development
```sh
# Clone and configure
cp .env.example .env # edit JWT_SECRET and LOGIN_PASSWORD
# Run backend (port 2999) + frontend dev server (port 5173)
make dev
```
The Vite dev server on port 5173 proxies API requests to the Go backend and provides hot reload.
## License
AGPL-3.0