Got a nice conspiracy theory for you:
https://mastodon.social/@mcc/115670290552252848
Actually wait I just thought about this and realized that the precise timing of the ACTUAL GitHub seed bank, by which I mean the Arctic Code Vault, on 2020-02-02, makes it more or less a perfect snapshot of pre-Copilot GitHub. Also precisely timed before we all got brain damage from COVID. This is the only remaining archive of source code by people with a fully working sense of smell
(Bonus points because the Arctic World Archive is located in Svaldbard and thatās the name of the AI in Stacey Kadeās āCold Eternityā.)
I cleaned up all my of AoC (Advent of Code) 2025 solutions, refactored many of the utilities I had to write as reusable libraries, re-tested Day 1 (but nothing else). here it is if youāre curious! This is written in mu, my own language I built as a self-hosted minimal compiler/vm with very few types and builtins.
I finished all 12 days of Advent of Code 2025! #AdventOfCode https://adventofcode.com ā did it in my own language, mu (Go/Python-ish, dynamic, int/bool/string, no floats/bitwise). Found a VM bug, fixed it, and the self-hosted mu compiler/VM (written in mu, host in Go) carried me through. š„³
I just completed āPrinting Departmentā - Day 4 - Advent of Code 2025 #AdventOfCode https://adventofcode.com/2025/day/4 ā Again, Iām doing this in mu, a Go(ish) / Python(ish) dynamic langugage that I had to design and build first which has very few builtins and only a handful of types (ints, no flots). š¤£
I just completed āLobbyā - Day 3 - Advent of Code 2025 #AdventOfCode https://adventofcode.com/2025/day/3 ā Again, Iām doing this in mu, a Go(ish) / Python(ish) dynamic langugage that I had to design and build first which has very few builtins and only a handful of types (ints, no flots). š¤£
I just completed āGift Shopā - Day 2 - Advent of Code 2025 #AdventOfCode https://adventofcode.com/2025/day/2 ā But again, Iām solving this in my own language mu that I had to build first š¤£
I just completed āSecret Entranceā - Day 1 - Advent of Code 2025 #AdventOfCode https://adventofcode.com/2025/day/1 ā However I did it in my own toy programming language called mu, which I had to build first š¤£
Alright, Advent of Code is over:
https://www.uninformativ.de/blog/postings/2025-12-12/0/POSTING-en.html
Itās been quite the time sink, especially with the DOS games on top, but it was fun. š„³
In case youāre wondering: All puzzles (except for part 2 of day 10) were doable in Python 1 on SuSE Linux 6.4 and ran in a finite time on the Pentium 133. Puzzle 10/2 might have been doable as well if I had better education. š¤£
my MIND is a MACHINE that turns ILLEGIBLE CODE into ILLEGIBLE CODE

iāve learned a lot of lessons from writing my notes app, gonna apply this to bbycll and refactor the code to make it way more legible cause my custom templating system is only kind of a giant mess
@prologic@twtxt.net Here you go:
(LTT = āLinus Tech Tipsā, thatās the host.)
LTT: There was a recent thing from a major tech company, where developers were asked to say how many lines of code they wrote ā and if it wasnāt enough, they were terminated. And there was someone here that was extremely upset about that approach to measuring productivity, becauseā
Torvalds: Oh yeah, no, you shouldnāt even be upset. At that point, thatās just incompetence. Anybody who thinks thatās a valid metric is too stupid to work at a tech company.
LTT: You do know who you just said that about, right?
Torvalds: No.
LTT: Oh. Uh, he was a prominent figure in the, uh, improved efficiency of the US government recently.
Torvalds: Oh. Apparently I was spot on.
@lyse@lyse.isobeef.org My theory is that these people simply donāt do ācode archeologyā. When something breaks, they donāt reach for git log. They simply donāt experience the pain that comes with bad commits / commit messages.
Or is that different in your company? š
@movq@www.uninformativ.de Same. :ā-( I just donāt get how people do code archeology with all their shit messages and huge commits changing a gazillion of different things. I always try to lead by setting good examples, but nofuckingbody is picking up on that. At all. Even when bringing this up every now and then.
@itsericwoodward@itsericwoodward.com Nice to see someone else also participating! š„³
(Btw, they donāt want us to share our inputs: https://www.reddit.com/r/adventofcode/wiki/faqs/copyright/inputs/ Yeah, itās a bit annoying. I also have to do quite a bit of filtering on my repo ā¦)
Most of the Advent of Code action happens on the Fediverse, Iām afraid:
https://tilde.zone/@movq/115595022987289988
Thereās just way more people over there who participate. š„“
Working on day 3 of the Advent of Code 2025: https://adventofcode.com/
My solutions repo: https://git.itsericwoodward.com/eric/aoc-2025
@prologic@twtxt.net Using your own language?! Thatās really nice! I hope you get home soon so you can give the code a try. š
I actually canāt progress to day two till I get home 𤣠ā I havenāt pushed the code for the mu compiler yet š¤¦āāļø So no-one can check my work even if they were so kind š¤£
completely untested as i have no remote way of running mu code from Vietnam š¤£
Thinking about doing Advent of Code in my own tiny language mu this year.
mu is:
- Dynamically typed
- Lexically scoped with closures
- Has a Go-like curly-brace syntax
- Built around lists, maps, and first-class functions
Key syntax:
- Functions use
fnand braces:
fn add(a, b) {
return a + b
}
- Variables use
:=for declaration and=for assignment:
x := 10
x = x + 1
- Control flow includes
if/elseandwhile:
if x > 5 {
println("big")
} else {
println("small")
}
while x < 10 {
x = x + 1
}
- Lists and maps:
nums := [1, 2, 3]
nums[1] = 42
ages := {"alice": 30, "bob": 25}
ages["bob"] = ages["bob"] + 1
Supported types:
int
bool
string
list
map
fn
nil
mu feels like a tiny little Go-ish, Python-ish language ā curious to see how far I can get with it for Advent of Code this year. š
Advent of Code 2025 starts tomorrow. š„³š
This year, Iām going to use Python 1 on SuSE Linux 6.4, writing the code on my trusty old Pentium 133 with its 64 MB of RAM. No idea if that old version of Python will be fast enough for later puzzles. Weāll see.
@movq@www.uninformativ.de I see problems with that, yes. Case in point:

since there are quite literally no note taking apps that work for me, iāve began writing my own! to get started real quick i adapted the core part of bbycllās backend and it works so nicely ā which speaks volumes to the quality of the code! should really break it out into a custom framework. iām also realizing how easy it would be to get bbycll v1 readyā¦but this is probably more important since itāll allow me to get my life in order ^^ā
@bender@twtxt.net Once Advent of Code starts, Iāll start spamming, donāt worry. š
All my newly added test cases failed, that movq thankfully provided in https://git.mills.io/yarnsocial/twtxt.dev/pulls/28#issuecomment-20801 for the draft of the twt hash v2 extension. The first error was easy to see in the diff. The hashes were way too long. Youāve already guessed it, I had cut the hash from the twelfth character towards the end instead of taking the first twelve characters: hash[12:] instead of hash[:12].
After fixing this rookie mistake, the tests still all failed. Hmmm. Did I still cut the wrong twelve characters? :-? I even checked the Go reference implementation in the document itself. But it read basically the same as mine. Strange, what the heck is going on here?
Turns out that my vim replacements to transform the Python code into Go code butchered all the URLs. ;-) The order of operations matters. I first replaced the equals with colons for the subtest struct fields and then wanted to transform the RFC 3339 timestamp strings to time.Date(ā¦) calls. So, I replaced the colons in the time with commas and spaces. Hence, my URLs then also all read https, //example.com/twtxt.txt.
But that was it. All test green. \o/
I just noticed this pattern:
uninformativ.de 201.218.xxx.xxx - - [22/Nov/2025:06:53:27 +0100] "GET /projects/lariza/multipass/xiate/padme/gophcatch HTTP/1.1" 301 0 "" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"
www.uninformativ.de 103.10.xxx.xxx - - [22/Nov/2025:06:53:28 +0100] "GET http://uninformativ.de/projects/lariza/multipass/xiate/padme/gophcatch HTTP/1.1" 400 0 "" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"
Let me add some spaces to make it more clear:
uninformativ.de 201.218.xxx.xxx - - [22/Nov/2025:06:53:27 +0100] "GET /projects/lariza/multipass/xiate/padme/gophcatch HTTP/1.1" 301 0 "" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"
www.uninformativ.de 103.10.xxx.xxx - - [22/Nov/2025:06:53:28 +0100] "GET http://uninformativ.de/projects/lariza/multipass/xiate/padme/gophcatch HTTP/1.1" 400 0 "" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"
Some IP (from Brazil) requests some (non-existing, completely broken) URL from my webserver. But they use the hostname uninformativ.de, so they get redirected to www.uninformativ.de.
In the next step, just a second later, some other IP (from Nepal) issues an HTTP proxy request for the same URL.
Clearly, someone has no idea how HTTP redirects work. And clearly, theyāre running their broken code on some kind of botnet all over the world.
I was looking at some ancient code and then thought: Hmm, maybe it would be a good idea to see more details in this error message. Which of the values donāt line up. On the other hand, that feature isnāt probably used anyway, because itās a bit ugly to use (historically evolved). And on top of that, most teams need something slightly different, if they deal with that sort of thing.
I still told my workmates about it, so they could also have a look at it and we can decide tomorrow what to do about it. Speaking of the devil, no kidding, not even half an hour later, a puzzled tester contacted me. She received exactly that rather useless error message. Looks like I had an afflatus. ;-)
Itās interesting, though, that in all those years, nobody stumbled across this before. At least we now know for sure that this is not dead code. :-)
@movq@www.uninformativ.de I think I now remember having similar problems back then. Iām pretty sure I typically consulted the Qt C++ documentation and only very rarely looked at the Python one. It was easy enough to translate the C++ code to Python.
Yeah, the GIL can be problematic at times. Iām glad it wasnāt an issue for my application.
For those curious, the new Twtxt <-> ActivityPub bridge Iām building (bidirectional) simply requires three things:
- You register your Twtxt feed to the bridge: https://bridge.twtxt.net
- You verify that you in fact own/control the feed by putting the verification code somewhere on/in your feed (doesnāt matter where or how)
- You proxy/forward requests for
/.well-known/webfingerto the Bridgebridge.twtxt.net.
Iām still testing through and ironing out bugs š Please be patient! š
technically I can put the Bridge verificaiton code in my feedās metadata so no-one really ever sees or notices it š¤ Maybe Iāll add a first-class button/field thingy in yarnd so users can āregister their feedā straight from their pod? š¤
@lyse@lyse.isobeef.org Yeah, I noticed that too. I havenāt double-checked my code, though. Maybe it has something to do with selecting the correct URL? I mean, these feeds donāt have any # url = fields, so maybe thatās it?
tilde.club feeds have no # nick and is messing with yarnd's behavior š
@bender@twtxt.net Just wrote better code with tests š¤£
My goodness, a new level of stupidity.
The bots are now doing things like this:
GET http://uninformativ.de/projects/lariza/feednotify/datenstrahler/slinp/countty HTTP/1.1
- That URL does not exist.
- By including
http://uninformativ.dein that request, this instructs the webserver to do an HTTP proxy request. Of course, this isnāt allowed on my webserver (and shouldnāt by allowed on any normal webserver), resulting in HTTP 400. And even if it were, the target would be the exact same server, making a proxy request unnecessary.
And of course, itās not just 50 hits like this or 100 or 1ā000 or 10ā000. No, itās over 150ā000 in the last 2 days. All from vastly different IP ranges of different cloud hosters.
This almost looks like a DDoS attack, but itās just completely stupid. This feels more like some idiot vibe coded a crawler.
User-Agent analyzer with my subscription list to spot new feeds automatically.
@lyse@lyse.isobeef.org an advent of code, I love it! Go, Lyse, go!
@prologic@twtxt.net Letās go through it one by one. Hereās a wall of text that took me over 1.5 hours to write.
The criticism of AI as untrustworthy is a problem of misapplication, not capability.This section says AI should not be treated as an authority. This is actually just what I said, except the AI phrased/framed it like it was a counter-argument.
The AI also said that users must develop āAI literacyā, again phrasing/framing it like a counter-argument. Well, that is also just what I said. I said you should treat AI output like a random blog and you should verify the sources, yadda yadda. That is āAI literacyā, isnāt it?
My text went one step further, though: I said that when you take this requirement of āAI literacyā into account, you basically end up with a fancy search engine, with extra overhead that costs time. The AI missed/ignored this in its reply.
Okay, so, the AI also said that you should use AI tools just for drafting and brainstorming. Granted, a very rough draft of something will probably be doable. But then you have to diligently verify every little detail of this draft ā okay, fine, a draft is a draft, itās fine if it contains errors. The thing is, though, that you really must do this verification. And I claim that many people will not do it, because AI outputs look sooooo convincing, they donāt feel like a draft that needs editing.
Can you, as an expert, still use an AI draft as a basis/foundation? Yeah, probably. But hereās the kicker: You did not create that draft. You were not involved in the āthought processā behind it. When you, a human being, make a draft, you often think something like: āOkay, I want to draw a picture of a landscape and thereās going to be a little house, but for now, Iāll just put in a rough sketch of the house and add the details later.ā You are aware of what you left out. When the AI did the draft, you are not aware of whatās missing ā even more so when every AI output already looks like a final product. For me, personally, this makes it much harder and slower to verify such a draft, and I mentioned this in my text.
Skill Erosion vs. Skill EvolutionYou, @prologic@twtxt.net, also mentioned this in your car tyre example.
In my text, I gave two analogies: The gym analogy and the Google Translate analogy. Your car tyre example falls in the same category, but Geminiās calculator example is different (and, again, gaslight-y, see below).
What I meant in my text: A person wants to be a programmer. To me, a programmer is a person who writes code, understands code, maintains code, writes documentation, and so on. In your example, a person who changes a car tyre would be a mechanic. Now, if you use AI to write the code and documentation for you, are you still a programmer? If you have no understanding of said code, are you a programmer? A person who does not know how to change a car tyre, is that still a mechanic?
No, youāre something else. You should not be hired as a programmer or a mechanic.
Yes, that is āskill evolutionā ā which is pretty much my point! But the AI framed it like a counter-argument. It didnāt understand my text.
(But what if thatās our future? What if all programming will look like that in some years? I claim: Itās not possible. If you donāt know how to program, then you donāt know how to read/understand code written by an AI. You are something else, but youāre not a programmer. It might be valid to be something else ā but that wasnāt my point, my point was that youāre not a bloody programmer.)
Geminiās calculator example is garbage, I think. Crunching numbers and doing mathematics (i.e., ācomplex problem-solvingā) are two different things. Just because you now have a calculator, doesnāt mean itāll free you up to do mathematical proofs or whatever.
What would have worked is this: Letās say youāre an accountant and you sum up spendings. Without a calculator, this takes a lot of time and is error prone. But when you have one, you can work faster. But once again, thereās a little gaslight-y detail: A calculator is correct. Yes, it could have ābugsā (hello Intel FDIV), but its design actually properly calculates numbers. AI, on the other hand, does not understand a thing (our current AI, that is), itās just a statistical model. So, this modified example (āaccountant with a calculatorā) would actually have to be phrased like this: Suppose thereās an accountant and you give her a magic box that spits out the correct result in, what, I donāt know, 70-90% of the time. The accountant couldnāt rely on this box now, could she? Sheād either have to double-check everything or accept possibly wrong results. And that is how I feel like when I work with AI tools.
Gemini has no idea that its calculator example doesnāt make sense. It just spits out some generic āargumentā that it picked up on some website.
3. The Technical and Legal Perspective (Scraping and Copyright)The AI makes two points here. The first one, I might actually agree with (ābad bot behavior is not the fault of AI itselfā).
The second point is, once again, gaslighting, because it is phrased/framed like a counter-argument. It implies that I said something which I didnāt. Like the AI, I said that you would have to adjust the copyright law! At the same time, the AI answer didnāt even question whether itās okay to break the current law or not. It just said ālol yeah, change the lawsā. (I wonder in what way the laws would have to be changed in the AIās āopinionā, because some of these changes could kill some business opportunities ā or the laws would have to have special AI clauses that only benefit the AI techbros. But I digress, that wasnāt part of Geminiās answer.)
tl;drExcept for one point, I donāt accept any of Geminiās ācriticismā. It didnāt pick up on lots of details, ignored arguments, and I can just instinctively tell that this thing does not understand anything it wrote (which is correct, itās just a statistical model).
And it framed everything like a counter-argument, while actually repeating what I said. Thatās gaslighting: When Alice says āthe sky is blueā and Bob replies with āwhy do you say the sky is purple?!ā
But it sure looks convincing, doesnāt it?
Never againThis took so much of my time. I wonāt do this again. š
@movq@www.uninformativ.de this I find more worrisome, and saw no mention of it on your text: Right-Wing Chatbots Turbocharge Americaās Political and Cultural Wars (gift article).
Enoch, one of the newer chatbots powered by artificial intelligence, promises āto āmind wipeā the pro-pharma biasā from its answers. Another, Arya, produces content based on instructions that tell it to be an āunapologetic right-wing nationalist Christian A.I. model.ā
@movq@www.uninformativ.de Gemini liked your opinion very much. Here is how it countered:
1. The User Perspective (Untrustworthiness)The criticism of AI as untrustworthy is a problem of misapplication, not capability.
- AI as a Force Multiplier: AI should be treated as a high-speed drafting and brainstorming tool, not an authority. For experts, it offers an immense speed gain, shifting the work from slow manual creation to fast critical editing and verification.
- The Rise of AI Literacy: Users must develop a new skillāAI literacyāto critically evaluate and verify AIās probabilistic output. This skill, along with improving citation features in AI tools, mitigates the āgaslightingā effect.
The fear of skill loss is based on a misunderstanding of how technology changes the nature of work; itās skill evolution, not erosion.
- Shifting Focus to High-Level Skills: Just as the calculator shifted focus from manual math to complex problem-solving, AI shifts the focus from writing boilerplate code to architectural design and prompt engineering. It handles repetitive tasks, freeing humans for creative and complex challenges.
- Accessibility and Empowerment: AI serves as a powerful democratizing tool, offering personalized tutoring and automation to people who lack deep expertise. While dependency is a risk, this accessibility empowers a wider segment of the population previously limited by skill barriers.
The legal and technical flaws are issues of governance and ethical practice, not reasons to reject the core technology.
- Need for Better Bot Governance: Destructive scraping is a failure of ethical web behavior and can be solved with better bot identification, rate limits, and protocols (like enhanced
robots.txt). The solution is to demand digital citizenship from AI companies, not to stop AI development.
donāt mind the glaring light mode i just think the pink looks pretty. this ādesktop modeā is just a bunch of css repurposing the sidebar into the taskbar, but the file manager and its supporting code is proving a very fun endeavour. my favorite part is u can just turn javascript off and it functions like a regular website with nothing suspicious about it at all
@movq@www.uninformativ.de Uh, that actually looks not that terrible. Somehow, I remember Swing GUIs being way uglier.
As for Visual Basic, I only had to use VBA once in my life. That was in the beginning of my career when I inherited a project from a leaving coworker. Fuck me, was that awful. Just alone the damn compiler error dialog box popping up in my face all the time while editing and the compiler already trying to parse the unfinished and hence of course uncompilable code. Boy, that left a lasting impression on me. I ported everything to Java very quickly. Luckily, the code base wasnāt all that large at that point in time. I had to add a bunch of new features after that, so I was very glad that I convinced my workmate/project manager to do that first. We didnāt even need a GUI, the button in Excel was transformed to a command line program that just generated the large file.
But I cannot comment on the VB GUI designer, I never used that. Your screenshot looks very similar to the Delphi one, though. Only towards the end of my Delphi days I found out about the possibility to make the widgets snap to window edges and corners (I donāt remember how that was called), so that resizing the windows was actually possible without messing up their entire contents.
Switching to Linux, Delphi wasnāt an option anymore. For some reason I couldnāt use Kylix. Maybe it was already dead by the time I changed OSes. Or I couldnāt get it to run. I just donāt remember. I just recall that the unavailability of Delphi was the reason it took me a while to actually settle on Linux. I then fully switched to Java. The GridBagLayout was my absolutely favorite Swing layout manager. I reckon I used it 98% of the time, because it was so powerful and made the windows resize properly, just as I had learned to do in Delphi shortly before.
Up until discovering Swing, I used Javaās AWT for a short amount of time. That was very limited I think and I hit the limits fairly quickly. Later at uni, we had one project making use of SWT. Didnāt convince me either. I could be wrong, but I think there was also a SWT GUI designer plugin for Eclipse. If there really was, that one wasnāt in the same street as Delphiās (there must be a reason I forgot about it ;-)).
@movq@www.uninformativ.de The one for Delphi was quite good. But JCreator (I donāt remember exactly) was awful and I never looked back to GUI designers. Always layed out the GUI by hand in code myself since then. These days I donāt deal with GUI programming anymore.
Advent of Code will be different this year:
There will only be 12 puzzles, i.e. only December 1 to December 12. This might make it more interesting for some people, because itās (probably) less work and a lower chance of people getting burned out. š¤
Personally, Iāll probably stretch it out over 24 days. Giving myself more time to solve each puzzle and I really want this event to last the entire month. š
Maybe this makes it more interesting for some people around here as well?
After taking most of the year off from role-playing, Iāve got 3 one-shots coming up in the next month, all of which need some tweaking before I can run them (as do my homebrew rules).
Plus thereās a ābuild a gameā code challenge at work, a pair of media boxes I need to rebuild, a pair of dead machines I need to diagnose, and Iād like to (eventually) get my twtxt apps to a āreleasableā state.
So many projects, so little (free) timeā¦
@movq@www.uninformativ.de The time has come for āvibe codingā consultations.
@movq@www.uninformativ.de @prologic@twtxt.net Unfortunately, I had to review a coworkerās code that was also spewed out the same way. It was abso-fucking-lutely horrible. I didnāt know upfront, but then asked afterwards and got the proud (!) answer that it indeed was āassistedā. I bet this piece of garbage result was never checked or questioned the tiniest bit before submitting for review. >:-( It didnāt even do the right thing as a bonus.
What a giant shitshow. Things just have to burn to the ground several times.
It happened.
āCan you help me debug this program? I vibe coded it and I have no idea whatās going on. I had no choice ā learning this new language and frameworks would have taken ages, and I have severe time constraints.ā
Did I say ānoā? Of course not, Iām a ānice guyā. So Iām at fault as well, because I endorsed this whole thing. The other guy is also guilty, because he didnāt communicate clearly to his boss what can be done and how much time it takes. And the boss and his bosses are guilty a lot, because theyāre all pushing for āAIā.
The end result is garbage software.
This particular project is still relatively small, so it might be okay at the moment. But normalizing this will yield nothing but garbage. And actually, especially if this small project works out fine, this contributes to the shittiness because management will interpret this as āhey, AI worksā, so they will keep asking for it in future projects.
How utterly frustrating. This is not what I want to do every day from now on.
Hello again everyone! A little update on my twtxt client.
I think itās finally shaping a bit better now, but⦠āļø
As Iām trying to put all the parts together, I decided to build multiple parallel UIs, to ensure I donāt accidentally create a structure that is more rigid than planned.
I already decided on a UI that I would want to use for myself, it would be inspired by moshidon, misskey and some other āsocial feedsā mock-ups I found on dribbble.
I also plan on building a raw HTML version (for anyone wanting to do a full DIY client).
I would love to get any suggestions of what you would like to see (and possibly use) as a client, by sharing a link, app/website name or even a sketch made by you on paper.
I think Iāll pick a third and maybe a fourth design to build together with the two already mentioned.
For reference, the screens I think of providing are (some might be optional or conditionally/manually hidable):
- Global / personal timeline screen
- Profile screen (with timeline)
- Thread screen
- Notifications screen or popup (both valid)
- DM list & chat screens (still planning, might come later)
- Settings screen (itāll probably be a hard coded form, but better mention it)
- Publish / edit post screen or popup (still analysing some use cases, as some āenginesā might not have direct publishing support)
I also plan on adding two optional metadata fields:
display_name: To show a human readable alternative for a nick, it fallback tonickif not defined
banner: Using the same format asavatarbut the image expected is wider, inspired by other socials around
I also plan on supporting any metadata provided, including a dynamically parsable regex rule format for those extra fields, this should allow anyone to build new clients that donāt limit themselves to just the social aspect of twtxt, hoping to see unique ways of using twtxt! š¤
@zvava@twtxt.net CORS is our worst enemy. š„·
I too had the same issue being a browser-based request, so the only solution is using a proxy.
For testing (and real personal use) I rely on this one https://corsproxy.io/.
In my client, I first check if the source allows me to fetch it without issues first and fallback to prefixing with a proxy if it gives an error.
For security reasons the client donāt give you a readable error for CORS, so you must use a catch-all for that, if it fails again with the proxy you can deal with any other errors it throws as you normally would (preferably outside of the fetch function).
After the fetching responded, I store the response.url value to fetch it again for updates without having to do extra calls (you can store it verbatim or as a flag to be able to change the proxy later).
Here an extract of my code:
export async function fetchWithProxy(url, proxy=null) {
return await fetch(url).catch(err => {
if (!proxy) throw err;
return fetch(`${proxy}${encodeURIComponent(url)}`);
});
}
// Using it with
const res = await fetchWithProxy('https://twtxt.net/user/zvava/twtxt.txt', 'https://corsproxy.io/?');
// Get the working url (direct or through proxy)
const fetchingURL = res.url;
// Get the twtxt feed content (or handle errors)
const text = await res.text();
I also plan to allow the user to define a custom proxy field, I like the solution used by Delta.chat in their android app, where you can define the URL format with a variable https://my-proxy?$TWTXT_URL since it allows you to define with more freedom any proxy without a prefix format.
If the idea of using a third-party proxy is not to the user liking they can use a self-hosted solution like cors-anywhere or build their own (with twtxt it should just be a GET).
I finally solved the loading issue in my WIP reader, TwtStrm (and apologies again to anyone that got spammed while I was diagnosing the issue).
After another round of coding this weekend, Iām happy to report that it now renders all the twts (with markdown parsing), complete with localstorage and server-based file caching.
Hi everyone, hereās a little introduction of my twtxt client (still WIP).
The client Iām developing is a single tenant project that runs entirely in the browser (it might use an optional backend).
Itās entirely based on native web-components and vanilla JS, it is designed to act closer to a toolkit than a full-fledged client, allowing users to āDIYā their own interface with pure html or plain javascript functions.
Users can also build their own engines by including a global javascript object that implement the defined internal API (TBD).
Iām planning to build a system that is easy enough to build and use with any skill level, using only pure html (with a homebrew minimal template engine) or via plain JS (Iāll be also providing some pre-made templates too).
Everything can be self-hosted on any static hosting provider, this allows to spread twtxt within communities like Neocities and similarly hosted websites (basically any Indieweb/Smallweb/Digital garden website and any of the common GitHub/Lab/Berg/lify Pages).
It will be probably named something like TxtCraft or craf.txt but Iām not really sure yet⦠š¤ (Maybe some suggestions could help)
Iām still in the experimental phase, so thereās no decent source-code to share yet, but it will soon enough!
Pretty happy with my zs-blog-template starter kit for creating and maintaining your own blog using zs š Demo of what the starter kit looks like here ā Basic features include:
- Clean layout & typography
- Chroma code highlighting (aligned to your site palette)
- Accessible copy-code button
- āOn this pageā collapsible TOC
- RSS, sitemap, robots
- Archives, tags, tag cloud
- Draft support (hidden from lists/feeds)
- Open Graph (OG) & Twitter card meta (default image + per-post overrides)
- Ready-to-use 404 page
As well as custom routes (redirects, rewrites, etc) to support canonical URLs or redirecting old URLs as well as new zs external command capability itself that now lets you do things like:
$ zs newpost
to help kick-start the creation of a new post with all the right āstuffā⢠ready to go and then pop open your $EEDITOR š¤