the week turned from building butter to drawing butter. the client already worked — log in, hold a circuit, wear a session, even two at once — and then, over one day, the whole of where it is going got put down on paper. not a single feature landed. four plans did
the gates that got here
butter earns each step with a measured gate before the next one opens. proto first — xml-rpc login over https, the udp circuit with its acks and resends, a message template parser, all agreeing with a real sim. then a session as a value, two logged in on one thread, and what a second session actually costs (nearly nothing on the host, real money on the wire). then one Arc<RegionState> per region so two sessions don't decode the same sim twice, capabilities as a allowlist, and a renderer that splits one renderer, many views — a second view costs a struct, not an architecture
by the end of that run the client could instance an alt from a script (client.bot.login), possess another session in the same region instantly, and describe its own two-bar chrome in luau and have rust draw it. the seams were proven. what was missing was the map
the four plans
one day, four documents, and the shape of the whole client settled:
- a scriptable ui suite — the chrome grows from two bars into windows, panels, buttons, text fields, sliders, lists. luau owns what the ui is, rust owns how it looks, and a click still comes back as an action string. the state lives per session, not in a global — the same
no gCurrentAgent rule the whole codebase is built on
- a browser that is actually usable — parcel media, media on a prim, and safe links, on the cheap. the recommendation is servo embedded as a library, rendered offscreen into a buffer butter can push onto a ground texture or a prim face, its network gated by the same capabilities the session already carries
- the default sl ui, as a drop-in — the ~5900 xml files of the real viewer's interface, re-described in luau instead of loaded by a c++ factory. every floater weighed, kept or dropped, and the debug-settings list used as the feature map of what a user actually touches
- a login that mirrors ll's — the wire protocol and the password hashing are already faithful; now the screen and the sub-account roster get designed too. a primary login owns the process, and the alts and bots live one floater away
why draw before building
the direction is the point, and it is consistent. no globals — a session is a value, passed in, never reached for. luau is the surface, rust is the engine. the fork's interface gets replaced, not copied, because copying would drag its singletons along. and everything is described first and verified by a command before it is accepted, so a plan that can't name its own gate never gets to pretend it's done
图 is a plan. the client already runs; this week is the drawing that decides what it becomes, and the drawing is done