Excited to see my TMF REWIND stats for 2025 🫣🫣 heard the team worked really hard on it!


Co-written by queazy

$4.65 for an americano is crazy work 😭💀⚰️


rogue update I

Just messing around wasting time in javascript :c

Use WASD to move around (breaking bounds will break bounds). ib the legendary Rogue. Doing some dirty innerHTML swapping to "render" the world with ,. for grass. Planning on separating entities into "layers", for example having items and enemies and the player exist on the "entities" layer.

Not much else planned -- maybe basic enemies, fantasy items?

click to focus!








View Source Code
<pre id="canvas" tabIndex="0"></pre>

<style>
#canvas {
    font-size: 14px;
    background-color: #101010;
    color: #f0f0f0;
    width: fit-content;
    max-width: 100%;
    box-sizing: border-box;
    padding: 1rem;
    overflow-x: scroll
}
</style>

<script>

const el = (ident) => { return document.querySelector(ident); }

const canvas = el("#canvas");

const WORLD_WIDTH = 48;
const WORLD_HEIGHT = 18;
var world = [];
var entities = [];

const player = {
    x: WORLD_WIDTH / 2,
    y: WORLD_HEIGHT / 2,
    ch: "@",
}

function buildWorld() {
    for (let i = 0; i < WORLD_HEIGHT; i++) {
        let row = [];
        let empt = [];
        for (let j = 0; j < WORLD_WIDTH; j++) {
            row.push(Math.random() < 0.1 ? "," : ".");
            empt.push("");
        }
        world.push(row);
        entities.push(empt);
    }
}

function initPlayer() {
    entities[player.y][player.x] = player;
}

function renderPlayer(buffer) {
    buffer[player.y][player.x] = player.ch;
}

function refreshWorld() {

    // deep copy
    let buffer = world.map(r => r.slice());
    renderPlayer(buffer);

    canvas.innerHTML = buffer.map(r => r.join("")).join("\n");
}

canvas.addEventListener("keydown", (e) => {
    switch (e.key) {
        case "w":
            player.y -= 1;
            break;
        case "s":
            player.y += 1;
            break;
        case "a":
            player.x -= 1;
            break;
        case "d":
            player.x += 1;
            break;
    }

    refreshWorld();
});

buildWorld();
refreshWorld();

</script>

Guest written by queazy

first time writing for the blog
but i got no thoughts
i miss my cats
so much so that i yearn for a dog


ai slop code is buns :heartbreak: finally rewrote some unorganized code. Still need a lot of qol features but things are pretty steady now!


happy thanksgiving !!


New styling

Exploring some new styling and colors for a softer, clearer look. Looking very very similar to another blog site I know as a matter of fact T-T

shoutsouts


A test

This is a testing document highlight the various features of articles, all based on markdown. From standard things like this, we'll explore.

Another Header

This header should be smaller. Generally we only want one H1 per article.

And another header

It'll keep going and going.

Code Blocks

With the power of highlight.js and marked, we get full syntax higlighting:

const highlight = "code";

const a = () => {
    console.log("hey");
}

Bye Netlify

After hitting my Netlify monthly limit during testing (forgot to disable auto build on github push), I've successfully switched to Github Actions as the CI process for rebuilds. Like before, CRUD operations trigger a firebase function which checks auth and then triggers a Github Actions workflow, rebuilding and redeploying the site (only one process allowed at a time to prevent wasted concurrency in overlapped requests).

It has the same issue of being a little slow to show in live, but thats just one of the drawbacks of full static site generation. I'm pretty happy with this implementation now, and hopefully the limits are far more sane. Will look into self hosting this Actions runner as well.

Edit
We've now switched to a self-hosted runner. This edit's changes were propagated with the Lotus home server!


yeah just hit 50% utilization of Netlify free credits for this month; it hasn’t even been 12 hours 😭💀⚰️

CR laugh


Implementation Lamentation

Now that the site is in its most basic working state, I’m not super satisfied with the implementation. I initially intended on keeping everything “within” firebase, from database to storage to hosting and functions. However it seems firebase has poor support for static rebuilds and updates to their hosting, something I need to investigate further.

Currently we use Netlify for hosting, allowing us to use a firebase function to request site rebuilds (requiring an authenticated user of course). While it works, I’m not fully satisfied with the disjointed operation, even if it does work fine for now.

Other pursuits would be figuring out a function or switching to github actions CI, which is the same as Netlify honest—-just with more manual work.


Guest written by queazy

Was craving some coffee today.
But I also wanted to hop in the stu.
Thats why I went to H-Mart, lets gets some Tous les Jours.


life is too short to not lock in more


Recap of Today

Major Revision

Blog rewrite switched from scratch SSG to astro. Ultimately the same end product for a much easier development experience without having to reinvent the wheel.

Making stuff from scratch is cool (at the cost of time and patience).

Introduction of new admin editor and dashboard with auth, with serverless CRUD on articles. This is lacking a site rebuild still -> changing posts doesn't reflect in "prod." Can be faked with javascript, but loses the main point: SSG!

Lost Features

No more highlight.js syntax highlighting -> will be added later

Still Need

  • image (and eventually file) uploads
  • guest/co-writers
  • site rebuild/some solution on CRUD

cya !


Grind Report

Worked on blogs today, completing daily sprint. Circled back on leftover topics, whiteknuckled through getting our ducks in a row, but finished EOD. The story points (fibonacci edition) were well numbered.

shoutout thinkpad users

battery at EOD

device battery
t14 gen 2 18%
t14s gen 3 44%
iPhone 15 Pro 22%
iPhone 13 44%
iPhone 16 Max 31%
Garmin Forerunner 165 (silicone band) 55%
Garmin Forerunner 165 (nylon band) 87%
Test

Items consumed

Clash winrate

57.142857142% win rate in duos today

Starbucks bathroom password

02468

Emails Written

1

Linkedin connections made

at least 1

Vibe coded prompts sent

at least 1

calls received

2 (declined 1)

Steps taken

~800


Yaaahhhh. It's rewind time. Yeah, if I control rewind, I would want... Fortnite... and Mark Ass Brown Lee

✋😮‍💨... ☝️😉... 🫰💭

The wise words of popular actor and celebrity Will Smith during his surprise guest appearance in YouTube Rewind 2018: Everyone Controls Rewind. The video, as of November 2025, has amassed over 20 million dislikes, by far one of the most hated YouTube videos of all time.

Perhaps this intro by Smith has angered the masses, setting a silly tone for a once beloved yearly YouTube tradition. Smith's introduction of well known tech reviewer Marques Brownlee was especially hated given his mispronunciation of admired influencer's name.

Furthermore, the reference to Epic Games' hit title Fortnite stirred discontent in the wider audience, who questioned Smith's otherwise unc status for making note of such a hip, popular game.

The world will never know the directions and turns taken as a result of this video, and YouTube rewind has never been the same since.


First day of rising and grinding early complete 🫩🫩


Nosferatu Review

4/5 cupcakes

Nosferatu was really scary guys 😱😱😱 !!! I had to lok away so many times. Very fun movie, not for kids 101/10.

Please do check out JAGM's review, he knows it much better than I!


Got a KeyLab mkii today :o

Keylab Essential MK1 and Keylab MKII