Maleghast Battle Report: Berserk in the Membrane

I just finished cooking the next one.

In this video I’ve added something I’ve been thinking of doing since the first one, which is to have little animations when a unit acts or a SOUL ability is being used. These appear as little animations on the bottom of each side acting.

The process to create these was fairly straightforward. First step was the place the unit art on a “green screen” background, since the model is not capable of generating transparent backgrounds. Then I used the open weights Wan2.2 model on ComfyUI, and prompted it to perform the animation that fits the act. Finally I added the finished result in kdenlive with a chroma key effect for green which allowed the unit to have a transparent background again.

Now the animations are not incredible as the model is not that capable of complex movements, especially for weird designs like these, but they give a little extra action on the side which doesn’t interfere with the main game-play.

I did try to make some animations involving multiple units (you’ll see like 3) by combining two units in the same image. But it was both very complex to arrange (I had to ask the model to first make the character face each other for example and then use the final frame from that as the next frame for the next), and also the result were pretty bad. Most of the time, one character wouldn’t animate at all, and the whole thing was very basic. So ultimately I scrapped that idea and stayed with a single unit. If a more capable open-weights model appears in the future I’ll give this another go.

Maleghast Battle Reports

So now that I have pretty much finished the Magnagothica: Maleghast print & play process , my hyperfocus descended on me over the weekend and I ended up making a whole-ass battle report. I got the idea because I randomly stumbled onto a video about how to make such battle reports, and also because I wanted to consume some more Maleghast content online but I found there was an absolute dearth of it online.

This post will detail the creation steps, but first and without further ado, here’s my first battle report.

I made a quick Youtube channel just to host these, so as to keep things nicely separated. I wanted to post on pixelfed as well, but I couldn’t find a relevant instance for this content with open registrations. If you have one suggestion like this, lemme know.

Now that’s out of the way, lemme write down the process for making this video.

The first step is of course the recording. I bought a cheap table mount where I could put my smartphone on, and it’s a bit short but fortunately just enough for the Maleghast playmat I have. I also bought some Lavalier microphones but sadly those didn’t seem to work right this time so it ended up using my phone mic.

For recording software I used Open Camera which provides a lot of control on recording. Unfortunately since I didn’t quite know what I’m doing, I ended up recording is way too high bitrate, getting massive files. It also recorded in portrait. But nothing a quick ffmpeg command can’t fix:

ffmpeg -i VID_20260718_115530.mp4 -vf "transpose=2" -b:v 5M -c:a copy output.mp4Code language: JavaScript (javascript)

Once I had my video recorded, I then had a good idea on how to edit it. The main idea is to display the units interacting and their stats, as well as the abilities they’re using and any conditions they have accumulated.

Initially I tried using G.I.M.P. to create the various templates I wanted, but manually tweaking all the elements was taking entirely too much time and it was also not looking that great. I decided to pivot and with some LLM help I had the initial skeleton for a python script which could compose a unit card from its component elements. Of course the LLM choked once the script became even mildly complex so after a point I just took over on my own.

The way it works is that I use kdenlive to go through the video. Every time a unit ability is activated, I set a guide at that timestamp. The name of the timestamp then contains all the info I need to generate the unit card at that point. The ability used, the current health, and any tokens assigned to that unit. Example: “bolides_3_vitality3+weak” will generate a Holy Body unit card with 3 health, and with 3x Vitality and 3x Weak condition tokens assigned.

At the same time I’m also trimming “thinking stretches” from the timeline, and generally trying to shorten the video if possible. For my first video I wasn’t very strict about this though, so it ended up 1.5 hours long. Given that it was a beginner game and we both had a few rules questions, I’m expecting this time to rapidly drop in newer videos. I’ve managed to play games in less than 1 hour already. I’m not quite sure if in future videos I will try to completely cut away all silence/thinking times as it allows the video to be a more chill-affair to have running in the background, which could be nice for ADHDers like myself. Tell me what you think.

Anyway, once I have all the Guides places, I used the very useful function of kdenlive to export all guides in this format “{{category}} - {{timecode}} - {{comment}}” and place them as a text file along with my script which then parses the guides to create all the images that I’ll use for the video and names them according to their timestamp. Then it’s just a matter of drag and dropping them into the timeline on the two tracks I added for this, adjusting their duration according to how long the action took, and finally adding the custom effects I created which made them fade in/out and place them on the left/right of the screen.

In python I’m utilizing badgepy to create badges for the tokens to attack to the unit cards. Simple, albeit not particularly pretty. I’m planning to add maybe some icons to the badges, but if you have some ideas on how to make this look better, send them my way.

Finally I go through the video at real-time to see if all looks correct. If any unit card is wrong (say, wrong HP or tokens), all I need to do is edit the guide at that timestamp, export guides and rerun the script and since kdenlive is loading the files dynamically from the hard disk, this is enough to update all the unit cards in my existing video. This will also mean that if in the future I come up with a different unit card design, it should be trivial to update everything, or even go back and update my old videos.

Whenever I notice mistakes in the play, I then use the subtitles track of kdenlive to quickly mention the mistake so that people watching know.

And that’s pretty much it. After that I only need to upload to youtube and figure out a thumbnail. For the first video I just used the Gemini GenAI as I couldn’t figure out a way to create an image containing the two primary necromancers from the factions and the images contained in the book where way out of my skill-set to shop into a good-looking image (and frankly I had had enough “cooking”, and I was just eager to publish). I’m looking how to do something similar using local diffusion models in the future, so when I do I’ll post that process here as well.

Hope you found this process useful, and let me know what you think of my first Battle Report!


Magnagothica: Maleghast Print & Play – Condition Tokens

Yesterday I posted of my progress of converting the combat units of Maleghast into poker chips. Today I am going to elaborate on how I handled condition tokens such as strength, weakness, vulnerability and so on.

After I prepared the unit chips, I wasn’t sure how to handle conditions. Initially I planned to use a dice to track them per unit, but after bringing the game on the table, I quickly realized this is an untenable solution. The game just has too many status effects and things to keep track of, per unit

First game played using dice and whatever tokens I had available, for conditions and status effects

Unless you have a hundred colored dice of different colors and designs, it becomes impossible to keep track of everything, and it’s very easy to jostle dice and lose track of things. Not to mention that they end up covering the unit itself and its printed stats, so you end up having to lift the tokens to see.

Instead I decided to design custom poker chips which I would place below the unit chip, just before their hit points. Using different color chips per condition, should make it easy to track what affects each unit, without even having to lift the unit chip to inspect them after a while. The original plan was to buy the same sort of chips I used for the units, just in different colors, but after realizing the breadth and quantity of chips that would be required, I quickly discarded that plan as there wouldn’t be enough variation for color coding and it would require too much money.

Instead I decided to switch to my 3D printer to print my own condition chips. They wouldn’t have the same weight as the units, but that’s a trivial issue which in practice doesn’t bother anyone. However the benefits would be massive. Not only can I design chips in any color combination I want, but I can also etch specific symbols on them, and the name of the condition itself, ensuring that it’s trivial to keep track of what’s going on, on the board, at minimum hassle.

As I don’t own a multi-color printer, I decided to find poker chips designs that works with a monofilament printer. This is the only 3D-printed poker chips model I could find that doesn’t rely on an AMS, and it prints out very well.

Initially I was printing these on the basic texture plate of the printer, but it was very fault-prone as the models kept disconnecting from the plate and ruining the whole batch. I then switched to putting wide brims on everything to ensure adhesion and this worked very well, but the downside is that afterwards I had a significant amount of fine effort to do on the chip “pips” to remove the extra filament. I would have to literally sit there for half an hour, cutting away the brims from each pip with a cutter.

I decided to switch to a cool plate instead and while I was afraid it would not work well due to how notoriously hard it is to remove flat models from these plates after printing, my concerns turned out to be unfounded as the chips easily popped out with some bending, and their pips can quickly be removed with some light tapping from the side. The cool plate also helps the text engrave better on the bottom.

For the customization, I used OpenSCAD as it’s Linux native and it works programmatically, which means I could use an LLM to help me quickly cook up a script to engrave the art and letters I need. I provide my script here in case it can be useful to others.

// ==========================================================
// USER SETTINGS 
// ==========================================================
use_svg_icon      = true;       // True: Top is SVG | False: Top is Text
emoji_svg_file    = "MAGNAGOTHICA/3D tokens/health.svg";

engraving_text    = "Health"; // The text is placed on the bottom of the chip
top_text_y_position = 19; // Change this to 22 if you use engraving_text2
engraving_text2    = ""; // More text for the bottom of the chip. Used when the label is too long.
top_size          = 1;          // Font size OR SVG scale factor for top side
bottom_text_size  = 5;        // Font size for bottom text. 5 for 4-5 letters, reduced progressively for longer words
font_style        = "Liberation Sans:style=Bold";

// ==========================================================
// MODEL GENERATION
// ==========================================================
difference() {
    // 1. Import original STL file
    import("obj_1_poker chip p2_1.stl");

    // 2. Top Side Engraving (Can toggle between SVG or Text)
        translate([19.5, 19.0, 2.5]) { 
            linear_extrude(height = 1.1) {
                if (use_svg_icon) {
                    // The offset() function cleans up self-intersections in the SVG path
                    offset(delta = 0.001) {
                        scale([top_size / 10, top_size / 10, 1]) 
                            import(emoji_svg_file, center = true);
                    }
                } else {
                    text(engraving_text, font = font_style, size = top_size, halign = "center", valign = "center");
                }
            }
        }

    // 3. Bottom Side Engraving (Always Text, Mirrored)
    translate([19.5, top_text_y_position, -0.5]) { 
        linear_extrude(height = 1.2) {
            mirror([1, 0, 0]) { 
                text(engraving_text, font = font_style, size = bottom_text_size, halign = "center", valign = "center");
            }
        }
    }
    translate([19.5, 16, -0.5]) { 
        linear_extrude(height = 1.2) {
            mirror([1, 0, 0]) { 
                text(engraving_text2, font = font_style, size = bottom_text_size, halign = "center", valign = "center");
            }
        }
    }
}Code language: PHP (php)

For the chip icons, I used the ole-reliable https://game-icons.net/ and found some appropriate icons for each condition and downloaded their SVGs to feed to OpenSCAD. Some of them faulted when OpenSCAD tried to render them to I added an offset workaround in my code which seems to fix them.

These chips take a surprising amount of printing time, particularly the pips. A full set of 15 tokens and their corresponding 90 pips take a full 6 hours of print time! So it was a a whole week of work before I had enough to cover everything. As I’m a bit perfectionist I not only want chips for the basic conditions and the faction conditions, but I also want custom chips for each special condition that some units and SOUL abilities would inflict. If one wants to save time, theoretically one can get away by just printing the basic conditions, then something like 4-5 colors of “generic conditions” which they would re-use each game based on their factions abilities. I.e. a token would be Plague in one game, but Berserk in another. But I’m a bit perfectionist with my boardgames, so I wanted unique color combinations and icons.

That of course means, a whole lot of chips, which quickly overwhelmed my table. I urgently needed a storage and organization solution. 3D printer once again to the rescue! Fortunately there’s no shortage poker chip storage solutions online. I just needed something that can handle the sheer amount of variety in my chips while still making it easy to use them during the game.

So I landed on this poker chip holder model which provides 10 unique spaces for chips which allows me plenty of space to organize and has the added benefit of being stackable and providing a convenient space for unit cards and the larger tyrant units. Unfortunately even after printing 3 of these, they were still not enough to handle everything, so now I am also printing this model to store things like hit points on the side, or maybe a way to transport just a single faction and their unique tokens only.

I’ve already played a game using these chips and it was a massive improvement over the dice. It was a breeze to keep track of everything and it actually helped a lot with the speed of the playthrough.

Next post I’m going to elaborate on the solution I came up for the unit cards

Magnagothica: Maleghast Print & Play – Unit Chips

In the past month I’ve been trying to get Maleghast on the tabletop. The game was designed for the Virtual Tabletop but I don’t particularly like playing boardgames online as for me the social aspect is an implicit draw of the genre. So my plan was to translate the game components in a way to play them on the tabletop in a easy manner.

Initially I was planning to simply create 3D-printable miniatures for each unit in the game as I’ve done for Last Light but then the inspiration struck me after playing Chip Theory games like Cloudspire; to convert the miniatures into poker chips instead.

I went with chips because it allows me to display unit information for the opponent directly on the table, rather than having to remember everything or refer to the unit cards all the time. For this purpose, I used G.I.M.P. to add the basic unit information directly on each unit image. Now it becomes very easy when you’re deciding what to target to easily view all most relevant information such as the defense of the unit (which is the target number you want to hit with your attack)

As a sidebonus to that, the other side of each unit has a corpse image, so when a unit dies, all I have to do is flip it upside down, and it becomes a corpse on the battlefield. And if I need more corpses, I can use some of the unused unit chips.

For the poker chip creation, I used the process described here. For reference, these are the supplies I bought from German Amazon given that this guide was built for the USA market.

  • Poker Chips: These chips are very affordable and have satisfying weight. You need to remove their internal label to allow proper adhesion of the unit labels, but that’s easily done with an x-acto knife.
  • Hole Puncher: The poker chips have a 2.9cm diameter internal space so this one works best, but I’ve found you’re better off printing the units at 2.8cm to avoid cutting off some edge art.
  • Tweezers: To pick up unit labels without getting fingers sticky.
  • Glue Spray: This is the one suggested by the original guide. Loos like it works well enough as I can variate the spray strength as as to not send the card pieces flying.

However through trial and error I’ve discovered that it’s actually easier to spray the poker chip directly with the minimum amount of glue, and then press the unit art onto it. Spraying the unit paper makes things way messier. What I do I spray very very lightly on the chip, offset towards one side of the radius. Then I place the cutout unit art onto it, starting from the side I placed the glue, then gradually “tipping” it over, so that as it lays flat, it pushes the glue towards the rest of the area. This allows better coverage, without having the glue squish over the rim. Even then, it’s very easy to put too much glue on the chip, which still results in residue on the raised chip sides. I’ve tried cleaning that residue with paper and alcohol, but unfortunately it still remains sticky, which results in the chips sticking together when stuck and feeling sticky on the fingers.

To combat this, I got me this residue remover which is very good at getting rid of this glue. If I get some spillage, I immediately wipe it away with a rag infused with it, and there’s no residue left and in my experiments it’s not wiping the art either like alcohol does.

After I finished all the units, it occurred to me that I could have printed my own poker chips with the 3D printer, which should have allowed me a smaller “raised” radius on the chip, and therefore more space for art, but I already did all the work. And plus, the purchased chips have a more satisfying weight as well.

For the unit art printing, I created a custom python script with the help of an LLM, which takes all the images in a directory, resizes them and places them in A4 PDFs, which I can then send to my printer.

import os
from fpdf import FPDF
from PIL import Image
# Create A4 page (210mm x 297mm)
pdf = FPDF(orientation="P", unit="mm", format="A4")
pdf.set_margin(0) # Remove default margins to prevent shifting
pdf.add_page()
# Hard coordinates in millimeters
X_START, Y_START = 15, 15  # Outer margins
x, y = X_START, Y_START
IMG_SIZE = 29
GAP = 0
PAGE_WIDTH = 210
PAGE_HEIGHT = 297
DIR = "all_units"
# Filter and sort your images
files = sorted([f for f in os.listdir(DIR) if f.lower().endswith(('.png', '.jpg', '.jpeg'))])
for file in files:
    img_path = f"{DIR}/{file}"
    # Open the image to check its pixel dimensions and aspect ratio
    with Image.open(img_path) as img:
        p_width, p_height = img.size
    # Calculate dimensions while maintaining aspect ratio within the IMG_SIZE box
    if p_width >= p_height:
        # Landscape or Square: Width is the limiting factor
        w_mm = IMG_SIZE
        h_mm = (p_height / p_width) * IMG_SIZE
    else:
        # Portrait: Height is the limiting factor
        h_mm = IMG_SIZE
        w_mm = (p_width / p_height) * IMG_SIZE
    # Check if the next image fits horizontally, if not wrap to next row
    if x + w_mm > PAGE_WIDTH - X_START:
        x = X_START
        y += IMG_SIZE + GAP  # Moves down by the maximum box height + gap
    # Check if the next row fits vertically, if not create a new A4 page
    if y + h_mm > PAGE_HEIGHT - Y_START:
        pdf.add_page()
        x, y = X_START, Y_START
    # Place image with its calculated proportional width and height
    pdf.image(img_path, x=x, y=y, w=w_mm, h=h_mm)
    # Move cursor to the next column based on the bounding box size to keep a uniform grid
    x += IMG_SIZE + GAP

pdf.output(f"{DIR}_perfect_{IMG_SIZE}mm_grid.pdf")
print(f"Done! '{DIR}_perfect_{IMG_SIZE}mm_grid.pdf' generated with aspect-ratio preserved images.")Code language: PHP (php)

Then it’s just a matter of cutting them out with the hole puncher

Initially I had the tyrants as a poker chip as well, but this was clearly never going to work as they’re meant to take 4 times the space as a 2v2 unit. So I instead converted them into square images which I can print on a chipboard as per this guide. All you need are

  • Straight Ruler
  • Utility knife
  • Paper Glue (I prefer this over spray glue, but that can work as well)
  • Carboard

I decided to print the max amount of units for each faction, so that each player also has the capacity to craft the warband they want. That means 3xScions, 3x Thralls (i.e. 6 chips), 1x Tyrant&Necro and 2xEverything else. I stayed with only 3x thralls instead of 5x, as it’s unlikely someone want to do that except for the memes, and it saves me the extra work and storage for the extra ~30 unit chips this would need. I also only printed 1x of each Necromancer, not really expecting to play mirror matches a lot.

With this approach, I now have a complete print of all Maleghast which are compact and can easily be stored due to the chip stack-ability. Also instead of expecting each player to have their own copies, I can simply provide everything and even carry it with me.

In the next guides I’m going to elaborate on the the 3D-printed poker chips I modified to serve as condition tokens, the 3D-printed terrain I designed for walls and elevation, and the printed terrain I designed for hazards, ladders and adverse terrain, so keep an eye for future blogposts on this.

I’ve already managed to bring the game to the table with all these components and I’m quite happy with both the flow and the time it takes to play. I’m leaving you with a photo of the last game I’ve managed to bring to the table

Abhorrers VS Igorri

An Epic 3D-Printed Fan Expansion for Last Light

I like the Last Light boardgame, so I went wild creating a collection of custom ships per color. All in all, 45 different spaceship designs, all available for everyone.

I recently got my hands on a 3D printer and have been slowly enhancing and customizing my board game collection through printing new inserts and replacing components (typically wooden cubes, or cardboard tokens) with 3D printed version of them1.

When I reached the time to do my Last Light board game I initially just printed some planet/extractors supports and called it a day. However after I finished with my improvements for Arcs, where I replaced the basic spaceships with 3D printed custom versions,I got the idea to do the same for Last Light. Unfortunately, unlike Arcs I couldn’t find any spaceships someone else prepared for it, so I continued with other projects until as part of these projects I discovered a new workflow.

You see, there are GenAI models which can generate full 3D models from an existing image. They’re not as great with any random image, but if you feed them something specifically looking like a 3D model, they can be very good. I also have access to Generative AI through the AI Horde and can generate any number of images for it through local compute (mostly mine), and recently a new very powerful model was added to it2. Finally an AI Horde LLM can be used to take the core idea for a concept and expand/brainstorm on it to improve its look.

My first test for this was printing a large Gargoyle as a gift. As I couldn’t find one in the shape or design I wanted, I just generated one myself. This was also my first proof-of-concept for how this workload could work and I was frankly blown away when I finished printing the model. The results were significantly better quality than I expected! As soon as I saw that, I knew my next project would be to see if I can generate 3 ship types for each color in Last Light. And, friends, let’s just say I might have gotten a bit carried away…

My Epic Last Light Custom Ship Expansion

Initially I generated only one fleet per color. Each fleet includes one large/dreadnought, one medium/frigate and one small/fighter spaceship. The small ships are are designed to look maneuverable, while the dreadnoughts to look imposing. Once I did the primary colors, I thought to myself, “What if someone picks a color, but doesn’t like the design of the ships for that color. And also, why even limit myself? You know what, I’m gonna make two designs per color”. Honestly I was having way too much time making these designs and on the second wave of, I decided to be even more creative with the options.

So without further ado, let’s see the results. I’ll separate the headings below for each of the primary colors of Last Light, and the two options I designed for it. Each color has one design for the primary color, and one for an off-color of some way. For example White and Silver, Blue and Cyan and so on, so as to have each off-color clearly belong to one of the primary colors in the game. For each color, you can find a download link to the models and more pictures on Makeworld in the image caption.

Black

For this design, I wanted to make something that is all sharp pointy edges and malicious force. Interesting tidbit, the Frigate was the first ship I printed and it came up slightly too large compared to the original medium spaceship cardboard token. Second interesting tidbit, the fighter design originally belonged to the Grey designs (see below), but I decided that it’s better to make it part of the shadows as a cohesive whole, and modified its design prompt for the dreadnought.

Grey: Geometric

Of course I wished for a Borg-like brutalist design as a choice as well. The models you see below are actually hand-painted as I run out of grey filament. I had to do a few re-designs for the pyramid in order to appear that it has less of a base (since there’s no ground in space). I would have liked a spherical spaceship to complete this trio, but that doesn’t make for an easy miniature. So I went instead for a hexagonal fighter.

Orange

Orange: Forgeworld

For orange, I went with something that might look like it comes out of Dwarven blacksmiths

Brown: Subterranean

I used brown as a darkened version of orange. I felt a fitting theme for this color was a subterranean design.

Red

Red: Volcanic

For red, the best concept I could come up was a volcanic design

Pink: Organic

Pink is effectively desaturated red so it felt adequate for a secondary color. A fitting design for this color was a organic bioships, taking inspiration from things like Zerg and Tyranids. Initially I wanted the winged mosquito-like ship to be the small version, but through trial and error I couldn’t make a printable version. The wings and base kept breaking off. As a medium version however it’s surprisingly stable.

Yellow

Yellow: Smooth

Yellow gets a more straightforward spaceship design. I tried to make this somewhat long, so hopefully they won’t take too much space.

Gold: Gilded

Gold fits very well as the secondary yellow color as its metallic cousin. This design is meant to give vibes of Croesus or some other gaudy personality. Also unlike their yellow cousins, they tend to be more short and stocky.

Purple

Purple: Centrifugal

For purple I went for a round/centrifugal theme, to keep things interesting. Initially this was supposed to be my white color ships, but I then had a better idea for something to match the white theme (see below), so I decided to turn these purple instead. Unfortunately the fighter and dreadnought prints are not very well balanced, so they tend to tilt on the board, but that doesn’t affect gameplay much.

Fuchsia: Coral

The secondary purple color was difficult to decide, since purple is a mix or red and blue, so any off-color I chose, would have a chance to look like it belongs as an off-color to either of them. In the end I went for a Fuchsia color, but in practicality I didn’t have a fuchsia filament or acrylic, so when I painted them by hand, I made them more Bordeaux.

Initially my early design were planning to be more celestial-themed, but I quickly found troubles when the GenAI model couldn’t draw spaceships that looked, well, like spaceships. I then came up with the idea for a coral-themed design, and it came out so well, I kept the celestial design only for the fighter ship, given how few print details appear at that size. The medium and large ships have enough area for the coral fractality to actually appear. And they appear quite unique on the board as well!

Green

Green: Botanical

Green obviously had to be plant based and this was the first color I went outside of the usual metallic spaceship design and generated something more organic. For this theme I went for something plant-like and botanical.

Neon-Green: Mycelial

I couldn’t decide on an secondary green color. Initially I was planning to make some sort of jingoistic design in khaki, but then I run into a neon-green filament color on sale and inspiration took me towards a more bioluminescent green color. And what better theme for this, than mushrooms!

Unfortunately the filament itself ended up being too similar in hue to the existing green I used for the Botanical design, but on the other hand, the mycelial designs came out great. The frigate design in fact was the first winged design I printed and it came out so well, that it then gave me confidence to attempt it a second time with the Organic frigates.

White

White: Crystalline

After I had my initial spaceships for white, it occurred to me that white would also go well for an energy-based race, and what better way SciFi trope for energy than crystals. Don’t ask me, I didn’t make the rules!

Silver: Plasma

Interestingly enough, it was my 8yo kid that came up with the ship design for this color scheme as he was observing my process and wanted to make some spaceships of his own. The Dreadnought is supposed to be some sort of healing/repair support ship. Given the secondary color for the silver theme I got out of the model, I decided to call this design “Plasma”.

Unfortunately the details of these designs are apparently too fine to be adequately printed and I also tried on a different filament as well, so the actual print barely have any details. I might have to redo these.

Blue

Blue: Chunky

For the blue designs, I wanted to go for something chunky and utilitarian, kinda like the firefly-class ships. These generations were I think my very first ones, and they were before I started color coding the prompts themselves, which is why these ships all have the same aluminum look.

Cyan: Marine

Last, but not least, I created an aquatic-creature inspired design and this is the one that convinced me I should go for more weird and organically-inspired designs for my off-color designs. The Jellyfish-themed dreadnought in fact came out so great, even standing stable on the table on its tentacles, that I knew I needed to do more of that. It’s no wonder next ships I designed after this were the mycelial ones. Can you tell what aquatic life-form inspired the frigate and fighter classes?

  1. Seriously, a 3D printer is the best addition to a boardgame hobby. ↩︎
  2. Z-Image ↩︎

So there you have it. This project has been ongoing for a few weeks now and I’m really happy how it turned out. I hope my boardgaming partners will find the enhancements to Last Light just as cool as I do 🙂

Now that I also opened this door of combining Generative AI with 3D printing and boardgames, the sky’s my limit! I have so many ideas to upgrade each and every boring component I have! Subscribe to this blog via RSS or fediverse or follow my makerworld account to see what new stuff I create.

Fediverse is like Atheism

A lot, if not most of lemmings moved out of reddit at this point, out of pure spite, particularly due to reddit rug-pulling their public API and therefore breaking all the third party integrations that many developers spent hundreds of work-hours creating.

Speaking for myself, Reddit was the last straw I needed to swear off from corporate social media. Soon after I shut down my Xitter account, and stopped logging in to Facebook altogether. Network effects be damned. Discord is the only service I am still using and only because I still run the AI Horde & Godot Card Game Engine chats there since 2020. The Divisions by zero chats were set up on Matrix instead.

These days I explicitly avoid registering and using social media that is proprietary, or backed by venture capital. I’m not helping to make another billionaire off my content. I don’t want to be nobody else’s product!

Where am I going with this? Well, today I run into this meme and it got some thinky juices flowing. You see I was an atheist when I was around 15, when I managed to start shedding off the intense Orthodox Christian propaganda I was swimming in until then. But once I became an atheist, no other religions were tempting. It’s not like Islam, Catholicism and whatnot became more interesting. Once I became an atheist, it was like an inoculation in my brain, where no other religious memes1 could take hold.

I believe most atheists are similar. Once your brain manages to reject religious brainwashing, it’s very difficult for anything like it to take hold. It’s like a generic vaccination. And while there’s plenty non-denomination people who keep “shopping around”, so-to-say, or just stay generically “spiritual”, a lot of those remain agnostic, rather than capital-A Atheists.

This is exactly how it worked for me with the Fediverse as well. Once I got radicalized enough to swear off corporate social media, I am not going back, no matter how many carrots you swing in front of my nose. In fact, I’ve been burnt so much that I am inherently suspicious of whatever service I’m using that is not open sourced as well.

This has some striking similarities to how people who switch exclusively to non-corporate social media, like the fediverse, act. Our brain has likewise been inoculated to reject things which aim to treat us as products, and there’s just no going back. As the percentage of people who think like us grows, and accelerates due to the massive enshittification of corporate social media, each new version of such media will have less and less people to tap into. Those of us already on the fediverse, will refuse to switch to new fancier versions of the same product, even if they present themselves as fresh or as underdogs, like the new Digg, or whatever new shit Jack Dorsey poops out.

Eventually mega-corps will understand this, and will try to co-opt this movement like Google did to email, with gmail, or like Meta is attempting to do with Threads, but for those of us who reject the capitalist owners of such social media, it’s not just enough to use the same protocols, or even to be open source. Our rejection goes deeper than that.

I can’t foresee how this will all turn out, especially in the current interesting times we’re living in, but I remain convinced that a hard core of us will always remain that will never change our minds about this. And a few millions of us to remaining steadfast is all that is needed to maintain interconnected social media that cannot be rug-pulled from us anymore.

  1. I’m using the original meaning of meme here: A virus of the mind. ↩︎

This blog is now federated natively to lemmy

I’ve had the ActivityPub plugin active on this blog for a while now and it’s been happily federating to mastodon for just as long. However it never worked on lemmy, and I always assumed it was just not set for it and was primarily focused on microblogging since lemmy was not even mentioned in the supported software.

This was until one of the lemmy developers contacted me, having been informed by a member of our lemmy instance that dbzer0.com was not properly configured for lemmy. I was perplexed of course because I didn’t really do any customization on the wordpress plugin whatsoever. I just used whatever defaults it came with.

Through some back and forth between the developers and me, I eventually started experimenting with the plugin settings, trying to see if any of them would make it behave in a way that lemmy could understand, until one of the options finally did the trick.

As a result, this WordPress blog is now happily existing as a lemmy community !dbzer0.com@dbzer0.com

’tis a bit of a silly community name, but it works.

Unfortunately the previous posts on this blog are not retrieved automatically, so you won’t be able to see them or their comments in the community, but one can search for a blog url in lemmy and it will discover it and open it for comments. Any comments posted there should also appear as comments under the posts here which is pretty neat!

Example

So if you’re on lemmy or piefed, just visit its community from your own instance and subscribe to it, and new blogposts will appear directly in your lemmy feed. I love apub!

Many thanks to both pferfferle (the apub plugin developer) and the lemmy developers who looked into this!

leave a comment (from lemmy?) to let me know what you think.

How did we move from forums to Reddit, Facebook groups, and Discord?

From the first moment I first went online in 1996, forums were the main place to hang out. In fact the very first thing I did was join an online forum run by the Greek magazine “PC Master” so I could directly to my favourite game reviewers (for me it was Tsourinakis, for those old enough to remember).

Whoever didn’t like the real-time nature of the IRC livechat, forums were all the rage and I admit they had a wonderful charm for the upcoming teenager who wanted to express themselves with fancy signatures and some name recognition for their antics. Each forum was a wonderful microcosm, a little community of people with a similar hobby and/or mind-frame.

BBcode-style forums took the web 1.0 internet by storm and I remember I had to juggle dozens of accounts, one for for each one I was interacting with. Basically, one for each video game (or video game publisher) I was playing, plus some Linux distros, hobbies, politics and the like. It was a wonderful mess.

But a mess it was, and if the dozens of accounts and constant context switching barely enough to handle for an PC nerd like myself, I can only imagine how impenetrable it was for the less tech-savvy. Of course, for people like me this was an added benefit, since it kept the “normies” out and avoided the “Eternal September” in our little communities.

However the demand for places accessible for everyone to discuss was not missing, it was just unfulfilled. So as soon as Web 2.0 took over with the massive walled gardens of MySpace, Facebook, Twitter and so on, that demand manifested and the ability for anyone to create and run a forum within those spaces regardless of technical competency or BBcode knowledge, spawned thousands of little communities.

Soon after Digg and then Reddit came out, and after the self-inflicted implosion of Digg, Reddit along with Facebook became the de-facto spot to create and nurture new async-discussion communities, once they added the functionality for everyone to create one and run it as they wanted.

But the previously existing BBcode forums still existed and were very well established. Places like Something Awful had such strong communities that they resisted the pull of these corporate walled gardens for a long time. But eventually, they all more or less succumbed to the pressure and their members had an exodus. What happened?

I’m not a researcher, but I was there from the start and I saw the same process play out multiple times in the old forums I used to be in. Accessibility and convenience won.

There’s a few things I attribute this to.

  1. The executive costs to create a new forum account is very high. Every time you want to join one, you need to go through making a username (often trying to find one that’s not taken, so now you have to juggle multiple usernames as well), new password, captchas, email verifications, application forms, review periods, lurker wait times and so on. It’s a whole thing and it’s frustrating to do every time. Even for someone like me who has gone through this process multiple times, I would internally groan for having to do it all over again.
  2. Keeping up to date was a lot of work. Every time I wanted to keep up to date with all my topics, I had to open new tabs for each of my forums and look at what’s new is going on. The fact that most of the forums didn’t have threaded discussions and just floated old discussions with new replies to the top didn’t help at all (“thread necromancy” was a big netiquette faux-pas). Eventually most forums added RSS feeds, but not only were most people not technical enough to utilize RSS efficiently (even I struggled), but often the RSS was not implemented in a way that was efficient to use.
  3. Discoverability was too onerous. Because of (1) Many people preferred to just hang out in one massive forum, and just beg or demand new forum topics to be added for their interests so they wouldn’t have to register, or learn other forum software and interact with foreign communities. This is how massive “anything goes” forums like Something Awful started, and this also started impacting other massive forums like RPGnet who slowly but surely expanded to many more topics. Hell almost every forum I remember has politics and/or “out of topic” sections for people to talk without disrupting the main topics because people couldn’t stop themselves.
    And where the forum admins didn’t open new subject areas, the bottom-up pressure demanded that solutions be invented in the current paradigm. This is how you ended up with immortal threads, thousands of pages deep for one subject, or regular mega-threads and so on. Internet life found a way.
  4. Forum admins and staff were the same petty dictators they always were and always will be. Personality cults and good ole boys clubs abounded. People were established and woe to anyone who didn’t know enough to respect it, goddammit! I run into such situations more than once, even blogged about it back in the day. But it was an expected part of the setup, so people tolerated it because, well what else will you do? Run your own forum? Who has the time and knowledge for that? And even if you did, would anyone even join you?

And so, this was the paradigm we all lived in. People just declared this is how it had to be and never considered any proper interactivity between forums as worth the effort. In fact, one would be heavily ridiculed and shunned for even suggesting such blasphemous concepts

That is, until Facebook and Reddit made it possible for everyone to run their own little fief and upended everything we knew. By adding forum functionality into a central location, and then allowing everyone to create one for any topic, they immediately solved so many of these issues.

  1. The executive cost to join a new topic is very low. One already has an account on Reddit and/or Facebook. All they have to do is press a button on the subreddit, group they want to join. At worst they might need to pass an approval, but they get to keep the same account, password and so on. Sure you might need to juggle 1-3 accounts for your main spaces (Reddit, Facebook, Discord), but that’s so much easier than 12 or more.
  2. Keeping up to date is built-in. Reddit subscriptions allows one a personalized homepage, Facebook just gives you your own feed, discord shows you where there’s activity and so on. Of course the corporate enshittification of those services means that you’re getting more and more ads along masquerading as actual content and invisible algorithms are feeding you ragebait and fearbait to get you to keep interacting at the cost of your mental and social health, but that is invisible for most users so it doesn’t turn them off.
  3. Discoverability is easy. Facebook randomly might show you content from groups you’re not in, shared by others. Reddit’s /r/all feed showed posts from topics you might not even know existed and people are quick to link to relevant subreddits. Every project has its own discord server link and so on.

The fourth forum problem of course was and can never be solved. There will always be sad little kings of small sad little hills. However solving 1-3 meant that the power of those abusing their power as moderators was massively diminished as one could just set up a new forum in a couple of minutes and if there was enough power abuse, whole communities would abandon the old space and move to the new one. This wasn’t perfect of course, as in Reddit, only one person could squat one specific subreddit, but as seen with successful transitions from /r/marijuana to /r/trees, given enough blow-back, it can certainly be achieved.

And the final cherry on top is that places like Reddit and discord are just…easier to use. Ain’t nobody who likes learning or using BBcode on 20-year-old software. Markdown became the norm for a reason due to how natural it is to use. Add to that less restrictions on uploads (file size, image size etc) and fancier interfaces with threaded discussions, emoji reactions and so on, and you get a lot of people using the service instead of trying to use the service. There are of course newer and better forum software like the excellent Discourse, but sadly that came in a bit too late to change momentum.

So while forums never went away, people just stopped using them, first slowly but accelerating as time passed. People banned just wouldn’t bother to create new accounts all over again when they already had a Facebook account. People who wanted to discuss a new topic wouldn’t bother with immortal mega-threads when they could just join or make a subreddit instead. It was a slow-burn that was impossible to stop once started.

10-15 years after Reddit started, it was all but over for forums. Now when someone wants to discuss a new topic, they don’t bother to even google for an appropriate forum (not that terminally enshittified search engines would find one anyway). They just search Reddit or Facebook, or ask in their discord servers for a link.

I admit, I was an immediate convert since Reddit added custom communities. I created and/or run some big ones back in the day, because I was naive about the corporate nature of Reddit and thought it was “one of the good ones”, even though I had already abandoned Facebook much earlier. It was just so much easier to use one Reddit account and have it as my internet homepage, especially once gReader was killed by Google.

But of course, as these things go, the big corporate gardens couldn’t avoid their nature and eventually once the old web forums were abandoned for good and people had no real alternatives, they started squeezing. What are you gonna do? Set up your own Reddit? Who has the time and knowledge for that? And even if you did, would anyone even join you?

Nowadays, I hear a lot of people say that the alternative to these massive services is to go back to old-school forums. My peeps, that is absurd. Nobody wants to go back to that clusterfuck I just described. The grognards who suggest this are either some of the lucky ones who used to be in the “in-crowd” in some big forums and miss the community and power they had, or they are so scarred by having to work in that paradigm, that they practically feel more comfortable in it.

No the answer is not anymore an archipelago of little fiefdoms. 1-3 forbid it! If we want to escape the greedy little fingers of u/spez and Zuckeberg, the only reasonable solution is moving forward is activitypub federated software.

We have already lemmy, piefed, and mbin, who already fulfill the role of forums, where everyone can run their own community, while at the same time solving for 1-3 above! Even Discourse understood this and started adding apub integration (although I think they should be focusing on threadiverse interoperability rather than not microblogging.)

Imagine a massive old-school forum like RPGnet migrating to a federated software and immediately allow their massive community access to the rest of the threadiverse without having to go through new accounts and so on, while everyone else gets access to the treasure trove of discussions and reviews they have. It’s a win-win for everyone and a loss for the profiteers of our social media presence.

Not only do federated forums solve for the pain points I described above, but they add a lot of other advantages as well. For example we now have way less single points of failure, as the abandonment of a federated instance doesn’t lose its content which continues living in the caches of the others who knew about it and makes it much easier for people to migrate from one lemmy instance to another due to common software and import/export functionalities. There’s a lot of other benefits, like common sysadmin support channels, support services like fediseer and so on.

These days, I see federated forums as the only way forward and I’m optimistic of the path forward. I think Reddit is a dead site running and the only way they have to go is down. I know we have our own challenges to face, but I place far more trust in the FOSS commons than I do in corporate overlords.

Flux (Schnell) on the AI Horde!

It’s been cooking for a while but we can now officially announce that the Flux.1-schnell is finally available on the AI Horde!

Flux is one of the most exciting Generative AI text2image models to come out this year, from a team of ex-stability.ai developers, and seemingly consumed all the attention of the GenAI enthusiasts overnight. It’s a very powerful model but as a downside it requires a significantly more powerful PC to run than the more popular SDXL models were until now.

The model available on the horde is primarily the fp8 compact version we took from civitAI, as it simplifies the amount of downloads we have to juggle.

I was really eager to offer the flux.1-dev version as well, as it has a lot more LoRas available and is a bit more versatile, but sadly its license contains some requirements which do not appear to allow a service like the AI Horde to provide it, even though it’s a completely free service for everyone. However we have reached to the Black Forest Labs via email to ask for clarification or exception for this and will let you all know if we hear back.

To use it, head over to Artbot or Lucid Creations and simply select the Flux.1-Schnell fp8 (Compact) model for your generation. However keep in mind that this model is quite different from the Stable Diffusion models you’re used to until now, so you need to adjust your request as following to get good results:

  • Set sampler to k_euler
  • Set steps between 4 and 8 (4 is enough for most images)
  • Set cfg to 1

Also keep in mind that the model won’t use the negative prompt. Instead it benefits massively from using native speech to describe what you want to draw instead of a tag-based approach.

If you are running a dreamer worker make sure you check our instructions in our discord channel on the best settings to run flux. This is a big model, so GPU with 16G-24G VRAM are the best for running it at a decent speed and we could use all the help we can get.

If you are making integrations with the AI Horde, make sure you use the flux branch of the image reference repository until it’s merged into main on the end of the month, if you’re using it to retrieve model requirements.

Along with flux, tazlin has done some amazing work on adding the latest version of comfy and improving the stability and speed of the worker. I mean, just look at this changelog! This also greatly improves our support for AMD cards. They might not be as fast as nvidia, but they should work!

Finally we’ve added some improvements on the horde itself to allow slower workers to offer models. If you have an older GPU which often gets timed out and put on maintenance on the Horde due to speed, you can now set yourself as an extra_slow_worker which will extend your TTL and will be used by things like automated bots, or apps like that sweet AI Wallpaper Changer.

Finally, I’ve also extended our deployments ansible collection so that if you use a Linux system, you can easily deploy any number of reGen workers, even multiple in the same server to take advantage of multiple GPUs. It will even deploy the AMD drivers for you if you want it. With this I am continuing to extend the tools to allow more people to run the AI Horde infrastructure on their own.

We hope the existence of flux on the Horde will allow unlimited creativity from people who want access to the model but don’t have the hardware to run it. Now more than ever, people with mid-range GPUs can offer what they can run, such as SDXL or SD 1.5 models, and in turn, benefit from others offering the larger models like flux and we all benefit through mutual aid!

Enjoy!

Year Two of the AI Horde!

The AI Horde has turned two years old. I take a look back in all that’s happened since.

Can you believe I blogged about the first birthday of the AI Horde approximately one year ago? If you can, go ahead and read that one first to see the first chapter of its existence.

Since we started recording stats, we’ve generated 113M images 145M texts, which just goes to show just how explosively the FOSS LLM scene has embraced the AI Horde since last year, completely outpacing the lifetime image generations within one year!

This year has been the first one since we received funding from NLNet, so let’s take a look at what we achieved:

Overall, development has continued throughout the last year and we’ve been trying to onboard as many new features as possible with 2 core devs. Sadly our donation income has completely collapsed since the same time last year, to the point where the money is just barely covering our infrastructure costs.

If you see value in what the AI Horde please consider supporting our infrastructure through patreon or github or consider onboarding your PC as a Dreamer or Scribe worker.

What was your favorite new addition to the AI Horde from the past year? Let me know if there’s any event I forgot to mention.