Dank Diary
Introduction
Alright so I built a new app called Dank Diary.
This wasn’t originally meant to be a full project, it started as something simple just to track sessions and strains but like most things it turned into a full iOS app with a web component and proper sync.
Main goal was being able to log entries, attach images, and access everything from anywhere without depending on a single device.
Overview
At a high level this is what it does:
- Log sessions with notes, ratings, strain info
- Attach images
- Sync data between devices
- View everything from a web interface
Nothing crazy feature wise, most of the work went into making sure it actually works reliably.
Access
Web app is live here:
https://ios.dankdiary.xyz
TestFlight is here:
https://testflight.apple.com/join/HZxEHcz6
The Actual Problem
Text is easy.
You can throw that in pretty much anything and sync it without issues.
Images are where things start to break.
If you embed them directly your data gets bloated, sync slows down, and everything starts feeling sluggish especially on mobile.
So the main problem this project ended up solving was:
- How to handle media properly
- How to sync that media between iOS and web
- How to do it without blowing up storage or performance
Setup / Architecture
iOS App
Native Swift app.
Local first data model so entries are instant and not dependent on network.
Background sync handles pushing changes up.
Web App
Pretty simple for now.
Mainly read access and sharing.
Not trying to replicate the full mobile experience here, just make the data accessible.
Sync + Auth
Using Sign in with Apple for auth.
Data lives in cloud storage and is tied to the user account.
Images are stored as assets instead of being embedded directly in records.
This keeps things smaller and makes fetching more predictable.
Issues I Ran Into
Couple things that were more annoying than expected:
- Keeping data consistent between iOS and web
- Making image uploads not feel slow
- Avoiding unnecessary storage usage
- Not exposing user data when sharing entries
None of this is complicated individually but when you combine it all it adds up quick.
Monetization
Keeping this simple.
Free version:
- Full functionality
- Sync enabled
- Ads in non critical screens
Paid version:
- Removes ads
- Will add more features later
No ads in the editor. Not worth degrading the core experience.
Why I Built This
This was less about the actual app idea and more about working through:
- Cross platform sync
- Media handling
- Keeping things lightweight
- Building something that actually works outside of a demo
Same type of problems I run into on client work just packaged into a standalone project.
Next Steps
- Improve sharing between users
- Add basic analytics on entries
- Continue optimizing sync performance
Closing
It works.
It syncs.
It does what it needs to do.
Now it just needs iteration.
As always, So long and Thanks for all the Fish!