Morning Report started from a framing decision, not a feature list: Downloads folders don’t stay messy because deleting files is hard, they stay messy because deciding what to delete is expensive, one file at a time. The fix wasn’t to automate the deletion — full automation was considered and rejected almost immediately, since files sitting in Downloads are often there on purpose even when they look like junk. The fix was to automate the presentation of the decision instead: surface ten candidates a morning, one at a time, with a recommendation attached, and let a human click.

That framing set the shape of everything that followed. The pipeline splits labor along the same line: a scoring algorithm handles structure — exact duplicates, junk filename patterns, age, file size — cheaply and locally, before anything ever reaches an API call. Claude handles semantics on top of that pre-filter, reading a filename like FINAL-v2-USE THIS.pdf and explaining in a sentence why it’s a red flag in a way a numeric score never could. Everything runs locally — Python 3, standard library only, macOS Trash instead of permanent deletion — with only filename, size, age, and type ever leaving the machine.

Main takeaways

  • Automate the presentation of a decision, not the decision itself — the friction was never disk space, it was deciding file by file.
  • Split the labor: a cheap structural scorer narrows the field before an API call ever happens; Claude adds the judgment a score can’t articulate.
  • Keeping a human in the loop for every deletion was a deliberate rejection of full automation, not a missing feature.

What I got wrong

  • Don’t yet know if ten files a morning is the right number long-term, or just a reasonable first guess.
  • Haven’t stress-tested the scoring weights against a folder that’s actually been left to rot for a year rather than the relatively tame one this was built against.