An open API service indexing awesome lists of open source software.

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

Awesome Lists containing this project

README

          

# ThingsToDo

A self-hosted, Things 3 / Todoist inspired task manager.

![ThingsToDo screenshot](docs/screenshots/screenshot-light.png)

## 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