Daymark is a lightweight, privacy-first journaling application for Android that enables you to capture daily thoughts across 9 intuitive categories. Each entry is stored locally, synced securely to your GitHub repository via a dedicated backend service, and formatted with AI-assisted markdown.
Perfect for:
- 📅 Daily reflection & journaling
- 📊 Tracking habits & mood
- 🎯 Recording goals & achievements
- 🍽️ Logging meals & health
- 🌍 Documenting travels
- 💡 Capturing ideas on the go
| Feature | Details |
|---|---|
| 🔐 Secure Sync | App opens freely, but syncing requires a secret passcode set in Preferences |
| 🌙 Dynamic Theming | Beautiful Light & Dark modes (System, Light, or Dark) with smooth transitions |
| 📱 Modern UI | Custom drawer navigation, hero panels, and rounded category cards |
| 🔒 Private & Secure | Entries stored locally first, synced via GitHub App |
| 🤖 AI Formatting | Groq-powered markdown structuring (never alters facts) |
| ⏰ Smart Reminders | Configurable daily reminder notifications |
| 🔄 Background Sync | Foreground service ensures reliable syncing |
| 📦 Offline-First | Works without internet; queues entries for sync |
The app provides 9 pre-configured journaling categories:
- Currently Doing — What you're working on right now
- What I Ate — Meal tracking & nutrition notes
- New Idea — Ideas, inspiration, creative thoughts
- Schedule/Tasks — Daily tasks & to-do lists
- Regret — Reflections on mistakes & learnings
- Success of the Day — Wins, achievements, celebrations
- Travelled To — Travel logs & location notes
- Plan for Tomorrow — Tomorrow's agenda & intentions
- Watched — Movies, shows, educational content
app/src/main/kotlin/com/ximanta/opendiary/
├── MainActivity.kt # Dashboard UI + drawer + category grid
├── PasscodeActivity.kt # Secure passcode entry & storage
├── SettingsActivity.kt # Theme, reminders, passcode setup
├── TasksActivity.kt # Multi-task editor for tasks/plans
├── SyncService.kt # Foreground sync to backend
├── EntryDbHelper.kt # SQLite local storage
├── Config.kt # Configuration constants
├── AlarmScheduler.kt # Reminder scheduling
└── DaymarkPolish.kt # UI animations & dynamic styling
daymark-app/
├── server.js # Express.js REST API
├── render.yaml # Render.com deployment config
├── package.json # Dependencies
└── README.md # Backend documentation
Data Flow:
Android App (Local DB) → HTTP POST (Bearer Token) → Backend Service → GitHub App Auth → GitHub Repo
- Node.js 20+
- GitHub account
- GitHub App credentials
- Groq API key (free at groq.com)
- Render.com account (or any Node.js hosting)
-
Create a GitHub App:
- Go to GitHub Developer Settings
- Grant Contents: Read & write on your private journal repo.
- Note the App ID, Installation ID, and generate a Private Key.
-
Deploy to Render:
- Connect your
daymark-apprepo to Render. - Add the following Environment Variables:
DAYMARK_PASSCODE = <your-strong-secret-passcode> GH_APP_ID = <your-app-id> GH_PRIVATE_KEY = <your-private-key-with-newlines> GH_INSTALL_ID = <your-installation-id> GH_REPO_OWNER = <your-github-username> GH_REPO_NAME = <repo-name-for-journal-entries> GROQ_API_KEY = <your-groq-api-key> MODEL_NAME = openai/gpt-oss-20b
- Connect your
-
Verify backend:
curl https://your-backend-url.onrender.com/health # Expected: {"status":"alive","time":...}
- Android Studio or Termux (with Android SDK tools)
- JDK 17+
- Clone the repo and open it in Android Studio.
- Update
Config.kt:const val BACKEND_URL = "https://your-backend-url.onrender.com"
- Click Build > Build Bundle(s) / APK(s) > Build APK(s).
- Follow the standard setup for Termux (
pkg install kotlin android-tools openjdk-17). - Run the custom build script:
chmod +x build.sh ./build.sh
⚠️ Package Conflict Warning: If you switch between local builds (Termux/Android Studio) and CI builds (GitHub Actions), Android will reject the update because the APKs are signed with different debug keys. You must uninstall the previous app before installing the new one, or ensure your CI pipeline uses your localdebug.keystore.
The app uses a two-tier access model:
- Open UI: Anyone can open the app and type entries locally.
- Secured Sync: To push entries to GitHub, the passcode must be set.
To set the passcode:
- Open the app → Tap the hamburger menu (☰) → Preferences.
- Scroll to the Security section → Tap Set / Change passcode.
- Enter the exact string you configured in the
DAYMARK_PASSCODEenvironment variable on Render.
Entries will now sync silently in the background using the Authorization: Bearer <passcode> header.
- Grant POST_NOTIFICATIONS permission.
- Set your passcode in Preferences (required for sync).
- Select a category from the grid.
- Type your entry and tap Save.
- Entries sync every 15 minutes.
- Check your GitHub repo for synced entries:
2026-10-19/currently-doing.md2026-10-19/meals.md
| Issue | Solution |
|---|---|
| "App not installed as package conflicts" | You are trying to install an APK signed with a different key. Uninstall the old app first. |
| Sync fails with 401 Unauthorized | The passcode in Preferences does not match DAYMARK_PASSCODE on Render. |
| Theme doesn't change | Restart the app. The theme is applied in onCreate(). |
| Entries not syncing | Check your internet connection and verify the backend URL in Config.kt. |
| Layer | Technology | Version |
|---|---|---|
| Frontend | Kotlin | 1.9+ |
| Platform | Android | 26+ (API level) |
| Database | SQLite | Built-in |
| Backend | Node.js + Express | 20+, 4.19 |
| GitHub API | Octokit | 21.0 |
| AI | Groq (OpenAI-compat) | gpt-oss-20b |
Daymark — Open-source journaling, one entry at a time.
⭐ Star on GitHub
Made with ❤️ by @realximanta