Skip to content

Repository files navigation

float

Float

A personal task manager where the goal is to empty the bucket. When everything's done, you float.

Quick startFeaturesStackSelf-hostingDevelopment

Rust SvelteKit PostgreSQL


Not another todo app that rewards you for adding more. Float is built around one idea: tasks are weight — get rid of them and you float.

No gamification, no streaks, no guilt. Add tasks, knock them out, reach zero.

Features

  • Smart input — type buy milk @tomorrow @15h and the date is parsed automatically
  • Groups & projects — organize projects into groups, tasks belong to projects
  • Overview — all projects side by side, add and complete tasks inline
  • Command paletteCmd+K to search everything instantly
  • Dark / light — system-aware, one-click toggle
  • Date picker — quick shortcuts (today, tomorrow, monday) + natural language + mini calendar
  • File attachments — drag or click to attach files to any task
  • Keyboard shortcutsn to add, Esc to close, Cmd+K to search
  • "You're floating" — the state you reach when every task is done

Stack

SvelteKit 5 + Tailwind ──► Caddy ──► Axum (Rust) ──► PostgreSQL
Layer Technology
Frontend SvelteKit 5, Tailwind CSS, Inter font
Backend Rust, Axum, SeaORM, JWT auth
Database PostgreSQL 16 (UUID primary keys)
Proxy Caddy
Deploy Docker Compose, Cloudflare Tunnel

Self-hosting

Prerequisites

  • Docker + Docker Compose
  • A domain with Cloudflare (optional, for HTTPS)

Deploy

git clone https://github.com/Remenby31/float.git
cd float

# Generate a JWT secret
export JWT_SECRET=$(openssl rand -base64 32)

# Start everything
cd deploy
docker compose up -d

Float is now running on http://localhost:8888.

Create your account

Registration is disabled by default (personal app). Create your user manually:

# Generate a bcrypt hash for your password
node -e "const b=require('bcryptjs');console.log(b.hashSync('your-password',10))"

# Insert into the database
docker exec float-db psql -U float -c \
  "INSERT INTO users (email, username, password_hash) \
   VALUES ('you@example.com', 'yourname', '\$2b\$10\$...');"

Expose with Cloudflare Tunnel

Add to your tunnel config:

- hostname: float.yourdomain.com
  service: http://localhost:8888

Development

Backend

# Start PostgreSQL
docker compose up db -d

# Run the API (auto-migrates on startup)
cd crates/api
cargo run

Frontend

cd frontend
npm install
npm run dev

The dev server proxies /api to localhost:3000 (the Rust API).

Project structure

float/
├── crates/
│   ├── api/           # Axum HTTP server, routes, auth
│   ├── core/          # Shared types
│   ├── db/            # SeaORM entities
│   └── migration/     # Database migrations
├── frontend/
│   └── src/
│       ├── lib/
│       │   ├── components/   # SmartInput, TaskDetail, DatePicker, CommandPalette, ColorPicker
│       │   ├── api.ts        # API client
│       │   ├── smart-input.ts # @ mention parser
│       │   ├── theme.svelte.ts
│       │   └── keyboard.ts
│       └── routes/
│           ├── login/
│           ├── register/
│           └── app/
│               ├── overview/
│               └── project/[id]/
├── deploy/
│   ├── docker-compose.yml
│   └── Caddyfile
├── float-branding/    # Design system, tokens, logo
└── README.md

Design

Monochrome, dark-first, Inter. Inspired by Linear and Notion.

  • No color noise — the UI is black and white, color is for your project dots
  • Minimal text — the interface should be intuitive without labels
  • Micro-animations — 200ms ease-out, spring on completion, stagger on load

License

MIT

About

Personal task manager — empty the bucket, float.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages