A quick and easy self-hostable todo/reminder app with multi-device syncing and e2ee.
- Simple and Intuitive: Mobile-first design for a smooth user experience.
- Privacy-Focused:
- Fully Offline Mode: Use tmr.w without any server interaction, keeping all data locally on your device.
- End-to-End Encryption (e2ee) Option: Securely sync your data with e2ee using browser-based cryptography.
- Data Control: Easily delete your data from the server at any time.
- Flexible Syncing:
- Multi-Device Sync: Keep your tasks synchronized across all your devices.
- Choose Your Sync Mode: Select between fully offline, plain text sync, or e2ee sync to suit your needs.
- Real-time Sync: Powered by SignalDB, syncing happens instantly.
- Easy Device Linking: Connect devices quickly using QR codes.
- Powerful Task Management:
- Rich Task Details: Add locations, durations, sub-tasks, attachments, and notes to your tasks.
- Search Functionality: Quickly find the tasks you need.
- Browser-Based Reminders: Get reminded of tasks directly in your browser (make sure browser notifications are enabled).
- Task Categories: Organize tasks using pre-defined categories like Work, Personal, Shopping, and Health (user-defined categories coming soon).
Please be aware of the following when using End-to-End Encryption (E2EE) with multi-device syncing:
- Toggling E2EE Can Disrupt Sync: Switching E2EE on or off after you have linked multiple devices can cause synchronization issues. Devices linked with differing E2EE settings (one on, one off) may lose sync capability.
- Recommendation:
- Decide E2EE preference upfront. If you intend to use E2EE, enable it before linking devices via QR code.
- Maintain consistent E2EE settings across devices. If you need to change E2EE settings, apply the change to all linked devices to ensure continued synchronization.
- Future Improvement & Community Contributions: We are aware of this limitation and are actively exploring solutions to make E2EE toggling more seamless in future releases. We are also open to Pull Requests (PRs) from the community to help address this issue. If you have ideas or contributions, please feel free to submit them!
Before you begin, you need to have Docker installed on your system. Please refer to the official Docker documentation for installation instructions for your operating system: https://docs.docker.com/get-docker/
The easiest way to run tmr.w is using Docker. Follow these steps:
-
Pull the Docker image:
docker pull ankemp/tomorrow:latest
-
Run the Docker container:
docker run -d -p 8080:PORT -e PORT=8080 -e DB_PATH=/data/tmr_w.db -v host_data_volume:/data tomorrow:latest
- Port Mapping: The
-p 8080:PORT
part maps port8080
on your host machine to the port that tmr.w uses inside the container. The container's internal port is configured by thePORT
environment variable (see "Configuration" below). You can change8080
on the host side if you need to use a different port. - Data Persistence:
-v host_data_volume:/data
mounts a volume. You must replacehost_data_volume
with a path on your host machine where you want to store the tmr.w database file (e.g.,$HOME/tmr_w_data
or./tmr_w_data
). This ensures your data persists even if you stop or remove the Docker container. If you don't provide this volume, your data will be lost when the container is removed.
- Port Mapping: The
-
Access tmr.w:
Once the Docker container is running, you can access tmr.w in your web browser by navigating to:
http://localhost:8080
(or the port you specified in thedocker run
command).
You can configure tmr.w using the following environment variables when running the Docker container (using the -e
flag in docker run
):
PORT
: (Optional, default:8080
) Specifies the port that the tmr.w server will listen on inside the Docker container. Make sure the-p
port mapping in yourdocker run
command correctly maps this internal port to a port on your host machine.DB_PATH
: (Optional, default:/data/tmr_w.db
) Specifies the path to the SQLite database file inside the Docker container. It is highly recommended that you mount a host volume to the/data
directory (as shown in thedocker run
example above) to persist your data.
Currently, a docker-compose.yml
file is not provided. The project maintainers welcome community contributions to create and maintain a Docker Compose setup for easier deployment. If you are interested in contributing, please submit a Pull Request!
When you access tmr.w in your browser for the first time on a device, you will see a brief welcome screen like this:
TODO: Insert screenshot of the welcome screen here. (e.g., 
)
This welcome screen gives you two main options:
- "Sync with Existing Device": Choose this if you have already set up tmr.w on another device and want to sync your tasks. This will guide you through the QR code device linking process (see "Multi-Device Sync" below).
- "Start Fresh": Select this to begin using tmr.w as a standalone, offline todo app on this device.
If you choose "Start Fresh" or after you have completed the syncing process, you will be taken to the main task list view.
Adding tasks in tmr.w is designed to be quick and easy:
-
Tap the "New Task" button: Located at the bottom of the screen (represented by a "+" icon).
-
Enter Task Details: A new task creation screen will appear. Here you can enter:
- Task Title: The main description of your task.
- Notes: Add any extra details or context.
- Due Date/Time: Set a deadline for your task.
- Reminders: Configure browser-based reminders to notify you.
- Category: Assign the task to a pre-defined category (Work, Personal, Shopping, Health).
- Location: Associate a location with the task.
- Duration: Estimate the time needed to complete the task.
- Sub-tasks: Break down larger tasks into smaller steps.
- Attachments: Add relevant files to your task.
The interface is designed to be intuitive and mobile-friendly.
The main task view in tmr.w is a List View, organized for clarity and focus:
-
Task Organization: Tasks are grouped as follows:
- Overdue: Tasks past their due date are shown at the top in red.
- Today: Tasks due today.
- Tomorrow: Tasks due tomorrow.
- Future: Tasks due on dates after tomorrow.
-
Interacting with Tasks:
- Mark Complete: Tap the circle or checkbox next to a task to mark it as completed.
- Edit Task: Tap on a task to open it and make changes to any of its details.
- Delete Task: Tap the "Delete" button (located within the task editing view).
- Search: Use the search bar (location?) to quickly find tasks by title or keywords.
To enable multi-device syncing and link a new device to your existing tmr.w setup:
- Navigate to Settings: Open the Settings menu (located in the top-right corner of the application).
- Select "Sync Preferences" (or similar): Find the sync settings within the settings menu.
- "Link New Device": Choose the option to link a new device. This will display a QR code on your current device.
- On the New Device: On the device you want to link, open tmr.w in the browser. On the welcome screen, select "Sync with Existing Device".
- Scan QR Code: Use the new device to scan the QR code displayed on your original device. Follow the on-screen prompts to complete the linking process.
Within the Sync Preferences, you can also:
- Choose Sync Mode: Select between "Fully Offline", "Plain Text Sync", or "End-to-End Encryption (E2EE)" for your synced data. Remember to review the "Things to Know About E2EE and Multi-Device Sync" section in this README if you choose E2EE.
- Manage Linked Devices: (If applicable - can users see/manage linked devices?)
We welcome contributions of all kinds! Whether you're a seasoned developer, a designer, a tester, or just a user with a great idea, there are many ways you can help make tmr.w even better.
How to Contribute:
- Bug Reports: If you find a bug, please open an issue on GitHub. Please be as detailed as possible in your report, including steps to reproduce the bug, your browser/device information, and any relevant error messages.
- Feature Requests: Have a great idea for a new feature or improvement? We'd love to hear it! Please open an issue on GitHub to suggest your feature.
- Code Contributions: Want to contribute code? Great!
- Fork the repository.
- Create a new branch for your feature or bug fix.
- Make your changes and ensure they are well-tested.
- Submit a Pull Request (PR) with a clear description of your changes.
- Documentation: Help us improve the documentation! If you find errors, areas for clarification, or think something is missing, please let us know or submit a PR with improvements.
- Translations: Help us translate tmr.w into other languages to make it accessible to a wider audience.
Contribution Guidelines:
For detailed guidelines on how to contribute, please refer to our CONTRIBUTING.md file.
We appreciate your contributions to making tmr.w a better tool for everyone!
Having trouble or have questions about tmr.w? We're here to help!
- GitHub Issues: The best place to get support, report bugs, or suggest new features is by opening an issue on our GitHub repository. Please check if a similar issue already exists before creating a new one.
We are a small but growing community, and we appreciate your feedback and engagement!
We have exciting plans for the future of tmr.w! Here are some of the features and improvements we are planning to work on:
- Coming Soon: (More details about future features and roadmap will be added here soon. Stay tuned!)
We are also very open to community suggestions and contributions to help shape the future direction of tmr.w.
tmr.w is built with and relies on the following awesome open-source technologies and libraries:
- Angular: A powerful JavaScript framework for building web applications.
- Taiga UI: A fully functional Angular UI library.
- NgRx: Reactive State for Angular.
- SignalDB: A library for local-first realtime databases.
- date-fns: Modern JavaScript date utility library.
- opfs-tools: Tools for working with the Origin Private File System in browsers.
- Sequelize: A modern TypeScript and Node.js ORM.
- Nx: Smart, Fast and Extensible Build System.
We are grateful to the developers and communities behind these projects!
tmr.w is released under the MIT License.