A privacy-first Flutter diary that captures one short video per day and uses an FFmpeg pipeline to render overlays, geotag subtitles, and concatenate clips into a yearly compilation movie.
From the project's README: Minimalist video diary app.
One Second Diary
One Second Diary is a Flutter video journal that turns a daily recording habit into a shareable "movie of your life." Each day you record or upload a clip between one and ten seconds; over months and years those clips are stitched into a compilation you can play back or hand off to friends and family. The whole concept traces back to Cesar Kuriyama's TED talk, and the project ships with an explicit minimalist-plus-privacy ethos: no accounts, no ads, no payments, no analytics.
Why it matters
- The one-second-per-day ritual, demystified. Most "1 Second Everyday" apps either lock the export behind a subscription or upload everything to a server. This one stores every clip locally in the device's DCIM folder and uses on-device FFmpeg for the rendering, so the diary never leaves the phone.
- Real per-clip editing. Before a clip is filed it goes through
a
SaveVideoPagethat trims it viavideo_trimmer, lets the user pick a profile, choose a date format and color, type a custom subtitle, and toggle automatic geotagging. A retry loop re-attempts location lookup up to three times before falling back to manual entry, which is what makes the calendar view actually feel like a journal. - Year-over-year playback. A dedicated movies viewer stitches
selected days (or a whole calendar year) into a single H.264
MP4 using
ffmpeg_kit_flutter_new. Output is 1080p with audio, bitrated at roughly whatlibx264 -crf 20 -preset slowproduces, so the compiled film is watchable on a TV rather than just on the phone screen. - Practical daily nudges.
flutter_local_notificationsschedules a daily reminder, the app can start recording when you press a volume button (flutter_android_volume_keydown), andtimezone-aware scheduling means reminders fire correctly when you travel.
How it works
The app uses GetX for routing and state — lib/bindings/,
lib/controllers/, lib/routes/, and lib/pages/ follow the
classic GetX shape. Recording is handled by the official camera
plugin, gallery fallback uses image_picker plus the
wechat_assets_picker fork, and flutter_colorpicker plus
flutter_calendar_carousel drive the on-clip styling and the
calendar grid view.
The interesting part is the rendering pipeline. lib/utils/video_encoder.dart
probes the bundled FFmpeg build with ffmpeg -hide_banner -encoders,
parses the result with a regex against the standard
V....D <name> rows, and then picks the best H.264 encoder
available per platform: h264_videotoolbox first on iOS,
libx264 first on Android, with h264_mediacodec and
h264_videotoolbox as fallbacks. The chosen encoder is reused
for every per-day save and every movie export, so the bitrate and
quality stay consistent across the whole compilation. The wrapper
itself (lib/utils/ffmpeg_api_wrapper.dart) is intentionally thin:
it centralises the GPL-vs-LGPL build swap behind a single import so
that swapping the FFmpeg-Kit distribution only touches one file.
Storage lives under the DCIM folder via media_store_plus. The
app stores profiles as separate subdirectories so a single install
can hold a "personal" diary and a "family" diary side by side.
Daily notifications are scheduled through
flutter_local_notifications, the camera orientation is locked via
native_device_orientation, and wakelock_plus keeps the screen
on while recording. Nine languages are bundled under lib/lang/.
The compiled "movie of your life" is generated by selecting days
from the calendar and feeding them through the same encoder used
for individual saves — the result is then handed off to
share_plus, so the same export path works whether you want to
post to a messaging app or save to the gallery.
Caveats
- Android-first. The shipping target is Android (Google Play,
minimum Android 7+ for v1.6 and Android 8+ for the upcoming
Flutter upgrade). iOS builds run from the same codebase, but the
maintainer documents the gaps in
docs/ios.md; you should read that file before testing on a Mac. - FFmpeg binary size. Bundling
ffmpeg_kit_flutter_newships a full FFmpeg binary in the APK/AAB. The release APK is large for a Flutter app, and the GPL-vs-LGPL build choice matters if you intend to redistribute. - No cloud sync. There is no built-in backup or multi-device sync. If you want to preserve your diary across phones you have to rely on the device backup or hand-copy the DCIM folder.
- Single-developer project. Maintenance is driven by KyleKun with sponsorship via GitHub Sponsors and Buy Me a Coffee. Issues are tracked on GitHub and PRs are welcome, but release cadence is whatever the maintainer has bandwidth for.
Deployment notes
git clone https://github.com/KyleKun/one_second_diary.git
cd one_second_diary
flutter pub get
flutter run # connected Android device or emulator
flutter build apk --release
The simplest path for end users is the Google Play listing at
com.kylekun.one_second_diary.
For contributors the android/, ios/, and fastlane/ folders
are all committed; flutter_local_notifications and wakelock_plus
require a foreground service declaration on Android 13+, and the
release builds ship with split-per-ABI APKs plus a universal APK.
Minimum: Android 7+ (v1.6 line) or Android 8+ (the in-progress Flutter upgrade). iOS 15+ once you build from source. The app is fully offline; no server, no backend, no API key.
Integration tip: if you maintain a Grove-style directory like
this one, One Second Diary is a strong reference for any project
tagged diary or flutter-app that wants to demonstrate
on-device video composition with FFmpeg without the usual SaaS
trade-offs.