Seven dense days, in which the “blog” project went from being a static site with a makeshift Flask panel to a small ecosystem: a well-written CMS, images generated by the local model, and a direct line between the two machines at home that now also records what I do. I retrace everything in order, with links to the posts already written in detail.

Sunday: the definitive CMS (.NET 10 + Angular 20 + Hugo)

The week started by throwing away the Flask panel and replacing it with BlogAdmin: REST APIs in ASP.NET Core 10 organized as feature slices (Auth, Posts, Media, Rebuild), an Angular 20 UI with NgRx signal stores, JWT login and a two-container Docker deploy with a shared volume. Plus .NET Aspire to bring up API + Angular + dashboard with a single dotnet run during development.

The result: I write in Markdown with live preview, and Publish runs the Hugo build by itself. From that day on, every post of this week was born there.

Monday–Tuesday: GX10 and Strix Scar 16 finally at the same table

The missing piece was the link between the laptop (Strix Scar 16) and the server (GX10). I configured Copilot on the Scar with a custom GX10-Qwen endpoint pointing at the proxy on the server, enabling toolCalling, and verified the flow with a multimodal test — sending an image from the Scar and having Qwen3.8 Flash Next running on the GX10 comment on it. Details in Connecting the GX10 and the Strix Scar 16.

A technical detail worth remembering: in its custom endpoint, VS Code does not forward the apiKey in requests (it sends an empty `Authorization: *** To tell which machine is speaking, the proxy switched to identification via source IP, with the apiKey as a fallback when it does arrive.

From there also came the big question: does it make sense to sum the laptop’s 16 GB of VRAM and the GX10’s 128 GB of unified memory for “four-hands” inference? The analysis is in a dedicated post (“16 + 128 = 144 GB”) — short answer: for the models I use today, no; the bottleneck is the bandwidth between the two machines, not the memory.

Wednesday–Thursday: the blog that draws its own covers

The CMS now generates its own covers: a /covers endpoint that submits a workflow to ComfyUI with Qwen Image (quantized GGUF 2512 version + Turbo LoRA at 4 steps), polls the status and writes the PNG into static/images/, updating the post’s front matter. A precompiled prompt derives the subject from the title, description and tags; the seed is reproducible. Meanwhile the UI moved to a real layout in Angular Material.

Friday–Saturday: the diary that writes the posts

The most fun idea: if the proxy between VS Code and Qwen sees everything, it can also record. The gx-telegram gateway now has a JSONL activity log with machine, project and the text of the turns — discarding Copilot’s internal prompts and masking secrets. A script (scripts/generate-draft.py) takes the last N days, filters out what is private, turns it into a digest and asks the local model to transform it into a post draft with the right front matter. A systemd timer launches it every Monday at 09:30.

This post is also a test of that flow — with the irony that today’s automatic draft already exists, and I am rewriting it by hand. For now the model recounts well what happened but flattens the numbers and loses the connections between things: for weekly summaries, the human pass stays.

The week’s numbers

  • 19 commits across two repos (15 on the blog, 4 on gx-telegram)
  • 5 posts published, 3 of them with a cover generated by Qwen Image
  • 2 machines linked via proxy, with IP-based identification
  • 1 Flask panel permanently retired

Next week: clean up the draft generator (the digest should include git commits too, not just chats) and see whether the Monday-morning trigger really works without me.