How I work

I build software with several AI agents running at once, on one Mac. The Mac is set up so that the repetitive part runs by itself: it checks, waits, retries, and leaves me only what needs a decision. Here is how, with the figures I measured.

A day on my Mac

The jobs that run by themselves, each at its time, in Paris time. The hand is now: what it has passed today is lit. Drag to turn the dial, pinch to move in, point at a light or tap it to read it.

SchoolNews and contentRecords and backupsAgent upkeepIn the cloudInternship, privateAlways on

At set times7 jobs

  • School scan

    08:00 · 14:00 · 20:00

    Reads the Epitech platforms, the school mailbox and the Discord announcements. A headless Claude session turns new deadlines into calendar events and todos on my phone.

  • Trending check

    08:30

    Lists what is new today on GitHub trending and Hugging Face. A headless Claude session reads it and leaves me a short list.

  • Results log

    09:00 · 21:00

    Reads my new commits across my repositories. A headless Claude session adds each one that states a number before and after to my log of measured results.

  • Content scout

    10:00 · 18:00

    Finds candidates for two content projects of mine. A headless Claude session writes the shortlist, and I pick.

  • Memory backup

    21:30

    Copies what my AI agents remember into a git repository, leaving out any file that looks like it holds a secret.

  • Autocorrect backup

    21:45

    Backs up the word list of my autocorrect app to git.

  • Internship jobs

    07:00 · 07:05 · 10:35 · 12:30 · 15:05 · 19:05

    Three jobs for my internship at S14 Capital, up to six runs a day between them. What they do stays private.

Every few minutes or hours5 jobs

  • Reply watch

    Every hour

    Looks in my mail and chats, read-only, for the replies I am waiting on. When one lands, the AI session that asked for it resumes and follows up.

  • Reels analyser

    Every hour

    Transcribes the Reels and videos I send it, checks their claims on the web and files a note for the projects they touch.

  • Claude Code patcher

    Every 30 minutes

    Wakes every 30 minutes and, once a day, fetches the new Claude Code release, applies my interface patches and checks the result in a hidden terminal before switching to it. A headless session repairs a patch that no longer fits.

  • Mail triage

    Every 6 hours

    On GitHub Actions. Pulls the unread mail of each of my mailboxes and has a model score each one from 0 to 3. The noise is binned, the rest lands in an app on my phone.

  • AI news

    Every 12 hours

    On GitHub Actions. Pulls 17 AI news feeds plus Hacker News, Hugging Face papers, arXiv and Reddit, merges the duplicates, ranks the rest and keeps the 20 best for my phone.

Always on9 programs

  • Fleet

    Always on

    Shows every Claude Code session in one grid, and which one is waiting on me.

  • Watcher

    Always on

    Lists on ⌘⌥K the follow-ups that finished something or need me.

  • alt-tab

    Always on

    My ⌘Tab: one tile per window, each with a picture of it.

  • Screenshot

    Always on

    My ⌘⇧5: the file is on disk the moment I click.

  • Opener

    Always on

    Spotlight for apps only, on ⌘Space.

  • Autocorrect

    Always on

    Fixes the word I just typed, accents included, in French and English, in every app.

  • Mac guard

    Always on

    Pauses the background work that is about to freeze the Mac, and resumes it once the machine keeps up.

  • Revive

    Always on

    Loads again any background job that has dropped out of launchd.

  • Remote session

    Always on

    A Claude Code session I can drive from my phone.

The habits

Many agents, one panel

0.87

ms of CPU per frame

I run several Claude Code sessions at once. Fleet, a macOS app I wrote, puts them all in one grid and shows which one is waiting on me. Its panel went from 9.1 ms of CPU per frame to 0.87.

The Mac waits, I don’t

24

checks a day

When an agent sends a mail or a message for me and the next step depends on the answer, it registers the wait and stops. Every hour the Mac looks for the reply. When it lands, the session that asked resumes with its context and follows up.

Nothing slips

31

launchd jobs

A scheduled job the Mac was off for runs at the next login, and one that needs the network waits for it. A guard pauses background work before it can freeze the machine, and a job that drops out of launchd is loaded again.

Rules and results

182

rules in the journal

When one of my agents gets something wrong and the cause is understood, the rule goes into a journal my agents read before they act. A hook reads each shell command before it runs and refuses 66 patterns that went wrong before.

A mistake happens once160 of 182 rules

Checking before saying35

  • “All of them” is said only after every item is checked. A sample is reported as “N of M checked”.

    2 Oct

  • Before a deletion, what it really destroys is checked item by item, and the backup named in its place is opened to see that it holds the content, never picked by its timestamp.

    5 Oct

  • What a filter leaves out is reported as “not read”, never “lost”, and the files are listed before the word.

    19 Oct

  • What a document says is told from the matching lines read whole, never from a list of keyword hits.

    21 Oct

  • A list cut short for reading is read whole first, or reported as “at least”. A search meant to prove that something is absent is never capped.

    6 Oct

  • A number taken from a cut line is reported once the whole output and its header are read, and a figure derived from others once each of them is shown to count the same set.

    6 Oct

  • A size gets a name after measuring one level down, and a count after listing the files it counts.

    7 Oct

  • An app’s share of memory is its footprint, never the sum of its processes’ resident sizes: that sum counts shared frameworks once per process.

    25 Oct

  • A formula fitted to one reading is stated only once a second sample tells the candidates apart.

    25 Oct

  • A document is described from its content, never from its file name.

    29 Oct

  • A macOS feature is checked on the installed version before I am told about it: macOS 26 has no Launchpad.

    25 Oct

  • A sentence that sums up a table is held against each of its lines, the unnamed ones first.

    8 Oct

  • “This row holds no X” is said after its text columns are read, and “our code does not read Y” after a search of the code for Y’s name.

    8 Oct

  • A count taken from a log line is named after reading the code that prints it.

    11 Oct

  • Before saying a mechanism is armed or running, the state it runs on is read right then: code alone does not say which branch runs, nor that it still runs.

    2 Oct

  • What a mechanism will do to one item is worked out by finding everything that sets that item’s state and running each rule on the item’s own data.

    5 Oct

  • A function’s callers are searched by its bare name, not “name(”: one passed as a value calls it too.

    18 Oct

  • “This call cannot do X” is said after running it with its real flags and asking it for X, never from a doc that says so.

    11 Oct

  • A change to a CI workflow is called live once one real run of it has been read to its last step.

    22 Oct

  • A figure in a table I will choose from is read off the running thing, not off where it is written.

    12 Oct

  • When the agent’s guesses fail, the report says so, and “cannot get it” comes only after reading the site’s own code.

    4 Oct

  • An empty count is a failed command until shown otherwise, and text is searched in its decoded form, never in escaped JSON.

    5 Oct

  • What an app shows is reported through the app’s own filters and sort, its source is named after reading the code that draws it, and each thing goes by the name the app gives it.

    6 Oct

  • “Not a hook” is said after listing every hook on that call and what each does to its input, and a start date is laid against everything that changed that day.

    12 Oct

  • “The wiki has nothing on X” is said after searching every name X goes by.

    13 Oct

  • A fact used for something done in my name comes from the newest source on the matter first.

    14 Oct

  • A recommendation rests on its measured effect, item by item: a saving is only the part the change removes, read off the process itself.

    15 Oct

  • A length or a date I give from memory picks candidates: every item near it is listed and told apart on content before one is delivered.

    12 Oct

  • A sign-up step is read off the page of the offer being used (student, trial), never off the product’s front door.

    1 Nov

  • A time stated for the agent’s own action is read off the clock, never off a screenshot or a feeling of how long the work took.

    22 Oct

  • A name someone will act on (a host, an account, a file) is pasted from its source and checked back against it before the message leaves.

    27 Oct

  • Colours to compare are measured where each stands uncovered, over the same backdrop, and a glass effect is judged by its recipe before its pixels.

    27 Oct

  • What causes a look (a blur, a tint) is named after dumping every property of the live layers, not from the values set in code.

    28 Oct

  • A masked value is never completed by a guess: it is read again with what it needs let through, or reported as masked.

    30 Oct

  • “Cancelled” or “confirmed” is said from a message whose subject names the thing, in the account that holds it.

    30 Oct

Secrets and personal data11

  • A URL printed out of private data keeps only its host and its short path segments: tokens hide in paths and fragments, not only in queries.

    2 Oct

  • A filter that prints the lines it matches strips URL queries in the same pipe.

    6 Oct

  • Text that may hold a secret or an identity number is printed through an allowlist of the words wanted, every other line shown only as its length, never through a mask of what to hide: a mask misses what nobody thought of.

    6 Oct

  • A file listing that can reach personal papers prints names through an allowlist, error output included: an error message prints a path whole.

    21 Oct

  • A screenshot of a private page is cropped as tight as the deliverable, debug shots included.

    31 Oct

  • A credential is replaced new-first: the old one is deleted only once the new one has done the job in one real run.

    22 Oct

  • The first call of a guarded kind goes out alone, so the rules for it arrive before any sibling call runs.

    24 Oct

  • A form’s inputs are read by name, never dumped by value, and a browser error on private data is cut to its first line: error logs print headers and HTML.

    19 Oct

  • A JSON response from a personal account is printed field by field, never whole.

    27 Oct

  • A calendar is searched for the one event in question, around its one day, never listed in bulk.

    13 Oct

  • My contact address goes only to the service I named for it.

    11 Oct

Doing what was asked31

  • Before a project is retired, the written archive policy is looked up and followed.

    31 Oct

  • A live agent moves to a launch mechanism never used on this Mac only after a throwaway job has run under it.

    30 Oct

  • A tool that gets removed is also removed from every shell’s startup files, the login shell’s first.

    27 Oct

  • Before a folder moves, every place scripts live is searched for its path and every hit is rewritten.

    30 Oct

  • An installer runs only after everything it writes has been read, the settings file first.

    27 Oct

  • A visual check runs where I look, in my browser, and the reply sticks to it.

    17 Oct

  • “Remove X” removes its code, its data and its name. Anything worth keeping is asked about first.

    2 Oct

  • “The website”, with no name, is searched for across every site I have before one is picked.

    27 Oct

  • Each line of a summary says the thing in full with its link, and what I must decide in my words. The agent’s own upkeep stays out.

    13 Oct

  • When a request names a thing and two targets fit, the one bearing that name wins, and a reading that had to be guessed is confirmed before release.

    3 Oct

  • A fix changes what was asked and nothing else that can be seen or measured. A shortcut that moves another behaviour is dropped or asked about.

    5 Oct

  • What I will see first ships before the deep part starts.

    5 Oct

  • A convention named by its country is applied whole, and “the same X as Y” is applied as Y has it.

    12 Oct

  • A “later” at the end of a message defers its own sentence only: the rest is done now.

    12 Oct

  • The closing next step asks me only for what I can see or decide.

    12 Oct

  • Before a step is handed to me, the agent tries it itself, every way it can. I get only what needs my hands: paying, signing, typing a code.

    6 Oct

  • Before I am pointed at a file or a link, the agent knows what my click opens.

    4 Oct

  • “The research we did” is found in the session transcripts, my own words first, not by searching project files.

    21 Oct

  • Only my words are relayed as mine. An idea of the agent’s is marked as its own.

    2 Oct

  • A block meant to be copied holds the exact text to send and nothing else, and the clipboard is never touched unasked.

    12 Oct

  • Before a drafted reply is shown to me, the thread’s last message is read, and the draft answers it with only what the thread lacks.

    15 Oct

  • A message that rests on a document carries it attached: each mail stands on its own.

    21 Oct

  • A check with two sides says which side failed, and a tool that handles one direction is run once each way before it is called working.

    10 Oct

  • A picture of a real thing is drawn from that thing’s own published data first, never tuned by eye on a copy.

    20 Oct

  • A code block holds only what I will copy. A layout or a list of files goes in a table or in bullets.

    20 Oct

  • A choice I make by hand in a page is saved the moment I make it, even when the action behind it fails.

    26 Oct

  • A fix is checked against what I asked to see, on every item, never against the data it was rebuilt from.

    19 Oct

  • An event I must attend is told with what binds me: start and end times, attendance, where to join.

    29 Oct

  • A turn ends on its report, written after the last tool call.

    30 Oct

  • Touching an automation means reading every prompt of its pipeline against the standing rules, language first, and fixing them in the same pass.

    6 Oct

  • Output left in French is fixed, and a file that gets touched leaves in English throughout.

    11 Oct

Shell and quoting14

  • A quote is never written as a JSON unicode escape in a tool parameter: it arrives as a real quote.

    3 Oct

  • A script holding quotes never goes on a command line, least of all through ssh: it is written to a file. The urge to change its quotes so it fits is the signal.

    4 Oct

  • A quote inside a single-quoted program is written as the regex’s own escape, and a script holding one is run once after each edit.

    9 Oct

  • A script that edits another goes through the file-writing tool, and a small edit through the edit tool, never a regex one-liner over the whole file.

    12 Oct

  • “--” goes before any file name that comes from a variable, since a leading “-” reads as an option. BSD sed takes no “--” and gets absolute paths instead.

    2 Oct

  • Shell-quoted arguments are built only when there are arguments, and a tool’s no-argument form is run once before it goes in its help.

    5 Oct

  • A cleanup that may have nothing to clean never gates the next action behind “&&”.

    11 Oct

  • A list that must keep its order is built one file per call, never from one search over several files, which prints them as they finish.

    13 Oct

  • The session’s own folder, or a parent of it, is never deleted with rm.

    21 Oct

  • Output that a hook saved to a file is read whole before the task’s first command.

    12 Oct

  • A path computed by a command is printed and read in one call, and deleted in the next: a computed cache path once pointed elsewhere, and the delete hit nothing, silently.

    22 Oct

  • In macOS’s bash 3.2, a case inside “$( … )” writes its patterns as “(pat)”: a bare “pat)” closes the substitution.

    26 Oct

  • A refused command ran nothing, its mkdir included: a later write into that folder waits for a call that made it.

    29 Oct

  • A recursive search meant to find every mention uses the system grep: the default one skips gitignored files.

    30 Oct

Edits and hooks7

  • A command that depends on an edit goes in the next message, once the edit’s result is read.

    4 Oct

  • A live hook is run on one sample line right after its edit, before any other call.

    9 Oct

  • A guard is described from its code, never from the calls it let through.

    11 Oct

  • A float in a test is compared with a tolerance, never with “==”: (1 + 0.1) - 1 is not 0.1.

    19 Oct

  • A request about a file another live session is working on starts with that session’s last messages, and is done in one place, not twice.

    13 Oct

  • In a tree other sessions run code from, an import goes in before its first use, or with it: another session’s process died in the gap between two edits.

    23 Oct

  • An edit’s old and new text never end on a space: the trailing blank is dropped.

    30 Oct

Git and shared trees7

  • A commit is read back before it is pushed, never in the command that pushes it.

    12 Oct

  • Every commit names its paths, and in a tree another session works in, nothing of mine waits in the shared index.

    12 Oct

  • When git status shows another session’s changes, an experiment lives in a separate worktree from its first edit.

    12 Oct

  • A commit’s time is told in local time, read off git log with a local date format.

    12 Oct

  • “git add” comes right before the commit, after the last edit and the last test, and the status is empty before the push.

    17 Oct

  • Another session’s edit, set aside to move a shared checkout, is restored after “;”, never at the end of an “&&” chain.

    26 Oct

  • An old commit is undone in a shared tree by hand edits, or reverted in a scratch worktree, never reverted in the shared one.

    31 Oct

Background work and agents17

  • A wait on a process watches its pid, never a pattern match on its command line: one missed the process, the next matched its own shell.

    31 Oct

  • A turn does not end while its background work is still needed: agents are waited for inside the turn.

    3 Oct

  • A long batch starts detached from its first launch, and a wait on the clock never parks a turn: what is measured is reported, and what is not is said.

    4 Oct

  • A detached Python run starts unbuffered, and is called dead only after waiting as long as such runs take. No second run starts beside it.

    13 Oct

  • A retake writes to a new file name, and the good file is replaced only once the new one exists and was looked at.

    2 Oct

  • When a call is cut by the session ending, the command is the first suspect: what it kills is read before it runs again.

    4 Oct

  • What is opened to outlive the session starts with a clean environment, and a launcher is dry-run whole before its first real window.

    11 Oct

  • A scratch folder’s path is written to a file when it is made, and handed to each agent in its brief.

    8 Oct

  • A brief to an agent says what not to run and when to stop and report, and every fact in it is checked like one told to me.

    5 Oct

  • A timeout on a wrapper does not reach the ssh it spawns: the output goes to a file, or the timeout runs on the remote side.

    10 Oct

  • Each run writes output files of its own, with its start and end times printed beside the result.

    11 Oct

  • A script that rewrites a source and imports it again runs without bytecode caching, and a test that fails on just-restored code is rerun after a touch.

    9 Oct

  • A job meant to run on another machine is not trusted to: a heavy job’s brief starts by printing the host name, and stops on this Mac.

    21 Oct

  • The cause of an outage is named only after every reachable layer is probed: ping, TCP connect, banner, what the machine still does.

    16 Oct

  • A watch script is plain sh, with no arrays: it runs under zsh, which read an array index as arithmetic.

    21 Oct

  • A stack starts again only after each of its ports is checked for a listener, never after a filter on the process list.

    23 Oct

  • Before a session is closed, what it started that I use is listed: a server tied to the session dies with it.

    23 Oct

Websites, forms and mail9

  • “No mail from X” is said after a search that includes trash and spam: one search tool skips both.

    29 Oct

  • A write call taken from a site’s own scripts ships after one real run on a harmless target.

    26 Oct

  • Whether a site may be scripted is read in its terms of use first: a no ends it, and no terms found means no scripted calls.

    7 Oct

  • Before offering to submit a form, every field is listed: a captcha makes the last step mine.

    7 Oct

  • A step that needs my hands within a time limit starts once I have said I am ready.

    11 Oct

  • Before a run that spends a login or a one-time code, the branches that never ran are read, and each call the page makes between the fields and the button is awaited.

    11 Oct

  • A change to a public profile is saved once a capture of the form shows it reads as it should.

    26 Oct

  • A fact written in a deliverable is read in the page’s own text, never in a summary of it: summaries paraphrase, and the gaps get filled wrong.

    23 Oct

  • A wait for a login is decided by reaching the logged-in view, never by a guess from a subset of cookies.

    31 Oct

Apps and the Mac15

  • A synthetic modifier key is never held on a Mac in use: the chord is left to me, or the hold is capped at 100 ms.

    2 Oct

  • An app is restarted the way I start it, and called up once it does what I use it for, not once it shows in the process list.

    12 Oct

  • “This app is slow” starts with how its process runs (priority, launchd settings, compressed memory) before its code.

    12 Oct

  • What a script takes from me (the front app, a tab, the clipboard) is given back before every exit.

    12 Oct

  • A frame’s cost is timed inside the drawing code itself, not around the whole event loop.

    12 Oct

  • A before and after are two binaries built from one tree, with and without the change, run in turn over several rounds: an installed copy is not the “before”.

    12 Oct

  • A text field in an agent app gets its edit keys, and is checked with a real ⌘V.

    4 Oct

  • A new scheduled job counts as visible once an offscreen render of Fleet, my session panel, shows its card.

    13 Oct

  • A group of processes gets a name only once each process’s kind is listed.

    12 Oct

  • “Orphan” is said after the owner is found dead, never from a parent pid of 1: system services always have it.

    20 Oct

  • “Unused” is said after the usage record is read, never from a server log.

    12 Oct

  • Before a restart, the checks set to run after it are read and the state they expect is put in place: otherwise they test nothing.

    26 Oct

  • A browser tab is closed only after the tabs are listed by title, never by ⌘W on a guess.

    30 Oct

  • A synthetic click is sent only once the target’s position is read (non-zero, inside its window) and a hit-test confirms the point lands in that window: one click landed in another window.

    22 Oct

  • A network call an app will make is proven from inside an app bundle, never from a script: App Transport Security applies to bundles only.

    1 Nov

Interfaces and visual checks14

  • A browser test script launches WebKit or Firefox, never Chromium, probes included.

    27 Oct

  • A visual change is done once a browser render of it has come back: curl proves what the server holds, not what a browser shows.

    3 Oct

  • Anything that moves is watched once before it ships, and a transition of a second or less is sampled at every frame: each value must go one way only.

    2 Oct

  • A loading bar is full when what I wait for starts: the first sound, the first row.

    2 Oct

  • A box to centre gets a definite width and auto margins, and its centring is checked by measuring both centres in a browser.

    3 Oct

  • A label whose weight or size changes with its state keeps the width of its widest state.

    4 Oct

  • An element that inherits a colour already in transition gets no transition of its own on that colour.

    13 Oct

  • A panel that opens inside a table takes no part in the table’s width, so opening it never shifts the columns.

    5 Oct

  • A change of state is checked by measuring the neighbours and the box around it in every clickable state.

    5 Oct

  • A layout that depends on its content is checked on the worst content in the data: the longest text, an unbreakable word, an empty cell.

    5 Oct

  • “It fits” comes with the spare room measured, in the browser engine I use.

    12 Oct

  • Headless WebKit reports no layout shifts, so a zero from it means nothing: shifts are measured by diffing every element’s position before and after.

    27 Oct

  • An AppKit view that treats a mouse-down as “a click outside” checks the point against what sits on it.

    30 Oct

  • A SwiftUI ForEach whose rows can remove themselves iterates the elements, never indices: the row redraws first and traps out of range.

    30 Oct

The other 22 touch my accounts, my papers, my home network or my safeguards, and stay private.

90

measured results since May

A change that claims to be faster or lighter states its number before and after in the commit. Twice a day a job gathers them into one log.

Measured, not guessed55 of 90 results

Fleet12

  • Panel background AI calls (card names, digests, fact-checks): disk taken by unread logs

    1.9 GB in a month (0.35 MB a call) → none -100%

  • Naming each session's card in the panel (one headless AI call): time per call

    6.3 s → 2.1 s -67% (3×)

  • Panel on a busy Mac: CPU per animation frame

    9.1 ms → 0.87 ms 10.5× less (-90%)

  • Panel on a busy Mac: cost of the once-a-second refresh

    57 ms → 7.4 ms 7.7× less (-87%)

  • Panel on a busy Mac: first layout

    383 ms → 80 ms 4.8× less (-79%)

  • Time the session hook adds to every tool call (200 KB call)

    57 ms → 19 ms -67% (3×)

  • Time the session hook adds to every tool call (0.5 KB call)

    27 ms → 12 ms -56% (2.25×)

  • Main-thread time to re-read a waiting terminal's screen

    2 to 52 ms each time → 0.1 ms 20-520× less

  • Panel: main-thread cost of the once-a-second refresh

    6.5 ms → 3.0 ms -54% (2.2×)

  • Panel: first frame when a group folds

    37 ms → 22 ms -41%

  • Panel: click to first frame when a group opens

    22.5 ms → 15.1 ms -33%

  • Panel: click to first frame when a group folds

    18.0 ms → 14.4 ms -20%

Video-Code11

  • macOS app download, after two size cuts

    220 MB → 72 MB -67%

  • Linux app download, after the same two cuts

    188 MB → 57 MB -70%

  • Render time per frame, once an 8.3 MB buffer stopped being allocated every frame

    9.08 ms/frame → 6.33 ms/frame -30%

  • Code copied byte for byte between the two renderers

    334 lines → 45 lines -87%

  • Text stress-test scene: build time

    318 ms → 197 ms -38%

  • Scene with a background grid, drawn as one shape: execution time

    644 ms → 265 ms -59%

  • 300-frame animation of 3 texts (scale and rotation): render time

    10.6s → 5.1s 2.1× faster

  • Python execution of the text stress-test scene

    0.616s → 0.371s -40%

  • Render of a 300-frame 1080p scene of 47 animated letters: total time

    7.17s → 3.42s 2.1× faster

  • Same render: peak memory

    686 MB → 461 MB -33%

  • Python side of a scene (preparing what the renderer draws): time

    0.954s → 0.298s -69%

My Mac and my agents13

  • Folder-trust script of the AI coding sessions: settings backups left in the home folder

    249 copies (72 MB) → 1 copy -99.6% (249×)

  • Python code checker in an AI coding session with three files open: memory per session

    224 MB → 38 MB -83% (5.9×)

  • Browser tool server started in every AI coding session, used or not (51 of 708): memory

    62-71 MB in every session → none until a browser command runs -100%

  • Terminal showing a working AI coding session, spinner animation turned off: CPU

    about 2.3% CPU → 0.35% CPU -85% (6.6×)

  • Working AI coding session's own process, spinner animation turned off: CPU

    about 8% CPU → 3.5% CPU -56% (2.3×)

  • Headless browser (670 MB) of the AI coding sessions: time it stays open after its last use

    1 h → 10 min -83% (6×)

  • Browser tool started by every AI coding session: memory its npm wrapper kept

    43 to 70 MB each → none -100%

  • Error journal loaded into every AI coding session, per-tool rules given on use: length

    128 lines → 56 lines -56%

  • Context an AI coding session starts with, general sessions: tokens

    44.7k tokens → 38.5k tokens -14%

  • Error journal loaded into every AI coding session, one short line a rule: tokens

    16.8k tokens → 6k tokens -64%

  • Instructions loaded into every AI coding session, same rules: tokens

    10.7k tokens → 4.4k tokens -59%

  • Error journal loaded into every AI coding session: size

    49 KB → 30 KB -39%

  • Instructions loaded into every AI coding session: length

    91 lines → 56 lines -38%

Jarvis, my voice assistant7

  • One-shot AI calls (briefings, readings, reports): disk left behind in unread transcripts

    0.35 MB a call → none -100%

  • Audio held back when the next chunk is late (heard as cut words)

    788 ms → 16 ms -98% (49×)

  • Voice on the Mac when the PC is off: peak memory (the old model froze the Mac)

    18-20 GB → 5.9 GB 3.1-3.4× less

  • Wait before the first sound of a spoken reply

    8.5 s → 4.5 s -47% (1.9×)

  • Silence between two spoken sentences

    1.3 s → 0.02 s -98.5% (65×)

  • Voice rendering on the PC's GPU: time per second of speech

    1.03 s → 0.52 s -49.5% (2.0×)

  • Audio still playing after being told to stop

    1-3 s → 100 ms (nothing left running) 10-30× sooner

This website6

  • Desktop scrolling: slowest frames (p95), glass blur moved off the cards

    p95 66.6 ms → p95 17.7 ms -73%

  • Desktop scrolling: frames dropped

    67 dropped of 125 frames → 7 dropped of 166 frames -92% (share of frames dropped)

  • Background animation back after a trackpad scroll

    410 ms → 135 ms -67%

  • Laptop scrolling, CPU slowed 4×: slowest frames (p95)

    p95 28 ms, 3 late frames → p95 21 ms, 2 late frames -25%

  • Phone home page at rest: frames drawn per second (battery)

    44 frames/s → 25 frames/s -43%

  • Phone home page at rest: style recalculations per second

    60 recalcs/s → 7.5 recalcs/s 8× fewer

my-hub, my Android app5

  • Android build daemon (Gradle): peak memory on an incremental build

    ~1.7 GB → 1000 MB -41%

  • Stylesheet of the page shown inside the app

    52 KB → 35 KB -33%

  • Mail triage AI: price per million tokens, input / output

    0.59 $ / 0.79 $ → 0.15 $ / 0.60 $ -75% / -24%

  • App update download: only what changed (delta update) instead of the whole app

    21.84 MB → 2.84 MB -87%

  • App package size (libraries only the emulator needs dropped)

    59 MB → 21 MB -64%

m3labs.fr, my company site1

  • Company site's call booking: script time to load the visitor's free slots

    about 2 s per load, one call length → 0.5 to 1 s, all three lengths -50 to -75% (2-4×)

The other 35 come from my internship work and stay private.

Questions about any of this? Get in touch.