Repository navigation
Releases: PEEKPerformer/Janus
Release list
Janus v0.5.22
Plane Mode auto-refresh UX fix
The pack button no longer "does nothing" in Background mode. Packing is now a shared, observable state, so the screen reflects whichever source started a pack:
- Your pack (the button) gets the full progress takeover, as before.
- An automatic refresh (on-open or while-you-browse) now shows a quiet banner instead of hijacking the screen.
- The button is never a dead tap: it shows "Auto-refreshing your pack…" (with a spinner) while a background refresh runs, reads "Refresh now" in Background mode when idle, and "Pack for flight" otherwise.
On-open and background refreshes now run through one shared path, so they can't drift. 806 tests passing; device build verified.
Janus v0.5.21
Plane Mode "Background" auto-refresh — stays fresh while you browse
Auto-refresh is now a 3-way choice (Off / On open / Background):
- Background: just use the app — Janus quietly keeps your offline pack current in the background as you browse Reddit/Lemmy, re-packing whenever it's over 6h stale. No sitting on a packing screen.
- On open: re-pack only when you open Plane Mode and it's stale.
- Off: manual only.
A process-wide pack lock means the background refresher and the manual button never double up the request load, and the background refresh yields the moment the app leaves the foreground. Pack age shown inline. 804 tests passing; device build verified.
Janus v0.5.20
Plane Mode auto-refresh (Phase A): opt-in setting that silently re-packs when you open Plane Mode and the pack is over 6h stale — so you never grab an old snapshot before a flight. Shows pack age inline ('Packed 3h ago'). Off-able. Phase B (iOS background top-ups) is a separate native pass. 801 tests passing; device build verified.
Janus v0.5.19
Fix: the community selector (plane mode + feed) no longer shows "you haven't joined any communities yet" while it's actually still loading. Subscriptions now paint instantly from an SWR disk cache and reconcile in the background, with a real spinner on a cold load. 794 tests passing; Release device build verified.
Janus v0.5.18
Image deep dive + the vote-color fix
Images
- Lightbox rebuilt on Reanimated (UI thread, 120fps): pinch / pan / double-tap / dismiss all run off the JS thread. Swipe-to-dismiss now tracks your finger in any direction, fades the backdrop with the pull, and on release either flings out (velocity-aware) or springs back.
- Windowed gallery pager: a big gallery used to mount every full-res page at once; now only the current ±1 mount, and the next/previous image is prefetched so a page-turn lands on a decoded image.
- memory-disk cache on every feed / gallery / reel / viewer image — re-scrolling no longer re-fetches or re-decodes.
Fix
- Swipe upvote is warm (orange), downvote is blue again — matches the vote buttons (was flipped in the motion rebuild).
Deferred to their own passes: lightbox blur-up placeholders, bounded feed-time prefetch (kept out to avoid the old rate-limit flood), and the unknown-dimension layout-shift fix. 793 tests passing; Release device build verified.
Janus v0.5.17
Native motion system — the Apollo-feel foundation, live on three surfaces
Adds react-native-reanimated 4 (UI-thread, 120fps-capable) and a shared motion vocabulary, then wires it onto the surfaces you touch most.
- Swipe-to-vote rebuilt: finger tracks 1:1 then rubber-bands past the last threshold; the haptic fires the instant a tier arms and escalates (selection → medium); the snap-back spring inherits your release velocity.
- Action sheets spring up, drag-to-dismiss (flick to throw closed), backdrop fades with the drag, selection haptic on pick.
- Press states: sort + time-window chips dip under the finger and spring back.
Under the hood: three intent-named springs (snappy / gentle / playful) + an iOS rubber-band + one escalating haptic dispatcher, used everywhere so the feel stays consistent.
Not yet converted: the image viewer (pinch/zoom/dismiss) — getting its own careful pass next. 791 tests passing; Release device build verified under New Architecture.
Janus v0.5.16
Time-window sorting for Top — feed and search, seamless across Reddit + Lemmy
You can now pick the time window for Top (and Controversial on Reddit) right where you sort — Past Hour, Today, This Week, This Month, This Year, All Time.
- Feed: a window chip appears beside the sort chips whenever the active sort needs one. Tap it for a labeled picker. Works in both list and gallery layouts.
- Search: the same labeled picker (previously a raw tap-to-cycle chip).
- Under the hood: one set of six buckets maps to each source natively — Reddit's
?t=, Lemmy'sTopHour/TopWeek/… — so a mixed feed sorts uniformly. Controversial on Lemmy (which has no window) is handled gracefully.
781 tests passing.
v0.5.15 — richer usage analytics + Neural Engine auto-recovery
Added — usage analytics phase 2 (opt-in, content-free)
The telemetry measured navigation but little about what the app is for. New shape-only events (sources, counts, kinds, codes, confidence bands — never text, titles, URLs, usernames, or community names), all behind Settings → Share usage analytics:
post_opened{source, has_image, has_video, has_link, companions}vote{source, target, dir} — feed swipe, post, and commentcomment_submitted{source, top_level};post_created{source, kind, nsfw}subscribe{source, on}ai_verdict{index, confidence_bucket, trigger, surface} — deduped per item; raw probabilities never leave the devicesearch_performed{scope, unified, sources, result_count, zero_results}community_twin_opened{from_source, twin_source, verified}merged_discussion_opened{source, companions, cross_network}
Also in this build
- Neural Engine auto-recovery (v0.5.14): the Core ML compile now self-heals on a bounded crash budget — no button, no re-download; gives up after 2 to avoid thrash.
- App version in Settings (v0.5.13).
v0.5.14 — Neural Engine auto-recovery
Changed
- The Neural Engine now recovers itself — no button required. The crash-fence that protects against a native Core ML compile crash was a permanent latch; it's now a bounded crash budget. Every launch auto-retries the compile, a clean compile resets the budget, and only after 2 failed compiles does it give up and settle on the CPU engine. A transient failure (memory pressure on a 711 MB fp16 compile) self-heals with zero taps; a genuinely uncompilable model can't thrash — at most two bad launches, then it stops.
- Catchable compile failures charge the budget too, so a deterministic non-crashing failure can't retry every launch forever.
- The legacy permanent-poison flag is ignored, so installing this build grants a fresh budget — a device stuck on the CPU from a past crash auto-attempts the recompile on first launch.
- The manual Retry on Neural Engine button stays as an override for once the budget is spent (still no re-download).
Telemetry
ai_lens_readynow carriescoreml_crashes(how many attempts the ANE took).
Carries v0.5.13 (in-app version in Settings) and everything prior.
v0.5.13 — app version in Settings
Added
- The installed version now shows in-app. A 'Janus vX.Y.Z (build)' line sits at the bottom of Settings, so 'is the fix on my phone yet?' is answerable without checking the IPA filename.
Carries v0.5.12 (Retry on Neural Engine recovery button), v0.5.11 (comment AI-chip fix + backend telemetry), and everything before.