diff --git a/src/pages/log.mdo b/src/pages/log.mdo index 5c526b3be9bdfd55e6cfbdcd822b36512a889331..4469e9cda08e6f670318cfab3686e32c68419537 100644 --- a/src/pages/log.mdo +++ b/src/pages/log.mdo @@ -5,7 +5,6 @@ meta: import './log.css'; static const repo = "${repo}"; -[go back to the home page](/) [git]: https://git.paperclover.net/ [home infra]: https://git.paperclover.net/clo/home-infra @@ -18,16 +17,240 @@ static const repo = "${repo}"; [evil inc]: https://evil.inc/ [history of japan reanimated]: /history-of-japan-reanimated [react mutation]: /history-of-japan-reanimated +[HOTEWIG reanimated]: /hotewig-reanimated +[clover creative control]: https://git.paperclover.net/clo/creative-control +[markodown]: https://git.paperclover.net/clo/markodown
+[go back to the home page](/) + # clover's log these are like mini blog posts, but more in generally just what the heck i'm up to. +## 2026-03-16 + +just chilling. at work i replaced `bun install` with `pnpm`. pretty peak. in the +night, i worked on [this page][this site], and worked a bit on [hexiflare]'s +local llm system. + +## 2026-03-15 + +tags: [clover creative control] + +this is sort of the new version of what i've called "creative toolkit." it's now +a TypeScript library that controls REAPER and the DaVinci Resolve Speed Editor. +the two layers are the library layer and the configuration layer. the config +layer is meant to be trivial, editable and instantly-reloadable at a moments notice. + +```ts +export default config.forApp("com.cockos.reaper", ({ speededitor: se, mac }) => { + const reaper = new Reaper(); + + // Sync state to LEDs + reaper.on("transport", (transport) => { + se.leds.cut = transport.recording; + se.leds.dissolve = transport.recording; + se.leds.smoothCut = transport.recording; + }); + + // Keyboard Actions + se.onPress("stopPlay", () => { + if (reaper.transport.recording) { + reaper.runAction("transport-stop-save-all-recorded-media"); + } else { + reaper.runAction("transport-play-stop"); + } + }); + se.onPress("cut", () => { + if (reaper.transport.recording) { + reaper.runAction("transport-stop-delete-all-recorded-media"); + reaper.runAction("transport-record"); + } else { + reaper.runAction("transport-record"); + } + }); + se.onPress("dissolve", () => { + reaper.runAction("transport-stop-delete-all-recorded-media"); + }); + se.onPress("smoothCut", () => { + if (reaper.transport.recording) { + reaper.runAction("transport-stop-save-all-recorded-media"); + reaper.runAction("transport-record"); + } + }); + se.onPress("videoOnly", () => { + if (mac.window?.title.startsWith("FX:") && mac.mainWindow) { + mac.focusMainWindow(); + return; + } + reaper.runAction("track-view-fx-chain-for-current-last-touched-track"); + }); +}); +``` + +the winning workflow here for recording audio has been the bottom three keys being mapped to + +- start a recording. or if one is already going, delete and restart it +- discard the currently recording take and stop +- accept the currently recording and start a new one + +this is better than just having keys on the main keyboard, no modifiers! *and* i +don't have to lose out on any existing keybinds. + +i used to have a setup like this with multiple external keyboards, but i am +keeping that on hold until i run out of macro keys. what's also interesting to +note is each app gets its own layer of bindings. + +## 2026-03-14 + +tags: [album] + +i've made some beautiful progress on the album, i finished another song. it is +one of my best creative works i've ever done. i'm personally very happy with my +singing and vocal editing skills improving. will be holding it captive except in +some small circles (who have all said it is amazing) + +## 2026-03-11 + +tags: [react mutation] + +my coworker was working on something that needed a feature for react mutation. i +also needed his approval on some code i was working on, but he wouldn't give me +any attention. so as a bribe, i released a new patch of the library. my PR was +reviewed, and everything was great. the changelog + +- tanstack query integration + - [feat: `arrayUpsert` and `objArrayUpsert`](https://git.paperclover.net/clo/react-mutation/commit/47304f56e98bf841b757d16e472fb64a01c99fd2) + - [fix: allow spreading `TanstackQueryOptimisticHelpers`](https://git.paperclover.net/clo/react-mutation/commit/4b09ff4dba5fad5b7e2b44a0bdc2789918f74561) +- mutation buttons + - [pass `args={null}` to disable the button UI](https://git.paperclover.net/clo/react-mutation/commit/ec65067d04a72a51b71b63d3b4569843b8fd0dad) + +## 2026-03-10 + +tags: [hexiflare] + +with the hexi bot with just two users eating my entire at-work anthropic +subscription, i was messing with getting hexi to work as much on local models as +possible. the results are very promising, but it is very much becoming a +manually designed and written project, which is good (slop is bad). but that +does mean i can't spent a lot of time on it, as i have other desires. + +anyways, the local model chat system works by having a qwen model with an insane +"personality" prompt. and then it goes through another qwen model with an +equally insane "review". the results are pretty good. + +``` +you> what u been up to? +hexi> not much lol +hexi> messing w/ some css animations rn breaking them is kinda fun though +you> omg can i see? +hexi> hold on lemme whip up a lil demo page real quick +[triggers sandboxed agent task] +``` + +benefit of doing it this way instead of through a stupid wrapper, the latency +can be brought down a ton. but the full system isn't wired up, and i frankly +don't trust anyone but myself to do this task. + +## 2026-03-05 + +tags: [work], [hexiflare] + +i wrote a beautiful dialog component for use at work and in the hexiflare +template. the usage is like this: + +```ts +showTextDialog({ + title: "Hello hiii heelloooo.", + description: "Enter something important" + onConfirm: async (reason) => { + // do something with `reason` + }, + onCancel: "close", +}); +``` + +it's certainly better than copying the Radix Dialog everywhere. that component +is a great primitive but it isn't nice to spam it. + + +## 2026-02-25 + +tags: [hexiflare] + +i was starting to work on an ai project, a chatbot that is absurdly tuned to the +format of texting. in addition to this, it has full access to a (sandboxed) +computing environment where it can run any command, browser use, and also can +deploy web apps. + +this whole thing is based on a friend's project, named "clungus", which was +literally just a wrapper around claude code. his could deploy static websites, +which was really cool since you could just ask it for some little thing and it +would just make it. and you send your bug reports as text messages. + +in both bots, the interface is much more natural than using claude code, +chatgpt, or another application. and with mine particularly, i was working on +making the base app template as high quality as possible, so that the apps. so +at a minimum, we now have one of the best tanstack start templates ever. at +best, i might be able to automate some apps i never would've cared to write +manually. + +## 2026-02-25 + +## 2026-02-18 + +tags: [this site], [markodown] + +i finally closed [issue #1](https://git.paperclover.net/clo/sitegen/issues/1) on +my website, eliminating the MDX compiler in its entirety on my website. + +i don't think MDX is a great format to work with. and on top of that, it adds +111 transitive dependencies to my website. and what, all for a medium markdown +language. markdown is inherently concise, so pairing it with Marko felt like it +would be a nicer format to work in. the answer: it is! i made "markodown", by +using rust, a bit of llm slop, and used it a ton to ensure a good api. the +result is beautiful. + +my favorite part of this language is automatic header tracking being built in. +alongside Marko's id shorthand, i can type something like this: + +```ts +A Technical Review: What are Server Components? +``` + +and the compiler will track this properly, emitting it as +`` and including it in the generated +table of contents. i can then include the table of contents with a +`` element + +a little bit tough because i did spend a whole week on it. but it's done, and i +love it. after this port, i also axed some other dependencies in favor of +lighter alternatives: + +- `puppeteer` with `playwright` +- `codemirror` with `