2025-12-16 04:02:00
Article written by kami
Heya!
Ava recently had the idea to make a channel in the gazette discord where every message automatically gets posted on a website.
So, i went and implemented it. Introducing sg.kamiscorner.xyz, also known as chat surgery!
Everytime someone posts a message in the #auto-blogging chat in the gazette discord, it automatically gets added to the site. Without any input validation whatsoever. We already have an alert(1) about two minutes into the sites existence, and suliman changed the background to be piss-colored.
Anyways, how'd i do it?
Fairly simple, we've got a discord bot that listens for new messages and writes them to a file. I've got this bot running in the background at all times on a server i own. I've also got a webserver running php, which reads that file and puts the contents on the website. That's it. Chat surgery.
Here's the source code!
The python bot:
import discord
import csv
import os
# Define your bot's token and the channel ID you're interested in
TOKEN = '' # Replace with your bot's token
CHANNEL_ID = 0 # Replace with the channel ID you want to monitor
# CSV file path
CSV_FILE = 'messages.csv'
intents = discord.Intents.default()
intents.message_content = True # Enable content intent to read messages
# Set up the bot client
client = discord.Client(intents=intents)
# Create the CSV file if it doesn't exist
if not os.path.exists(CSV_FILE):
with open(CSV_FILE, 'w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow(['Author', 'Message', 'Timestamp']) # Header row
# Function to write messages to the CSV file
def write_to_csv(author, message, timestamp):
with open(CSV_FILE, 'a', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerow([author, message, timestamp])
# Event when the bot is ready
@client.event
async def on_ready():
print(f'Logged in as {client.user}')
# Event when a new message is received
@client.event
async def on_message(message):
# Ignore messages from the bot itself
if message.author == client.user:
return
# Check if the message is from the specific channel
if message.channel.id == CHANNEL_ID:
# Write the message details to the CSV
write_to_csv(message.author.name, message.content, message.created_at)
print(f"Message from {message.author.name}: {message.content} saved to CSV.")
# Start the bot
client.run(TOKEN)
The singular index.php:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>chat.surgery</title>
</head>
<body>
<h1>chat.surgery</h1>
<?php
$lines = [];
$file = fopen('messages.csv', 'r');
while (($line = fgetcsv($file)) !== FALSE) {
if($line[1] != "Message") {
$lines[] = $line[1]; // store messages in array
}
}
fclose($file);
// loop through array in reverse order
for ($i = count($lines) - 1; $i >= 0; $i--) {
echo "<p>{$lines[$i]}</p>";
}
?>
</body>
</html>
I might make a more-indepth technical explanation on how to set up the kvm for all of this at some point, but i feel like this is clear enough that anyone who for some reason wants to subject themselves to hosting this can do it.
2025-12-15 04:54:00
One of the fun side projects I've taken on this year has been powRSS, the public RSS feed aggregator for the Indieweb.
As 2025 comes to a close, I want to put together a summary of the things that went on. I'm a strong believer of building in public, and that includes talking about the goals, successes and failures.
Here is how powRSS did this year, from May 21st when it launched to today, December 14th.
| Metric | Count |
|---|---|
| New Blogs | 317 |
| Posts Served | 15,246 |
| Item | Amount (USD) |
|---|---|
| Community Support | |
| Ko-Fi | +$101.00 |
| Expenses | |
| Domain | −$11.06 |
| Hosting | −$73.44 |
| Formspree | −$120.00 |
| Total expenses | −$204.50 |
| Net operating cost | −$103.50 |
Thank you so much to all of you who helped support this project! It's so rewarding to see the response it has gotten in the eight months it has been running.
I'm excited about what the next year has in store for us!
On Friday May 21, Fred Rocha wrote a blog post titled Small (web) is beautiful in which he talked about digital gardens, the indieweb, and the challenge of discovering new sites and independent voices to follow.
I replied to him with a blog post where I put together some of the resources I knew about like Andreas Gohr's Indieplog.page and Viktor Lofgren's Marginalia Search.
During this time I had been wanting to get back into the Gemini Protocol, as that project was what introduced me to the small and personal web about five years ago. I loved the ethos and the community aspect of it all. When documentation wasn't available to achieve something, I knew I could ask for help and many kind folks would be glad to offer advice.
That evening I put together a quick proof of concept written in Ruby and launched the following morning. I find that the desire to help and build together remains true today with Indieweb communities, and I'm grateful for the comments, advice, and feedback I've received about powRSS since it launched.

This version was a static page, set to rebuild every 12 hours with new posts from its list of known feeds. It's actually very similar to the way lettrss works to send out each book chapter :-)
During this time all blog submissions were handled via e-mail. I added my e-mail address to my blog and when people came across the project they'd send me links to their RSS feeds.
About a week later, as more people began submitting their blogs to be added to the feed, I decided to add categories and a dedicated submissions form.

On the afternoon of my birthday, May 31, I came across a post from Joan Westenberg:
Independent sites who don’t have the resources to compete with major platforms in visibility and search rankings, lose traffic and, consequently, viability. As a result, entire categories of information and smaller communities become less accessible, hidden behind the algorithms of the dominant, bloated tech giants.
I took this quote and shared a link to powRSS on Mastodon, and this is where things got even more exciting!
Post by @[email protected]View on Mastodon
Westenberg, who has 30k followers, made powRSS visible to a lot more people, and that meant receiving way more submissions and responding to new kinds of feedback.
One of the first great suggestions came from Alex White who sent me a message suggesting the addition of a "Random site" feature like StumbleUpon. That seemed really fun to implement, so I wrote another blog post announcing the new feature.

With more blogs being added to powRSS, I began spending more time going through submissions. It's important to me that powRSS remains a space for human creativity, independent voices, and the serendipity of coming across people who, like you, understand that the web is indeed beautiful. The things we read and interact with inform our decisions and strengthen our convictions, so cultivating a space that enables this type of discovery matters.
Today I continue to manually review all submissions. I like knowing that every link on powRSS takes me to the website of another person who took the time and care to build out a space for themselves on the internet. My absolute favorite part of this project has been discovering blogs I would have never come across otherwise and having conversations with those authors.
Around November I wanted to give powRSS a more retro feel to better reflect its mission.

In this design the two-column layout on desktop was important because I wanted those recently-added blogs to also have some discoverability. As you can imagine, some authors write more frequently than others. Some of you write every few months, and if you were to add your blog to powRSS without a recent blog post, it could take a while before others knew about your blog.
The "new to powRSS" column made it easy to find blogs which maybe didn't have recent posts but you also knew were being actively maintained, since each addition to powRSS requires the manual submission from its author. Indeed, some of you told me you felt more excited about blogging again knowing that your posts were definitely going to be seen by others!
As you can see, powRSS no longer had categories like before. I thought a while before getting rid of them, and I think in retrospect it was a mistake, so I brought them back with a twist. I do want to explain my reasoning though.
By giving blogs a strict category, we end up pigeonholing authors, especially those who have personal sites. I love seeing personal stories along with pictures of a trip or the last book you read even if your blog is mainly about programming or photography or sports. The whole point of the personal blog is to have that freedom.
"Can I still share pictures of my dog if I'm in the Technology category?" was a question I received, so I realized site-wide categories weren't the way to go. However, there is of course a benefit to knowing about the blog you're about to visit, so I chose a happy middle ground by adding brief category labels below each blog.
This was added in time for the Winter redesign I launched at the beginning of December.
Here is what powRSS looks like today:

Thank you all for making the web more exciting, more vibrant, and more human. Have an excellent rest of the year!
Grateful,
Pablo Enoc
2025-12-14 23:51:00
If you’re a Bear user, chances are you’ve come across my theme Bearming at some point. You may even have used it. Or maybe you’re still using it.
I had a look at the changelog the other day. It showed that the theme was first released on August 17, 2024. The last update was February 20, 2025... until today. Because now Bearming 3.0 is finally here. 🥳
The theme has been rebuilt from scratch and now sits on a more modern and solid base. The idea is still the same though. Use it as is, or personalize it further with add-ons, pre-made palettes, or your own colors.
As always, I have a ton of ideas for future add-ons, and I’ll probably add a scripts section as well. That said, you can already personalize Bearming in plenty of ways.
If you’re curious, I’m currently using the Swedish fika palette together with these add-ons:
More is coming, but I hope the current options are enough to get you started.
If you’re using the Bearming theme and want to share your thoughts, I’d love to hear from you.
Please note: If you’re using older add-ons, they may look a bit off for now. Updated 3.0 versions are on the way.
2025-12-14 18:11:00

Every now and then that ultra–niche gadget comes along the one that just makes part of your day easier. For me, in the last few weeks, that’s been the Xteink X4: a tiny e-ink reader the size of a credit card, designed for maximum portability.
It’s definitely not a device for everyone more for tinkerers or anyone who wants a pocketable, minimalist reader but it does its job surprisingly well. Here’s my breakdown after using it for a few days.
Affordable price
On Xteink’s official website it’s listed around $70, but it’s often on sale.
On AliExpress you can find it for 50–55 €.
Note: the AliExpress version does update firmware even though many users say otherwise.
Active customer support
The Xteink team is very present on Reddit and usually replies within 1–2 days.
Constant firmware development
Xteink releases firmware updates almost every 1–2 weeks.
Each update brings fixes, text layout improvements, new character support, and more.
Magnetic covers available
The “book-style” magnetic covers are cheap, well-made, and offer good protection.
More cover types are coming soon (rigid backplates, colored versions).
Battery life
The 650 mAh battery is surprisingly long-lasting thanks to the low e-ink consumption.
With my usage (1–3 hours of reading per day) I still haven’t needed to recharge it after two weeks.
Here are the relevant technical specs to understand what’s “under the hood”:
Not for non-technical users
If you want to gift it to someone older or not tech-savvy, it might be tricky: you need a PC to add books, convert files, fix BMP fonts, etc.
Frequent updates = possible bugs
The constant development is great, but each update can introduce new issues.
Italian text rendering
To read Italian books without problems, I had to convert files, fix encoding, and install custom fonts. It’s not fully “plug-and-play” yet.
Shipping times
The device is in high demand: you might wait more than two weeks.
Many users on Reddit report delays.
Rumor has it (and Reddit users are almost certain) that in 2026 the Xteink S4 will launch: same compact size but Android-based.
This could mean:
In my opinion, if it stays around 140 €, it could be a real bargain.

The Xteink X4 is perfect for a niche audience: anyone who wants an ultra-portable, lightweight, affordable, and DIY-friendly e-ink reader.
It’s not the most powerful Kindle, it has no frontlight and no advanced touchscreen, but no other device this size does what it does.
If you’re willing to invest a bit of time setting it up, it will definitely reward you.
For me, it has already become part of my daily reading routine especially when I want to disconnect from my phone screen but don’t feel like carrying a full-size Kindle around.
{{ email_signup }}
Just a quick reminder at the bottom of the page there’s a little button with two arrows pointing up.
If you click it, you’ll be doing me a huge favor <3
Thanks again, everyone 🫶🏻
2025-12-14 05:21:00
Believe it or not, I hadn't heard about NaNoWriMo (National Novel Writing Month for those that similarly missed the memo) until 2023. A bit later than most, but I've never been particularly dialed in with online trends. I also wasn't really thinking about writing before then, at least not for many years. The spark of creativity remained barely lit and hidden away within me, somewhere so deep I didn't know of its existence.
But I've already told that story, it's time to talk about my experience with NaNo.
When I started writing again that year, two of my friends independently told me to try NaNo with them. They both said that they had tried it solo in the past but never gotten all the way through. I suggested we make a little accountability group chat so we can check in on each other and help us all stay motivated to do the dang thing, an easy yes to secure since these two also knew each other. They agreed, thinking it sounded like a fun and collaborative way to stay motivated.
Both of these friends had been writing much more recently than me, one of them currently drafting a novel (one that I truly hope sees the light of day as the excerpt I read blew me away). They were planning to use the month of glorified crunch to make some serious progress since they'd been letting the story sit on the back burner. The three of us added each other on the NaNo website so we could see each others' progress (a great motivator for me, someone who is highly competitive) and prepared in our own ways for the grueling month of writing ahead of us.
November 1st arrived and I hit the ground running. I set my daily writing goal of 1667 words and did my best to stick to it. The first week flew by, two of us hitting our goals each day while the third was already struggling to keep momentum after a few days. I did all I could to support them, but that friend would wind up officially tapping out shortly after. They were kind and continued to praise the two of us as we pushed past those first seven days, feeling barely worse for the wear but unable to deny the vibe shift that had already set in. We trudged along with one more cheerleader at our backs and one less soldier to our sides. The two of us still in the trenches felt the full weight of the 50,000 word workload squarely on our shoulders.

I admit that I used poor time management and unsustainable practices to maintain this pace, filling every spare moment of time typing until I hit my goal. I felt the drive to write the story I was working on. I was invested in the characters, in the conflict, in the unique point of view I had chosen to write from. I had no idea what my friend was working on (or maybe I did at the time but I've forgotten in the two years since), any piece of "extraneous" information leaving my brain to make room for plot progression and character development. Even if I didn't hit 1667 every day, there were days I hit 2k! I was always at or above the overall word count goal out of fear that one misstep would leave me buried alongside my friend.
By the end of week two, I was the only one still on track. My last remaining cohort still fighting alongside me had fallen a few steps behind, urging me to continue ahead without them. Telling me they needed a brief break and would catch up soon. I knew I couldn't stop for them, the knowledge killing me. It felt like leaving someone behind who stepped on a land mine. Someone who saw their mortality in front of their eyes and knew the best they could do was encourage the people that wanted to help to save themselves from the inevitability of the end.
The end of week three marked the end of anyone but me continuing to walk towards a goal that looked further and further away the closer it came. My steady progress began to falter, the first day passing where I fell under the word count I needed to consider myself on track. I pushed harder, relying less and less on my two cheerleaders as each message to them for encouragement or accountability just wound up making me feel bad. It felt like I was showing off, that I was bragging to two people I assumed had given it their all and fallen short. Their white flags and those of the countless other writers who had surrendered littered the landscape behind me.
As a US resident, the fourth week included Thanksgiving. This added a unique tribulation to the mix toward the very end of an already brutal trial. It was almost like a final boss to conquer before the home stretch. I was desperate to come out the other side a victor after the slog of hours spent toiling away behind a computer screen. I mustered the last bit of my strength and forced myself to get ahead on my word count, losing any semblance of free time I had managed to hold on to until the holiday week.
November 28th marked the end of my NaNoWriMo journey. After severe crunch and many sleepless nights, I hit my goal for the month. 50,000 words. The relief I felt was immeasurable, rivaled only by the tsunami of dopamine that rushed through my body from completing a task I'd deemed practically impossible mere days prior. The ecstasy was overwhelming. I wound up with more than 52k words by the end of the month, refusing to lose speed on my output.
The spoils of my victory took the shape of a certificate saying I had completed NaNoWriMo (granted, without the need for any sort of verification), a better discount on Scrivener (half off instead of 25% for participating), and two pieces of NaNo merch from some family members for Christmas later that year. One to commemorate attempting, one to signify completion.

I rode that high for weeks. In fact, I used that unregulated happiness to trick myself into continuing at that pace all the way into the New Year (a choice I would feel the ramifications of for infinitely longer than my two month and change stint of constant progress). To be frank, I'm still negatively impacted by this decision to this day years later.
But what can I say? I felt good. Unstoppable. Stephen King says he writes 400 words every single day. Sure, he might not be the world's best frame of reference with some of the weird sex stuff he puts into his books (especially when it involves minors), but the consistency of his output is undeniable. I may have toned down my word count goals after completing NaNo, but I was still forcing myself to write every single day with little to no exception.
Some time in January, I finally missed a day for one reason or another. Then another. Another. Pretty soon, I shelved the book I had sunk almost 100k into. I told myself any number of things to explain away the gnawing feeling in my gut that I had given up. I wanted to spend more time with a friend in town. I wanted to make time to start back up the pixel art lessons I put on hold during November. I decided I had earned a brief respite from practically daily progress as a reward for my hard work.
The truth of the matter is I was burnt the fuck out. That story continues to collect dust, the first on a shelf of unfinished projects that I'm sure will stack up over time.
I've managed to come back to my writing with a new perspective, even if it leaves me always doing a little less than I'd like to further along my current work in progress. To be fair to myself, I am juggling many more projects now. I'm making consistent progress, just not at an insane rate on any of them. I'm still so happy with how far I've come. How much healthier of a relationship I have with my creative projects now, even if I've left a lot to be desired in my production speed.
So what have I learned?
NaNoWriMo does not promote sustainable writing practices. Sure, that should've been obvious from the start, but hindsight is 20/20. That crunch mentality helped me make great strides on my story at the time, but it also led to discontent. To a slow but steady loss of passion for the project. Pride is fleeting, the sense of accomplishment willing to leave the moment you lose the ability to continue at an impossible rate.
In the aftermath of a NaNoWriMo success story, I've found a way to give myself more attainable challenges going forward. Things like monthly bingo cards with unique goals that I choose have given me a more finite, achievable workload that I space out at my discretion. They've been a lifesaver for staying motivated on multiple projects at once without getting overwhelmed or run down.
Burnout is no joke, y'all. Take some time to be kind to yourselves this year.
After all, there's not much time left to do so.