Removing the splash exposed something it had been covering. Tasks loaded in onMount, so every launch rendered one frame of the empty state first. localStorage is synchronous, so there was never a reason to wait. Migration and rollover run during initialisation and the first render has the real list. onMount keeps only the rollover triggers.
Negotium - Minimalist To Do App
A beautiful, minimal to-do list application featuring smooth animations, intelligent date management, and a modern design that helps you stay organized and productive.
💭 Why Negotium?
While powerful tools like Trello and Vikunja excel at managing complex projects and long-term planning, sometimes you just need a simple, focused space for your daily tasks. That's why I built Negotium, a straightforward to-do list for today and tomorrow. Nothing more, nothing less.
Built with Svelte for speed and simplicity. No overwhelming features, no endless project boards, no complexity. Just a clean interface for your daily workflow.
✨ Features
Core Functionality
- ✅ Add, complete, and delete tasks with smooth animations
- ↩️ Undo -
Cmd/Ctrl+Zbrings back a deleted task, in its original position - 📅 Today & Tomorrow lists - Plan ahead with separate task lists
- 🔄 Unfinished work carries over - When a new day begins, tasks you didn't finish move to Today; completed ones are cleared away
- 🎯 Reorder by drag or keyboard - Drag with a mouse, long-press and drag on touch, or use
Alt+↑/Alt+↓ - 💾 Persistent storage - All tasks saved locally in your browser
- 📊 Task statistics - See how many tasks remain at a glance
🚀 Getting Started
Quick Start with Docker (Recommended)
Pull and run the pre-built Docker image:
# Pull the image
docker pull ghcr.io/aculix/negotium:main
# Run the container
docker run -d -p 3000:80 --name negotium ghcr.io/aculix/negotium:main
Then open http://localhost:3000 in your browser.
To stop the container:
docker stop negotium
docker rm negotium
Manual Installation
If you prefer to run the application locally without Docker:
- Clone the repository:
git clone <repository-url>
cd negotium
- Install dependencies:
npm install
- Start the development server:
npm run dev
- Open
http://localhost:3000in your browser
Build for Production
npm run build
The optimized files will be in the dist directory.
Running the Tests
npm test
The date, storage, rollover, task and undo logic lives in src/lib/ as plain modules that take the current time as an argument, so behaviour at a day boundary is covered by ordinary unit tests rather than by waiting for midnight.
📖 How to Use
Managing Tasks
- Add a task: Type in the input field and press Enter
- Complete a task: Click the checkbox next to the task
- Delete a task: Hover over a task and click the delete icon, or press
Deletewith the task focused - Undo a delete: Press
Cmd/Ctrl+Z— the task returns to where it was - Reorder tasks: Drag with a mouse, long-press then drag on touch, or focus a task and press
Alt+↑/Alt+↓ - Clear input: Press Escape while the input is focused
Date Management
- Switch between Today and Tomorrow: Click the date button in the header
- Plan ahead: Add tasks to Tomorrow's list before you need them
- Separate lists: Today and Tomorrow maintain independent task lists
- Carry-over: When a new day begins, whatever you didn't finish moves into Today. Completed tasks are cleared away with the day they belonged to. This works across gaps too — if you don't open Negotium for a week, everything still outstanding is waiting for you.
- While it's open: The app notices the day change on its own, so a tab left open overnight rolls over without a reload.
Theme Toggle
- Click the sun/moon icon in the header to switch themes
- Your preference is saved automatically and restored on reload
- Respects system dark mode preference on first visit
Keyboard Shortcuts
- Enter: Add task (when input is focused)
- Escape: Clear input field (when input is focused)
- Space/Enter: Toggle task completion (when a task's checkbox is focused)
- Delete: Delete the focused task
- Cmd/Ctrl+Z: Undo the last delete or clear-completed
- Alt+↑ / Alt+↓: Move the focused task up or down
Backspace no longer deletes a task. It is too easily pressed by accident, and deletions used to be unrecoverable.
💾 Data Storage
All data is stored locally in your browser using localStorage:
- Tasks: One key per date, in ISO form (
negotium-tasks-2026-08-15) - Theme: Your theme preference (
negotium-theme) - No server required: Everything runs entirely client-side
- Privacy first: Your data never leaves your device
- Self-pruning: Past days are removed as their unfinished tasks carry forward, so storage doesn't grow without bound
Earlier versions keyed tasks by a different date format (negotium-tasks-Sat Aug 15 2026). Those are converted automatically the first time you open this version — nothing to do, and nothing is lost.
📄 License
MIT License - Free for personal and commercial use.
🤝 Contributing
Contributions are welcome! Feel free to submit issues and pull requests.
