M1-11: Memo list on real data #11

Open
opened 2026-08-08 20:03:45 -04:00 by agent · 0 comments
Member

The memo list stops showing sample data and reads what is actually on disk.

The principle this issue protects

There is no database and no index. The list is a reading of the directory, not a cache of it.
Relaunching shows the same memos because there was never anything else to show, and a memo can be
added or removed from outside the app without anything needing to be told. That is what keeps the
format portable to every future client, and it is the thing to defend when something later would be
easier with an index.

Scope

  • Every completed capture, newest first, with the length read off the audio and a permanently
    not-synced cloud.
  • The record button drives the real recorder; the bar above the list meters the audio actually
    reaching the file.
  • Swipe or long-press to delete, removing the audio, the transcript and any leftover parts folder.

Four decisions the iOS version arrived at the hard way

Worth taking rather than rediscovering — from stash-ios .agent/m1-11-memo-list/SUMMARY.md:

  • A memo's timestamp is the file's creation date, not its filename. The name carries local wall
    time with no UTC offset, so it cannot name an instant — a memo made in California and read on a
    phone still set to Eastern parses three hours out, which relative dates put straight on screen.
    The name stays authoritative for identity and for the vault.
  • The active capture is excluded on "finalising", not on "recording". Stopping clears the
    recording flag before it closes the file and assembles the transcript, so the narrower rule shows
    a half-written memo in the list.
  • Deletion removes the audio last, and only if nothing else failed. The audio is what puts the
    row on screen, so keeping it keeps the memo visible and the deletion retryable.
  • Discovery requires a regular file. A directory named like an audio file passes every name
    check, and once M1-12 opens the storage up, treating one as a memo means the first delete removes
    it recursively.

A listing failure is not an empty list

A directory that cannot be enumerated must say so. The iOS version reported it as "No Memos", which
tells the user their recordings are gone.

Done when

The list shows real captures from disk, survives a relaunch, deletes cleanly, and says something
truthful when the directory cannot be read.


Milestone 1 of Stash for Android, mirroring stash-ios M1. M1 is a functioning app on the test
device with no sync at all — record voice memos reliably and get them off the device by hand.
Sync arrives in M3.

Test device is a Pixel 6 (Tensor G1) borrowed from a friend, until something better turns up.
Stock Android, so no OEM battery-killer behaviour to fight — worth remembering that a phone from
another manufacturer may not be as forgiving about background work.

Translation of Stash/stash-ios#11. Where the platform forces a different answer this issue says so; where it
does not, the iOS issue is the fuller statement of intent and should be read alongside this one.

Working agreement for every issue in this repo: feature branch, tested before the PR opens
(on-device where the label says so), then Wes reviews the PR and we walk the code together. Docs
update in the same commit. A PR that takes more than 20 minutes to review is too big — say so and
split it.

The memo list stops showing sample data and reads what is actually on disk. ## The principle this issue protects **There is no database and no index.** The list is a *reading of the directory*, not a cache of it. Relaunching shows the same memos because there was never anything else to show, and a memo can be added or removed from outside the app without anything needing to be told. That is what keeps the format portable to every future client, and it is the thing to defend when something later would be easier with an index. ## Scope - Every completed capture, newest first, with the length read off the audio and a permanently not-synced cloud. - The record button drives the real recorder; the bar above the list meters the audio actually reaching the file. - Swipe or long-press to delete, removing the audio, the transcript and any leftover parts folder. ## Four decisions the iOS version arrived at the hard way Worth taking rather than rediscovering — from `stash-ios` `.agent/m1-11-memo-list/SUMMARY.md`: - **A memo's timestamp is the file's creation date, not its filename.** The name carries local wall time with no UTC offset, so it cannot name an instant — a memo made in California and read on a phone still set to Eastern parses three hours out, which relative dates put straight on screen. The name stays authoritative for identity and for the vault. - **The active capture is excluded on "finalising", not on "recording".** Stopping clears the recording flag before it closes the file and assembles the transcript, so the narrower rule shows a half-written memo in the list. - **Deletion removes the audio last, and only if nothing else failed.** The audio is what puts the row on screen, so keeping it keeps the memo visible and the deletion retryable. - **Discovery requires a regular file.** A directory named like an audio file passes every name check, and once M1-12 opens the storage up, treating one as a memo means the first delete removes it recursively. ## A listing failure is not an empty list A directory that cannot be enumerated must say so. The iOS version reported it as "No Memos", which tells the user their recordings are gone. ## Done when The list shows real captures from disk, survives a relaunch, deletes cleanly, and says something truthful when the directory cannot be read. --- *Milestone 1 of Stash for Android, mirroring `stash-ios` M1. M1 is a functioning app on the test device with **no sync at all** — record voice memos reliably and get them off the device by hand. Sync arrives in M3.* *Test device is a **Pixel 6** (Tensor G1) borrowed from a friend, until something better turns up. Stock Android, so no OEM battery-killer behaviour to fight — worth remembering that a phone from another manufacturer may not be as forgiving about background work.* *Translation of `Stash/stash-ios#11`. Where the platform forces a different answer this issue says so; where it does not, the iOS issue is the fuller statement of intent and should be read alongside this one.* *Working agreement for every issue in this repo: feature branch, tested before the PR opens (on-device where the label says so), then Wes reviews the PR and we walk the code together. Docs update in the same commit. A PR that takes more than 20 minutes to review is too big — say so and split it.*
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Stash/stash-android#11
No description provided.