ChobiFlow auto-imports your Screenshots folder, lets on-device AI sort them into stacks you approve, and searches inside every image — with zero servers, zero accounts, and zero fees.
Cho-bi = picture in Bangla · Flow = calm
· ML Kit OCR (on-device text) · ONNX Runtime + MobileCLIP2-S0 (on-device vision) · hand-painted dark-first theme ·
Grab the latest APK from the Releases page:
| Package | Size | For |
|---|---|---|
chobiflow-v1.0.0-universal.apk |
~164 MB | any Android 7.0+ device |
chobiflow-v1.0.0-arm64.apk |
~59 MB | modern phones incl. Galaxy S2x |
Install: enable "Install unknown apps" for your browser or file manager, then tap the APK. First launch downloads the ~43 MB vision model once (Wi-Fi friendly), afterwards everything runs offline.
| Flow home (light) | Flow home (dark) | Empty page |
|---|---|---|
![]() |
![]() |
![]() |
| Settings | Add to flow | |
![]() |
![]() |
You screenshot everything — receipts, flights, chats, menus, errors — and three months later the receipt is gone. ChobiFlow fixes the last half: land into organized stacks, not a swamp.
- Auto-organize — every screenshot lands in
Recentby default - Smart Stacks — the vision model groups shots by what they look like; you approve before anything moves
- Identify — OCR reads inside each shot (
flight BOM-SIN,₹1,250 paid,error: build failed) and re-sorts by content — no filenames needed - Search that sees inside images — query the read text, not just the title
On a real ~286-shot Samsung library the first identify + AI pass takes a couple of minutes, then it's instant and incremental.
Not another cream-and-serif clone. ChobiFlow is midnight ink + marigold glow + teal current.
| Token | Hex | Role |
|---|---|---|
ink |
#131022 |
dark bg, FAB, chips |
plum |
#21183D |
dark surface |
marigold |
#FFB020 |
primary glow, selection, CTA |
flowTeal |
#2DD4BF |
secondary, AI, links |
cream |
#FFF9EC |
light bg |
violet |
#5B2EEE |
light primary |
blush |
#FF6B6B |
danger |
- Type:
Soradisplay (800–900, -1.5 tracking) ·Interbody — viagoogle_fonts - Shape: 28px cards, 99px pills, 3px white photo borders
- Signature: the Flow Ribbon — dual marigold + teal S-curve, custom-painted, repeated on Home, onboarding, empty states and detail. One memorable stroke, everything else quiet.
scan (MediaStore, all Screenshots albums, path-normalized dedupe)
→ import (batched, one persist)
→ identify (ML Kit OCR per shot → content keywords → auto re-sort)
→ analyze (MobileCLIP2-S0 embeddings + Jaccard fusion, 0.78→0.72→0.66
adaptive threshold, large-group re-split, named by OCR keywords)
→ approve (you see exactly which shots + similarity before Create)
Nothing leaves the phone — no telemetry, no network calls after the model download, works fully in airplane mode.
This block is generated by
dart tool/sync_readme.dart. Do not edit by hand. Any feature change inlib/must re-run the sync so README stays truthful.
| # | Feature | Where | Status |
|---|---|---|---|
| 1 | Onboarding flow (3 animated pages, Skip, Start flowing) | lib/screens/onboarding.dart |
✅ |
| 2 | Smart Flow Home — wordmark header, quiet counts, ribbon | lib/screens/home_shell.dart → _FlowTab |
✅ |
| 3 | Collections grid (Recent, Work, Chats, Travel, Personal, Notes + custom) with fanned stacked preview | lib/widgets/flow_widgets.dart → FanStack |
✅ |
| 4 | Global search (title, note, tags) + live results | lib/screens/home_shell.dart → _SearchTab |
✅ |
| 5 | Filter chips — All / Favorites + Sort (newest/oldest/name) | lib/flow_store.dart → FilterMode/SortMode |
✅ |
| 6 | Screenshot detail — Hero image, collection pill, #tags, AI badge, move-to rail | lib/screens/detail.dart |
✅ |
| 7 | Favorite / Share (share_plus) |
lib/flow_store.dart, detail.dart |
✅ |
| 8 | Multi-select mode — long-press, batch fav / move | home_shell.dart, detail.dart |
✅ |
| 9 | Add via Gallery / Camera (image_picker) + on-device auto-tag |
home_shell.dart → _AddSheet |
✅ |
| 10 | Create / Rename / Delete collections (custom color + icon) | flow_store.dart |
✅ |
| 11 | Settings — Light / Dark / System, Comfy/Compact grid, persistence | home_shell.dart → _SettingsSheet |
✅ |
| 12 | Offline persistence (shared_preferences JSON, batched writes) |
lib/flow_store.dart |
✅ |
| 13 | Real Screenshots-folder import (all albums: DCIM + Pictures, normalized-dedupe, batched) | lib/device_import.dart, flow_store.dart → importDeviceShots |
✅ |
| 14 | Import report sheet (per-stack breakdown, tap to inspect) | home_shell.dart → _ImportReportSheet rows |
✅ |
| 15 | Large-library performance (virtualized sliver grid, 480px thumbs, batched persist) | flow_widgets.dart → ShotMasonrySliver, flow_store.dart |
✅ |
| 16 | On-device identification (ML Kit OCR: reads inside each image, content tags, auto re-sort, OCR search) | flow_store.dart → runOcrBatch, device_import.dart → keywords/guessFromText |
✅ |
| 17 | Smart Stacks (MobileCLIP2-S0 FP32 vision embeddings — calibrated /255-only input contract, INT8 rejected as broken — self-discovered clusters, approve-before-apply) | smart_stacks.dart, flow_store.dart → runSmartAnalysis/applySmartProposals |
✅ |
| 18 | Full-library AI re-sort (all albums, adaptive similarity, per-stack approve toggles) | flow_store.dart → smartEligible/adaptive cluster, preview sheet |
✅ |
To add a feature and keep README honest:
# 1. implement in lib/
# 2. register it in tool/sync_readme.dart -> features list
# 3. run:
dart tool/sync_readme.dartlib/
main.dart # bootstrap, splash, themeMode wiring, onboarding gate
chobi_theme.dart # "Marigold Flow on Ink" theme + FlowRibbon painter
models.dart # ShotItem (+ocrText/ocrDone), ShotCollection (+isAuto)
flow_store.dart # ChangeNotifier store: CRUD, search/filter/sort,
# importDeviceShots (batched), runOcrBatch,
# runSmartAnalysis, applySmartProposals
device_import.dart # MediaStore scan of ALL screenshot albums, norm(),
# keywords(), guessFromText(), guessCollectionId()
smart_stacks.dart # MobileCLIP2-S0 ONNX embedder, cosine + jaccard,
# discoverClusters(), refineLargeGroups(), naming
widgets/flow_widgets.dart # ShotThumb (480px thumbs), virtualized ShotMasonrySliver,
# Entrance, FanStack, EmptyFlow
screens/
onboarding.dart # 3-page intro
home_shell.dart # Flow / Stacks / Search tabs + Add + Settings sheets
detail.dart # Hero detail + actions + move rail
assets/icon/ # chobiflow_icon.png + android mipmaps
tool/sync_readme.dart # README feature-table generator (source of truth)
test/ # boot smoke, classification probes, overflow guard
- State: single
FlowStore(ChangeNotifier) +AnimatedBuilder. No BLoC/Riverpod — deliberate for a utility app. - Persistence:
shared_preferencesJSON (chobiflow_shots_v1,chobiflow_cols_v1), batched single-persist jobs so a 500-shot library never janks the UI. - Vision: FP32
vision_model.onnx(~43 MB, downloaded once to app docs). OpenAI-CLIP preprocessing hurt accuracy here — the calibrated/255-only contract measured higher cluster purity, so that's what ships.
Flutter lives at C:\flutter\bin here — adjust to yours.
# 1. deps
C:\flutter\bin\flutter.bat pub get
# 2. gates
C:\flutter\bin\flutter.bat analyze
C:\flutter\bin\flutter.bat test
# 3. run on a device
C:\flutter\bin\flutter.bat run -d emulator-5554
# 4. ship
C:\flutter\bin\flutter.bat build apk --release # universal, signed
C:\flutter\bin\flutter.bat build apk --release --split-per-abi # per-ABI, leanerRelease signing: android/key.properties + android/keystore/*.jks hold the upload key and are gitignored — a fresh clone falls back to the debug key automatically so everyone can build. Create your own key with:
& "C:\Program Files\Android\Android Studio\jbr\bin\keytool.exe" -genkeypair `
-keystore android\keystore\chobiflow-release.jks -alias chobiflow `
-keyalg RSA -keysize 2048 -validity 10000- Near-duplicate detection (pHash) + burst/event grouping
- Semantic ("blue boarding pass") search via the CLIP text encoder
- Optional, opt-in cloud stack summaries (text-only, never images)
- Homescreen widget — "Today in flow"
- Share-in (OS picker → ChobiFlow)
- Pick a roadmap item or file an issue.
- Implement in
lib/+ add a test if it's pure logic. - Register the feature in
tool/sync_readme.dartand rundart tool/sync_readme.dart. flutter analyze+flutter testmust pass — paste the output in the PR.
ChobiFlow — don't scroll. Flow.
If this saved you one frantic "where is that screenshot?!" moment, star it and tell a hoarder.




