Skip to content

Initial Project Status Report

Announcing a thing is all well and good, but I’m sure what people want to know how the project is progressing and when they’ll be able to use it. To that end, I want to provide monthly status reports on how development is progressing.

Welcome to the inaugural status report for February 2025.

Note on Issue Tracking

There’s limited visibility into what I’m doing right now because I’ve set up my todo list on a private Planka board instead of somewhere everyone can see it.

For the time being, I am going to continue that way. It’s not worth it to copy all of that stuff to Codeberg Issues — most of it’s just one line item like “Spiff Quill Up”. They’re all meaningful to me, but entirely useless to everyone else.

When I get close to exhausting my current task list, I’ll probably start using Codeberg Issues and milestones so potential Kitto² developers can see where the project is at.

Blocked-in Features

At this stage, everything is in a rough state. I want to get most of the functionality blocked in, and then I’ll go back over and start refining and polishing. I’ve already made some major design changes, so if I had polished things up until they were just right, I’d have thrown away a bunch of work during revision.

Here’s a high-level list of what’s blocked in already:

  • Laravel Jetstream starter kit for registration, login, etc reskinned for Boostrap
  • An extensible currency system that starts with a generic “Money”, but shops/etc can be priced in alternative currencies
  • Pet species with colour variants can be adopted & abandoned, and some colour variants are locked behind items instead of being adoptable
  • HTML & custom CSS can be used for pet profiles & a Quill-powered RichEditor component is available for writing profiles
  • Loot tables, which can be set up in the backend and used whenever prizes are needed
  • Pluggable inventory system, with basic actions and five example item types

Revisiting User CSS/HTML

The custom CSS handling is already in its final state, leveraging some really great work from the MediaWiki developers: wikimedia/css-sanitizer.

Making the user-supplied HTML safe — currently for profiles, but eventually for posts/DMs too — is being handled by HTMLPurifier1. I think I’m going to redesign that and store/render Quill’s delta format2 instead.

That will negate the need to accept raw HTML from users, which is generally safer, at the cost of having to render the delta format to appropriate HTML. For some complicated tech-y reasons, this will be necessary to get <details> tags (for spoiler-ing text!) to work nicely in both the rich editor and profiles/posts.

It is also an opportunity to eliminate style=font-color: #XXXXX attributes, and instead rely on classes (class="quill-foreground-blue"). That way, the exact shade of blue can be controlled from a theme stylesheet, so devs can adjust them to be a little darker/lighter to fit their chosen background colour.

Screenshot of the edit pet profile page, showing a rich text editor with lots of options. A YouTube video about the Linux fox Xenia is embedded into the profile, and the thumbnail background is blue & pink.

On Deck: NPC Shops

NPC shops are a work-in-progress. There’s a basic implementation, but they still need a cooldown on purchasing and a nicer UI.

There is some nuance needed to handle somebody purchasing an item just as the restock timer pops; when possible, it will still process a purchase. Livewire and a custom AlpineJS countdown component make it easy to do a lot of these things.

The restock process is done. It relies on loot tables. A loot table can be configured to provide a consistent base of items (always = true), with a chance at some other rarer items being available.

Items have a default price, but the loot table can override the price. This facilitates use-cases like a random deep-discount shop, or a shop pricing items in an alternative currency from daily quests.

The loot tables are nestable, so you can have a rare chance to include one item from the “Epic Paintbrush” table, and it’ll be able to roll those with their own relative rarities.

You can include currencies in loot tables — or enable including your own models by implementing the LootResultInterface. The paintbrush loot box could just as easily result in the adoption of a rare pet, with a few code changes…

Up Next

I haven’t decided what I’ll do after the shops. The social features — friends, DMs, forums, who’s online — are a big area I can start blocking out.

On the other hand, the admin panel might be a quick win. I am planning to use Filament, so I’ll be able to crank out the basic CRUD screens needed.

There is a major outstanding tech debt item: I want it to be easy to translate Kitto² into other languages. Most of the verbiage is easy enough, but names/descriptions for items, pet species, or anything else a game’s content team would set up in the admin panel are more difficult to handle.

Footnotes

  1. A venerable library, which you might recall from the original Kitto. It’s still getting updates! It’s missing support for “new” (circa 2014) HTML 5 tags, but that’s a solvable problem.

  2. Which is a topic I find fascinating, but is boring to Normal Human Beings. You don’t need to think about protecting rich text from XSS attacks when using Kitto² because it’ll come with a drop-in <RichEditor> component. But getting that to work nicely is a whole thing that merits its own blog post.