Skip to content
Open Apps
Menu
Submit app

one_second_diary

@KyleKun/one_second_diary

media

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 SaveVideoPage that trims it via video_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 what libx264 -crf 20 -preset slow produces, so the compiled film is watchable on a TV rather than just on the phone screen.
  • Practical daily nudges. flutter_local_notifications schedules a daily reminder, the app can start recording when you press a volume button (flutter_android_volume_keydown), and timezone-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_new ships 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.

On this page
  1. Why it matters
  2. How it works
  3. Caveats
  4. Deployment notes