site banner

Tinker Tuesday for May 12th, 2026

This thread is for anyone working on personal projects to share their progress, and hold themselves somewhat accountable to a group of peers.

Post your project, your progress from last week, and what you hope to accomplish this week.

If you want to be pinged with a reminder asking about your project, let me know, and I'll harass you each week until you cancel the service.

2
Jump in the discussion.

No email address required.

Had a rough week at work, so no tinkering for me.

How have you been doing @Southkraut?

Got quite a bit done.

I generally took a step back from vibe coding to clean up my architecture and do some proper low-level design work instead of letting the copilot go wild. It had done so a little too much, and the codebase had become somewhat bloated and intransparent, so this change of policy was, in retrospect, overdue. I also stopped grinding technical issues in order to switch to new features. Nothing ready to show so far; I'm just making NPCs (cylinders really) run around, seek food, avoid or attack each other.

Some time ago, I had an idea for a project in work. As other more pressing matters kept coming up, I never had time to pursue it, but I have some downtime now and would really like to look into it.

The idea I'm describing is listed in terms of progressive utility and difficulty, where each "step" is more useful and more difficult than the preceding one, but even step 1 would be useful in its own right.

My company's core demographic is old people. The most recent census in my country was in 2022, and they've released the figures for the mean age in each district (I'm not sure if it's done on the basis of postal or electoral districts: I'll just say postal districts for convenience). Step 1 would be to produce a map of the country broken up into postal districts, with colour-coding for mean age (say, a gradient running from light blue to dark blue for young to old). Hovering one's cursor over a specific postal district would produce a pop-up window displaying the mean age in that district.

Step 2 would be the above, but using a weighted average age rather than a raw average. A postal district with a mean age of 60 but a population of 1,000 is more valuable than a postal district with a mean age of 70 and a population of 100. This might be as simple as multiplying mean age by population to get the districts' cumulative age in man-years. Hovering one's cursor over a specific postal district would produce a pop-up window displaying the mean age in that district and the population.

Step 3 would be the above, but incorporating population density. If two postal districts have the same mean age and population, but one is twice the area of the other, the higher population density should be reflected in the colour-coding. (Cumulative age in man-years)/(area in km2) = weighted pop. density. Hovering one's cursor over a specific postal district would produce a pop-up window displaying the mean age in that district, the population and the area and pop. density.

My company operates numerous branches across the country, and scraping the coordinates of these branches from Google Maps would be trivial. Step 4 would be adding a layer to my map of the country with a binary "Does this postal district already contain a branch?" This would look like a patchwork of postal districts in which those containing a branch are solid red while those without a branch are solid white. On top of the red-white layer, there would be a translucent layer in a different colour (perhaps with some kind of pattern, like diagonal lines) indicating the mean age.

Contains a branch Doesn't contain a branch
Younger population Red background overlaid with light blue diagonal lines White background overlaid with light blue diagonal lines
Older population Red background overlaid with dark blue diagonal lines White background overlaid with dark blue diagonal lines

The idea is that postal districts with an older population but which don't currently contain a branch would immediately jump out visually.

Step 5 is where it gets complicated. Instead of a binary "does/doesn't contain a branch" layer, we'd have a second gradient (white to red) displaying the mean distance for someone living in that postal district to their nearest branch. This would be as simple as specifying the coordinates for the centre of a given postal district, then calculating the crow-flies distance from that point to the nearest branch (in practice: calculating the distance from the centre of that postal district to every branch and returning whichever distance is smallest). Hovering one's cursor over a specific postal district would produce a pop-up window the mean distance to the nearest branch (and the name of that branch), in addition to that district's aforementioned metrics.

Close to a branch Far from a branch
Younger population Red background overlaid with light blue diagonal lines White background overlaid with light blue diagonal lines
Older population Red background overlaid with dark blue diagonal lines White background overlaid with dark blue diagonal lines

Again, the idea here would be that postal districts containing an older population and which are quite a distance from their nearest branch would immediately jump out at the user.

Step 6 would be importing anonymised customer data from our CRM, assigning it to its postal district based on the customer's address, and subtracting that from the weighted average specified in step 2. The idea here is that the gradient of young to old people in a specific postal district should exclude existing customers: we're looking for older people who've never bought from us before. Hovering one's cursor over a specific postal district would produce a pop-up window displaying the population of that district after excluding existing customers, in addition to all the aforementioned metrics.

Step 7 would be the above, but incorporating our customers' ages and subtracting them from the mean age. If a specific postal district has a population of 1,000 and its mean age is 65, then the combined age in man-years in that district is 65,000. But supposing that district contains 200 existing customers whose mean age is 70, meaning their combined age is 14,000. Ergo, the mean age of people who in that district who aren't existing customers shortens to 63.8. Hovering one's cursor over a specific postal district would produce a pop-up window displaying the mean age in that district once those of existing customers have been excluded.

Step 8 would be allowing the user to hide either or both of the gradient layers described above.

Step 9 would be adding interactive binary toggles, such that e.g. postal districts which already contain a branch would be greyed out.

Step 10 would be allowing the user to filter on the basis of editable text fields. If a user wants to hide any postal districts where the mean age is under 50, or in which the population density is less than 2,000/km2, those postal districts will be greyed out.

The deliverable would ideally be something that can run in a browser, but if it has to be a self-contained executable, so be it.

Limitations: I can't code, lol.

I can envision how I'd make part of this: it's not difficult to create a CSV file containing a list of postal districts, the mean age, the population (thereby calculating the cumulative age), the area (thereby calculating the weighted population density), the coordinates for the "centre" of that postal district and so on. Nor would it be difficult to create a CSV file containing a list of branches and their coordinates, then using an Excel formula to calculate the distance from the centre of each postal district to each branch, and return whichever one is lowest. I can likewise envision exporting a table of customers who've bought from us in (say), the last four years, their addresses and their ages, then writing an Excel formula which will assign a postal district to each address, then calculating the total number of existing customers in that postal district and subtracting that number from the total population. Likewise for customers' ages.

But beyond that, I'm fairly stumped. I haven't the first clue how to create an interactive map of the country.

Based on the above description, do you think it would be possible to accomplish it via "vibe-coding" (a term I admit I still don't fully understand)? If so, what would be the best AI agent to accomplish it.

The deliverable would ideally be something that can run in a browser, but if it has to be a self-contained executable, so be it.

I think this would be a heck of a lot easier to accomplish as a GIS file openable in QGIS rather than as an HTML+CSS+Javascript file openable in a browser or as a standalone executable file.

I thought of using GIS alright. Is it free?

QGIS is free (gratis and libre), yes. (It's my understanding that the paid standard is ArcGIS.)

Amazing, thank you.

I've lately been working on a project around converting public domain novels into visual novels, unabridged. (Website: https://publicdomainpulp.com)

It's an idea I've had for a while, but it's only recently that image generator technology has gotten good enough to make the project viable. Viable, but not yet easy. At the start, I thought it would be easy, but there's a real scaling challenge in maintaining consistency when it comes to generating the hundreds of images a single book's visual novel needs.

Across the book, the style needs to be kept consistent. And the colors need to be consistent. And the image quality needs to be consistent. And the physical settings need to be consistent. And all this while being accurate to the details of the book, stated and implied, including period-accuracy. And of course: the images should be pleasant to look at.

None of these constraints on their own is super difficult to get right, but all of them together? That's when you start getting a lot of mistakes and having to do a lot of reprompting.

Not that I can blame all the mistakes of the image generator. Many of the screw-ups are fully mine: getting background details wrong, getting character details wrong, screwing up character expressions, screwing up relative resolutions, screwing up background framing, failing to make characters look unique, making characters look too unique, and so on.

The result being, the first three visual novels (Cup of Gold, The 39 Steps, and Pudd'nhead Wilson) I would describe as terrible, the next three (The Sun Also Rises, Jekyll and Hyde, and The Great Gatsby) as merely mostly terrible, the next two (The Mysterious Affair at Styles and The Secret Garden) as only just bad, and the most recent (Pride and Prejudice) as... perhaps approaching being okay.

It's a trend of improvement to be sure, but I'm also annoyed with myself by how long the results are taking to improve, and just how long I'm taking with the conversions in general. I really do want to have visual novels for every book ever written all the major novels of the public domain western canon, but at this rate, it's going to take some time. Especially if I want to get the results to the point of being good. And I also need to decide: do I go back and re-edit all the bad VNs? And if so, when, since I don't know if that's such a good use of marginal effort at the moment, with so many books still to do. But I also hate to leave up a bunch of garbage on the website.

Still, at least in terms of prose quality, the site currently has the nine best visual novels ever written. But visually, there's still many process improvements I need to make (including just getting better at slideshow editing), which hopefully the continued release of better image generators will help with. (I was optimistic about the recent GPT Image 2 at first, but it turned out to have... interesting issues.)

I think I'll do A Study in Scarlet next, where I'll try to tackle some of remaining sprite generation issues.

That is a really cool project!

How do you approach the overall project of converting - with what I assume are works of literature you love - in the order that you do? Are you honing the process of works that you like and then after you've figured out a decent process you go to works that you love?

I find long-term enthusiasm and motivation management super interesting and would like to hear your perspective.

"Love" might be ah... bit strong for some of these books. I chose Cup of Gold to start with for instance because I like Steinbeck, and thought it would be fun to do his first novel for the site's first visual novel. But I wouldn't really say that that book is good. (Ambitious perhaps?)

And then since then, the order has been kind of just whatever book I feel like doing next, based on what I'm up for reading and re-reading and re-reading, though biased towards shorter books at first. (Gotta build my way up to doing those long Russian authors.)

And also I guess I've been biasing my selections against books with complex frame narratives or like epistolary-type formats, like Wuthering Heights or Dracula or Heart of Darkness or whatever, since even though those are all books I'd like to do, I want some more experience before figuring out how I'd approach them as visual novels.

Thanks for sharing this. The project is fascinating to me from a technical perspective.

I'm currently working on a make-like build system for automating LLM workflows like yours. I've only been using it for internal projects so far, but I might try putting together an example that outputs material compatible with your system. So I looked into some of the technical details, and I have a few questions for you.

Q1

It looks like each novel is stored in its own git repo. I dug through your https://github.com/JohnQPulp/CupOfGold repo and I think I understand how all the info is stored. My first question is: is the annotation format you use in pulp.txt standard for visual novels or something you invented? Specifically, in the lines

All afternoon the wind sifted out of the black Welsh glens, crying notice that Winter was come sliding down over the world from the Pole; and riverward there was the faint moaning of new ice. It was a sad day, a day of gray unrest, of discontent.<e>"Winter... of discontent" opens Steinbeck's first novel. That's some neat, Shakespearean <book>The Winter of Our Discontent|career bookending</book>.</e>
b=wales

The gently moving air seemed to be celebrating the loss of some gay thing with a soft, tender elegy.
n:r=Robert Morgan; n:m=Mother Morgan; n:g=Gwenliana; n:h=Henry Morgan

I'm wondering if the html-like tags and the b=wales metadata stuff is formally documented anywhere?

Q2

These two repos look like how your generating the actual HTML from a book repo:

But what are you using to automate the actual git repos of the books? Could you walk me through that workflow a bit? (This is the part that I might try automating with my own tool.)

For example, I don't see anything in the book repos that look like they are designed to enforce consistency (like a character sheet) anywhere. All the material in the repo looks more like a final product than intermediate developer/artist "documentation". Do you generate any intermediate files like this?

Q3

What's the approximate cost for the full conversion? How much time does it take? (both manual and API/compute)

The metadata is (poorly) documented in this blog post: Converting Books Into Visual Novels Part 0: The pulp.txt Format. It's part of a series of seven or so posts I'm still only partway through making, where I plan to walk through the whole process. Here are the other two currently completed as well: Converting Books Into Visual Novels Part 0.5: Creating book.txt and Converting Books Into Visual Novels Part 1: The First Edit — Creating the Starter pulp.txt. (Again, you'll have to excuse the really bad technical writing in these, since I'm very much not good at it!)

(Also, if you're looking for a book to reference, probably any of the others is better than Cup of Gold, since what with that one being the first, I was still figuring a lot of the details out, and hadn't realized that giving all the characters one-letter IDs was a stupid idea.)

The overall pulp.txt format is one I created myself, for a couple reasons:

First, I wanted an enforcement mechanism to ensure that, as part of editing, the original text doesn't end up accidentally getting changed. So I wanted that logic baked into the "compiler", that pulp.txt (the metadata-enhanced text) would reference book.txt (the original text), to make sure they add up to the same complete book. And that required custom code.

And then second, I just my own format so that I could always be able to add in all my own idiosyncratic parsing rules and not have to deal with the idiosyncratic parsing rules of other existing visual novel formats. (Which I admit isn't a great reason to create my own format, though to be fair, book-to-VN converting is a fairly idiosyncratic venture.)

I'm not sure I fully understand your questions about the git repo automation and character sheet enforcement, but maybe the blog posts will answer those questions. (If not though, feel free to ask again.)

As for the cost, it seems to be converging to about $200 in image API spend per book, though the number will vary depending on the length of the book and number of different background and characters and character outfits.

For the time, this latest book Pride and Prejudice (~122k words) took me almost a month, although admittedly that could have been shorter if I was more focused, and also wasn't still making updates to my processes. I think if I had everything ironed out correctly, a book of that length could take as little as two weeks to do, though probably not much shorter than that, without starting to lose quality and accuracy.

Excellent! What are you using for the sprites and the illustrations? GPT Image? I was using Kling AI to make an original visual novel but I haven't got round to it recently. It's pretty good though.

Currently I'm using Nano Banana Pro, which was the best model at the time I started the project. The more recently released GPT Image 2 is probably the better model overall now, but for what I'm trying to do, it has a few issues.

GPT's interpretation of "literary cross-hatching" style is more beautiful overall in isolation, using thin fine stippling, which gives it a really nice engraved look, especially for character sprites. Whereas Banano's style tends to use thicker lines and give a more exaggerated and perhaps less realistic overall appearance to characters. But even though style-wise Banano is the more amateurish one, I'd say its use of bolder/clearer lines with less detail makes it easier to more quickly understand what's going on, both in the backgrounds and in characters' expressions. So it wins from an information standpoint, even if less pretty.

Also: GPT seems to do a better job at following prompts details, like including everything you tell it to include. But, it seems to be worse at understanding how objects exist in space (or maybe it just screws up more often due to including more fine details), leading to more nonsensical elements in the backgrounds. (Banano does screw up physicality too, but less often.)

And I find it interesting that, no matter how I try to prompt the differences in style out of the models, even with style reference images, they really do just seem to have their own interpretations of cross-hatching that they can't help but converge to. (And that does make me a little worried that, should Google deprecate and replace Banano with a different model, the "upgrade" might have a fundamentally different style, which would lead to the website's art becoming inconsistent. But I'll figure out how to deal with that if it comes to it.)

And then the last weird about the GPT model is its bizarre fixation on cleavage. It can't help itself but to include prominent cleavage in all the female sprites, which... could be acceptable, were again, its art style not so distractingly detailed. But you end up with these perfectly spherical breasts contoured with perfect curve-following grids, which look like they belong in a calculus class. Beautiful! But distracting. (Banano is comparatively more modest, and also just does a better job diversifying its faces away from always being of the perfect form, which helps keeps characters identifiable at-a-glance.)

An approach several furry 'directors' have moved toward is initial generation in Nano Banana / GPT Image for general layout and primary characteristics, and then a quick IMG2IMG step is a more focused model applying LoRA or heavily style-focused guidance or using something natural-language-friendly like Qwen Image Edit. May be worth evaluating for this project if you're considering something much more semi-automated.

It can't help itself but to include prominent cleavage in all the female sprites, which... could be acceptable, were again, its art style not so distractingly detailed. But you end up with these perfectly spherical breasts contoured with perfect curve-following grids, which look like they belong in a calculus class. Beautiful! But distracting.

It sounds like the training material was the 1992-2002 corpus of Image Comics.

converting public-domain novels into visual novels

It's my understanding that a purely linear visual novel is more often called a "kinetic novel".

A kinetic novel is a VN that does not present the "player" with any choices at all; he simply reads through a single unbranching story.

The term originates from Visual Art's brand KineticNovel (and all games produced under that brand are examples of this), but it is now also used to describe games by other companies with a similar structure.

Using the term "visual novel", with its connotation of interactivity, may mislead readers into thinking that you have added new branching paths to the plots of these books.

That does seem like the more accurate term, though I'll admit that I hadn't actually heard that one before. I'll probably stick with "visual novel" overall for the site and Github repos, since "kinetic novel" strikes me as being less descriptive and also kind of obscure (though I may be betraying my ignorance), but I could see it being a good idea to include in parentheses on the home page.

(And yeah, I don't have any plans to try and make these interactive, since I don't think there'd be a non-gimmicky way to do it.)

No, it's not obscure, it's a universally accepted term in the VN world.

This is very interesting. My first reaction was doubt, if not scorn, but clicking on the link I see that when you say unabridged that's exactly what you mean. It's the full novel, not a graphic novel rendering with speech bubbles etc. Maybe that's what a visual novel actually is and I am just learning the term. I suppose for some nonreaders who prefer pictures instead of text alone this could draw them more into reading, regardless of the art style. This must be quite time-consuming!

Yeah, it does take a fair bit of time, requiring basically three full close readings. The first to familiarize myself with the text (or re-familiarize, if it's been a while), the second to assign all the initial metadata to be used for image generating, and the third (after the image generating) to do a visual edit pass. Plus some smaller steps in-between.

Would that I could abridge the text to cut out tricky passages, or even just tweak certain annoying visual-defying wordings, it would make things a lot easier. But I think I share your feelings that, at that point, it would no longer be the original book or prose.

It's the full novel, not a graphic novel rendering with speech bubbles etc. Maybe that's what a visual novel actually is and I am just learning the term.

Yes, that's what a visual novel is.

A typical visual novel consists of text over an anime-style background image and is accompanied by background music. Throughout the game, the player usually has to answer a few questions which will have an effect on the story. Thus, playing a visual novel a second time while giving other answers may result in an entirely different plot.

Note that these particular visual novels are in the non-interactive "kinetic novel" subcategory.

Sitting at 36317 words; I have really slowed down. It's another scene with a stubborn character, a different one this time. I am flipping between two storylines in two locations, so it's a constant struggle: I bang out the banging in the first one in 15 minutes and then spend the rest of the hour on the other one, painfully trying to steer the story in the right direction.