# OpenHabitTracker https://openhabittracker.net ## App: https://pwa.openhabittracker.net Take notes, plan tasks, track habits - Free and Ad-free - Open Source - Privacy Focused: All user data is stored locally on your device - Available on Windows, Linux, Android, iOS, macOS, and as a web app - Localized to English, German, Spanish, Slovenian, French, Portuguese, Italian, Japanese, Chinese, Korean, Dutch, Danish, Norwegian, Swedish, Finnish, Polish, Czech, Slovak, Croatian, Serbian Key Features: - Markdown support for notes - Use categories and priorities to organize your notes, tasks, and habits - Advanced Search, Filter, and Sort - Data Export/Import: JSON, YAML, TSV, Markdown - Import your notes from Google Keep - Available in 26 themes with Dark and Light modes ## Stores: Windows: [](https://apps.microsoft.com/detail/9mwzmlxzzllr) Linux - Flathub: [](https://flathub.org/apps/net.openhabittracker.OpenHabitTracker) Linux - Snap Store: [](https://snapcraft.io/openhabittracker) Android: [](https://play.google.com/store/apps/details?id=net.openhabittracker) iOS: [](https://apps.apple.com/us/app/openhabittracker/id6654885470?platform=iphone) macOS: [](https://apps.apple.com/us/app/openhabittracker/id6654885470?platform=mac) Android - APKPure: [](https://apkpure.com/openhabittracker/net.openhabittracker) Android - GitHub, auto-updating with [ Obtainium](https://github.com/ImranR98/Obtainium): [](https://github.com/Jinjinov/OpenHabitTracker/releases) Windows - winget (installs the Microsoft Store version): `winget install OpenHabitTracker` ## Docker image contains a Blazor Server app for one user https://hub.docker.com/r/jinjinov/openhabittracker https://github.com/Jinjinov/OpenHabitTracker/pkgs/container/openhabittracker Set your username and password with environment variables: .env ``` APPSETTINGS_USERNAME=admin APPSETTINGS_EMAIL=admin@admin.com APPSETTINGS_PASSWORD=admin APPSETTINGS_JWT_SECRET=your-extremely-strong-secret-key ``` Replace `your-extremely-strong-secret-key` in Windows terminal: ``` [System.Convert]::ToBase64String([System.Security.Cryptography.RandomNumberGenerator]::GetBytes(32)) ``` Replace `your-extremely-strong-secret-key` in Linux / macOS terminal: ``` openssl rand -base64 32 ``` docker-compose.yml ``` services: openhabittracker: image: jinjinov/openhabittracker:latest ports: - "5050:8080" environment: - AppSettings__UserName=${APPSETTINGS_USERNAME} - AppSettings__Email=${APPSETTINGS_EMAIL} - AppSettings__Password=${APPSETTINGS_PASSWORD} - AppSettings__JwtSecret=${APPSETTINGS_JWT_SECRET} - TZ=Europe/Berlin # replace with your timezone volumes: - ./.OpenHabitTracker:/app/.OpenHabitTracker ``` Timezone strings: [List of tz database time zones](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) (TZ identifier column). The default port is `5050`. You can change it to `80` to avoid typing the port in the address, or to any other free port if `5050` is already in use - update the port in `docker-compose.yml` accordingly. After you login at http://localhost:5050/login you can use the same browser tab to access: - logs: http://localhost:5050/watchdog - OpenAPI json: http://localhost:5050/openapi/v1.json - OpenAPI UI: http://localhost:5050/scalar/v1 ## Sync desktop or mobile app with Docker ### Run the Docker container Choose the platform where you want to host the OpenHabitTracker server: #### Docker Desktop 1. Open Docker Desktop and make sure it shows **Engine running** 2. Open a terminal in the folder containing your `.env` and `docker-compose.yml` 3. Run: `docker-compose up -d` 4. Open `http://localhost:5050/login` in a browser to confirm the server is running 5. Find this machine's IP address: - Windows: `ipconfig` - Mac / Linux: `ifconfig` #### Linux server 1. SSH into your server 2. Install Docker: `sudo apt update && sudo apt install -y docker.io docker-compose` 3. Open a terminal in the folder containing your `.env` and `docker-compose.yml` 4. Run: `docker-compose up -d` 5. Find the server IP: `ifconfig` #### Synology NAS 1. Open **Package Center** and install **Container Manager** 2. Open **Container Manager** → **Project** → **Create** 3. Set the project name to `openhabittracker` 4. Paste the `docker-compose.yml` content, replacing `${APPSETTINGS_...}` placeholders with your actual values 5. Click **Next** → **Done** — the container starts automatically 6. Find your NAS IP: **Control Panel** → **Network** → **Network Interface** ### Enable sync in OpenHabitTracker 1. Open OpenHabitTracker on your device 2. Open the menu and click **Data** 3. Scroll down to **Online sync** 4. Enter the **Address**: `http://` + the IP from your scenario above + `:5050` or whichever port you chose (omit the port entirely if you chose `80`) 5. Enter your **Username** and **Password** from `.env` 6. Check **Remember me** to stay logged in across app restarts 7. Click **Log in** ## Made with: * [Blazor](https://dotnet.microsoft.com/en-us/apps/aspnet/web-apps/blazor) * [Bootstrap](https://getbootstrap.com) * [Bootswatch](https://bootswatch.com) * [CsvHelper](https://joshclose.github.io/CsvHelper) * [DnetIndexedDb](https://github.com/amuste/DnetIndexedDb) * [Markdig](https://github.com/xoofx/markdig) * [WebView2](https://developer.microsoft.com/en-us/microsoft-edge/webview2) * [YamlDotNet](https://aaubry.net/pages/yamldotnet.html) ## Runs with: * [Blazor WASM](https://learn.microsoft.com/en-us/aspnet/core/blazor) * [Blazor Server](https://learn.microsoft.com/en-us/aspnet/core/blazor) * [MAUI](https://learn.microsoft.com/en-us/dotnet/maui) * [Photino.Blazor](https://github.com/tryphotino/photino.Blazor) * [WinForms](https://learn.microsoft.com/en-us/dotnet/desktop/winforms) * [Wpf](https://learn.microsoft.com/en-us/dotnet/desktop/wpf) ## Desktop videos: ![Notes, Tasks, Habits](OpenHabitTracker.Web/videos/desktop-main.gif) ![Search, Settings](OpenHabitTracker.Web/videos/desktop-sidebar.gif) ## Desktop screenshots: [![](OpenHabitTracker.Web/images/desktop_1_settings.png)](OpenHabitTracker.Web/images/desktop_1_settings.png) [![](OpenHabitTracker.Web/images/desktop_2_note.png)](OpenHabitTracker.Web/images/desktop_2_note.png) [![](OpenHabitTracker.Web/images/desktop_3_notes.png)](OpenHabitTracker.Web/images/desktop_3_notes.png) [![](OpenHabitTracker.Web/images/desktop_4_task.png)](OpenHabitTracker.Web/images/desktop_4_task.png) [![](OpenHabitTracker.Web/images/desktop_5_tasks.png)](OpenHabitTracker.Web/images/desktop_5_tasks.png) [![](OpenHabitTracker.Web/images/desktop_6_habit.png)](OpenHabitTracker.Web/images/desktop_6_habit.png) [![](OpenHabitTracker.Web/images/desktop_7_habits.png)](OpenHabitTracker.Web/images/desktop_7_habits.png) [![](OpenHabitTracker.Web/images/desktop_8_backup.png)](OpenHabitTracker.Web/images/desktop_8_backup.png) ## Phone screenshots: [![](OpenHabitTracker.Web/images/phone_1_empty.png)](OpenHabitTracker.Web/images/phone_1_empty.png) [![](OpenHabitTracker.Web/images/phone_2_notes.png)](OpenHabitTracker.Web/images/phone_2_notes.png) [![](OpenHabitTracker.Web/images/phone_3_markdown.png)](OpenHabitTracker.Web/images/phone_3_markdown.png) [![](OpenHabitTracker.Web/images/phone_4_task.png)](OpenHabitTracker.Web/images/phone_4_task.png) [![](OpenHabitTracker.Web/images/phone_5_habit.png)](OpenHabitTracker.Web/images/phone_5_habit.png) [![](OpenHabitTracker.Web/images/phone_6_search.png)](OpenHabitTracker.Web/images/phone_6_search.png) [![](OpenHabitTracker.Web/images/phone_7_settings.png)](OpenHabitTracker.Web/images/phone_7_settings.png) [![](OpenHabitTracker.Web/images/phone_8_backup.png)](OpenHabitTracker.Web/images/phone_8_backup.png)