#1713557458
[ mb_dev ]
We do a little refactoring.
Showing 58 changed files with 406 additions and 352 deletions.
Project structure is now much better, less global var’s etc.
▄▄▄·▪ ▐ ▄ ▄▄▄ . ▐█ ▄███ •█▌▐█▀▄.▀· ██▀·▐█·▐█▐▐▌▐▀▀▪▄ ▐█▪·•▐█▌██▐█▌▐█▄▄▌ .▀ ▀▀▀▀▀ █▪ ▀▀▀
https://pine32.be - © pine32.be 2026
Welcome! - 124 total posts. [RSS]
A Funny little cycle 2.0 [LATEST]
#1713557458
We do a little refactoring.
Showing 58 changed files with 406 additions and 352 deletions.
Project structure is now much better, less global var’s etc.
#1713121703
Golang is simple, which means that its easy to understand.
Running a marathon is simple; you just keep running. But nobody would call it easy.
So why do people call Python easy and simple? Things only seem simple until you need to do something complex. Then the complexity starts to compound.
People need to take complexity more into account when choosing a technology. The amount of magic that is happening always has a cost. You just need to consider if you will pay that cost for a certain project or if you will never run into the downside.
Simple things are not always better, to be clear. But they have their place, and recently I am leaning more towards simpler solutions. They may require more work, but at least I know that I understand most of the things that are happening.
#1712829445
Hmmmmm yes, sounds
#1712519722
People are sleeping on WHIPPED CREAM.
#1712417261
Just added metadata and updated the colour scheme for better contrast. With these two updates completed, I finally have a perfect Lighthouse score.

#1712394774
🔥🔥🔥

#1712090133
The datalist element is pretty cool. You can make dropdown inputs that are still editable realy easy. Came in handy today.
<label>
Choose a flavor:
<input list="ice-cream-flavors" name="ice-cream-choice" />
</label>
<datalist id="ice-cream-flavors">
<option value="Chocolate"></option>
<option value="Coconut"></option>
<option value="Mint"></option>
<option value="Strawberry"></option>
<option value="Vanilla"></option>
</datalist>
Source example: MDN Web Docs
#1711884999
Today is the first day of summer time and mb handled it correctly. I did not expect it to work correctly because I can’t recall implementing it.
I think the system will break if you change the time zone after the fact. Posts don’t store time zone data, only a Unix timestamp. Just don’t change the time zone I guess.
#1711279188
Finally added the RSS feed to mb. Wasn’t to difficult using the encoding/xml module of the standard lib and exactly 100 lines of code. It’s basic but it’s valid and it works. Maybe I will flesh it out if people actually use it.
#1711234656
…Because I’m Young Arrogant and Hate Everything You Stand For
#1710948563
javascript fatigue:
longing for a hypertext
already in hand
- HTMX
#1710620087
Mb has finally support for file uploads, only images for now. Video and audio is planned, soon™. The blog is more self sufficient with this feature added, not dependent on any other services.

photo credit: ii*
#1710601100
Just found out a way to add hotkeys to a website without using JavaScript.
<a href="/auth" accesskey="a" aria-hidden="true" tabindex="-1"></a>
<a href="/media" accesskey="m" aria-hidden="true" tabindex="-1"></a>
<a href="/backup" accesskey="b" aria-hidden="true" tabindex="-1"></a>
aria-hidden="true" and tabindex="-1" are there to keep screen readers happy (and to keep my Google Lighthouse score high).
These hidden elements add alt + x hotkeys. It always surprises me how many things the HTML5 spec has integrated.
Shoutout to this article for the idea.
#1710190961
Vibe, post-workout
#1709333288
Tested the backend of this blog on small VM on my desktop with both a native binary and Docker to compare performance. My desktop could have a lot of variance so this test is not that accurate. The VM has 2GB of ram and 4 cores allocated. Memory is not limiting factor as the webserver uses 20MB at most. All 4 cores are utilised but the one core is always more used then the other, I assume that this is the case because the webserver is database limited for the most part. SQLite is in some ways single threaded.
1 [||||||||||||||||||||||||||||||| 78.5%]
2 [|||||||||||||||||||||||||||||||| 80.2%]
3 [|||||||||||||||||||||||||||||||| 80.3%]
4 [||||||||||||||||||||||||||||||||||95.7%]
I used the latest version at the time of writing.
I did 3 runs of each, alternating between the two version to limit variation. I used a tool called bombardier with 20 concurrent connections for every 10 second run. The requests are made from the host machine to give the webserver the whole VM to itself. This does add extra overhead but it is the same for both versions, so for sake of comparison this is fine.
These are the averaged results for both versions.
Statistics Avg Stdev Max
Reqs/sec 262.03 152.02 913.95
Latency 75.22ms 53.44ms 0.93s
Latency Distribution
50% 71.05ms
75% 104.18ms
90% 127.14ms
95% 143.13ms
99% 188.12ms
HTTP codes:
1xx - 0, 2xx - 2643, 3xx - 0, 4xx - 0, 5xx - 0
others - 0
Throughput: 3.15MB/s
Statistics Avg Stdev Max
Reqs/sec 260.70 150.30 962.85
Latency 76.59ms 53.97ms 0.95s
Latency Distribution
50% 70.67ms
75% 107.55ms
90% 135.69ms
95% 151.88ms
99% 197.22ms
HTTP codes:
1xx - 0, 2xx - 2622, 3xx - 0, 4xx - 0, 5xx - 0
others - 0
Throughput: 3.12MB/s
These results are really close with a very slight edge for the binary. Only 0.5% more requests per second and 1.78% lower latency on average. This is within the margin of error for this unstable setup. But even if we would take these results as 100% accurate I still think it is worth the small hit in performance. This small hit is probably even smaller when you are using a bigger server on more native hardware.
#1709055561
I am going to keep spreading Golang propaganda until everybody uses Go and then I will make my move to Elixir or OCaml.
#1708895446
I know what you want
#1708464707
Fire beat
#1707727407
SSE are cool.
This an example using the Echo framework in Golang. It sets up the connection, consumes a channel and sends that data to the user. It also exits the loop if the connection is broken, this is communicated via the request context.
func BuildingSSE(c echo.Context) error {
c.Response().Header().Set(echo.HeaderCacheControl, "no-cache")
c.Response().Header().Set(echo.HeaderConnection, "keep-alive")
c.Response().Header().Set(echo.HeaderContentType, "text/event-stream")
queue := queue.GetBuildQueue()
ctx := c.Request().Context()
for {
select {
case result := <-queue.BuildLogsChannel:
fmt.Fprint(c.Response(), buildSSE("message", result))
c.Response().Flush()
case <-ctx.Done():
return nil
}
}
}
func buildSSE(event, context string) string {
var result string
if len(event) != 0 {
result = result + "event: " + event + "\n"
}
if len(context) != 0 {
result = result + "data: " + context + "\n"
}
result = result + "\n"
return result
}
#1707727213
The beauty of my heart is not contagious!?
うつらない の わ こころ の うつくしさ
#1707657516
It’s a funny little cycle

#1707591969
Throwback
#1707084791
Custom embeds :D
With this feature done, mb is now ready for its first deployment.
Players never doubt

#1707084494
Let me watch…