What I am trying to do
I want to demo the desktop app to other people without showing every project on my machine. The sidebar and every section list all of them, client work included, and nothing in the UI narrows that down.
What I found looking for a workaround
The README says:
The --project and --exclude flags work on all commands and can be combined with --provider.
That is not the case. Only report, overview, web, status, today, month and export declare them. Seven others do not: sessions, models, compare, audit, optimize, yield and spend.
$ codeburn sessions --project my-company
error: unknown option '--project'
So a filter passed down from the Electron layer only reaches the one status call. The Sessions list keeps showing everything, which is what sent me looking at the CLI in the first place.
The second thing I hit is subtler. filterProjectsByName treats every pattern as a raw substring, so excluding a project by its path also takes out the neighbors that share the prefix:
$ codeburn sessions --exclude=/Users/me/work/my-company
# my-company-kit disappears too
There is no pattern I can type that means this project and not its siblings. isProxiedPath already handles the same problem for proxyPaths by checking a path-segment boundary.
What I would like to propose
The flag gap looks cheap to close. All seven commands already funnel through parseAllSessions, so the existing filterProjectsByName can be applied at that one point. yield and spend parse inside computeYield and computeSpendFlow, which would take the patterns as optional arguments.
For the substring problem, an absolute path (POSIX or Windows drive) would match the way isProxiedPath matches: equal to the project path, or a prefix of it on a path-segment boundary. Anything that is not a path stays the loose substring people actually type, so --project my-company still covers my-company-kit and worktrees. I read this as a bug fix rather than a behavior change, since anyone passing a full path today already gets neighbors they did not ask for.
Then a Projects pane in Settings, one switch per detected project. I put the filter in ~/.config/codeburn/app-filter.json and read it in the main process, since that is where the CLI argv gets assembled and renderer storage never reaches it. No file, or empty lists, means no filter, so nothing moves for anyone who never opens the pane.
Two decisions in there I am less sure about. The pane fetches its own project list without the filter applied, because scoping it would hide the projects the checklist exists to switch back on. And patterns go out as --project=<value> rather than two argv entries, because a Claude project directory is encoded as -Users-me-Web-thing and a leading dash in its own slot parses as a flag.
Before I open a PR
This works locally against my real data on macOS, with tests. Asking first, per CONTRIBUTING: is this a direction you want, and would you rather have it as one PR or split between the CLI side and the desktop side?
If the pane is not something you want in the app, I can contribute just the CLI fixes.
What I am trying to do
I want to demo the desktop app to other people without showing every project on my machine. The sidebar and every section list all of them, client work included, and nothing in the UI narrows that down.
What I found looking for a workaround
The README says:
That is not the case. Only
report,overview,web,status,today,monthandexportdeclare them. Seven others do not:sessions,models,compare,audit,optimize,yieldandspend.So a filter passed down from the Electron layer only reaches the one
statuscall. The Sessions list keeps showing everything, which is what sent me looking at the CLI in the first place.The second thing I hit is subtler.
filterProjectsByNametreats every pattern as a raw substring, so excluding a project by its path also takes out the neighbors that share the prefix:There is no pattern I can type that means this project and not its siblings.
isProxiedPathalready handles the same problem forproxyPathsby checking a path-segment boundary.What I would like to propose
The flag gap looks cheap to close. All seven commands already funnel through
parseAllSessions, so the existingfilterProjectsByNamecan be applied at that one point.yieldandspendparse insidecomputeYieldandcomputeSpendFlow, which would take the patterns as optional arguments.For the substring problem, an absolute path (POSIX or Windows drive) would match the way
isProxiedPathmatches: equal to the project path, or a prefix of it on a path-segment boundary. Anything that is not a path stays the loose substring people actually type, so--project my-companystill coversmy-company-kitand worktrees. I read this as a bug fix rather than a behavior change, since anyone passing a full path today already gets neighbors they did not ask for.Then a Projects pane in Settings, one switch per detected project. I put the filter in
~/.config/codeburn/app-filter.jsonand read it in the main process, since that is where the CLI argv gets assembled and renderer storage never reaches it. No file, or empty lists, means no filter, so nothing moves for anyone who never opens the pane.Two decisions in there I am less sure about. The pane fetches its own project list without the filter applied, because scoping it would hide the projects the checklist exists to switch back on. And patterns go out as
--project=<value>rather than two argv entries, because a Claude project directory is encoded as-Users-me-Web-thingand a leading dash in its own slot parses as a flag.Before I open a PR
This works locally against my real data on macOS, with tests. Asking first, per CONTRIBUTING: is this a direction you want, and would you rather have it as one PR or split between the CLI side and the desktop side?
If the pane is not something you want in the app, I can contribute just the CLI fixes.