figbert.com-website

[ACTIVE] the website and home of figbert on the clearnet
git clone git://git.figbert.com/figbert.com-website.git
Log | Files | Refs | README | LICENSE

commit 1ea7658763e7eab09bfc79f54da2f8cd7a4dab42
parent bf6042944d941e90f1def64105dbca50b03a75ed
Author: FIGBERT <figbert@figbert.com>
Date:   Wed, 15 Jun 2022 14:46:44 -0700

Update syntax and style of site content

Diffstat:
M.dockerignore | 1-
M.gitignore | 1-
MDockerfile | 1-
Mcontent/posts/_index.md | 1-
Mcontent/posts/a-very-convincing-terraria-review/index.md | 1-
Mcontent/posts/backups-update-internet-celebrity.md | 11+++++------
Mcontent/posts/going-full-static.md | 191++++++++++++++++++++++++++++++++++++++++---------------------------------------
Mcontent/posts/how-to-mirror-your-iphone-to-your-mac.md | 44++++++++++++++++++++++----------------------
Mcontent/posts/how-to-replace-keybase-in-three-easy-steps/index.md | 2--
Mcontent/posts/i-wrote-this-one/index.md | 120++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------
Mcontent/posts/i-wrote-this-three/index.md | 346++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
Mcontent/posts/i-wrote-this-two/index.md | 209+++++++++++++++++++++++++++++++++++++++++++++++++------------------------------
Mcontent/posts/keybase-hidden-address.md | 9++++++---
Mcontent/posts/mac-control-center-is-better/index.md | 16++++++++++------
Mcontent/posts/moving-to-hetzner-from-digitalocean/index.md | 2--
Mcontent/posts/my-first-regex.md | 2--
Mcontent/posts/package-in-the-bush.md | 1-
Mcontent/posts/pebkac-txtodo-rewrite/index.md | 102++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------
Mcontent/posts/remarkable-tablet.md | 1-
Mcontent/posts/sass-style-update.md | 8+++-----
Mcontent/posts/some-quality-shitposting.md | 40++++++++++++++++++++--------------------
Mcontent/posts/wrong-way-to-switch-server-os.md | 11+++++------
Acontent/projects/d3c3nt.md | 26++++++++++++++++++++++++++
Dcontent/projects/d3c3nt/index.md | 30------------------------------
Mcontent/projects/privacy-redirect-for-safari/index.md | 10++++------
Acontent/projects/simply-translate.md | 55+++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dcontent/projects/simply-translate/index.md | 55-------------------------------------------------------
Mcontent/projects/tofu/index.md | 1-
Mcontent/projects/txtodo/index.md | 51++++++++++++++++++++++++---------------------------
Mnginx.conf | 1-
30 files changed, 774 insertions(+), 575 deletions(-)

diff --git a/.dockerignore b/.dockerignore @@ -2,4 +2,3 @@ .gitignore COPYING README.md - diff --git a/.gitignore b/.gitignore @@ -1,4 +1,3 @@ .DS_Store public static/processed_images - diff --git a/Dockerfile b/Dockerfile @@ -10,4 +10,3 @@ FROM nginx:alpine COPY --from=builder /home/site/public /usr/share/nginx/html COPY ./nginx.conf /etc/nginx/nginx.conf - diff --git a/content/posts/_index.md b/content/posts/_index.md @@ -4,4 +4,3 @@ sort_by = "date" insert_anchor_links = "left" generate_feed = true +++ - diff --git a/content/posts/a-very-convincing-terraria-review/index.md b/content/posts/a-very-convincing-terraria-review/index.md @@ -9,4 +9,3 @@ nuts ripped off than play this game for another hour." – Dbama 57.028, played 2046.2 hrs at review time.](terraria.jpg) If I wasn't certain I wanted this game before, I am now. - diff --git a/content/posts/backups-update-internet-celebrity.md b/content/posts/backups-update-internet-celebrity.md @@ -1,18 +1,17 @@ +++ title = "An Update on Bad Backups and Internet Celebrity" -description = "My recent post on the Great Alpine Migration Tragedy of 2021 garnered some serious attention! I got a number of emails, a whole host of feedback on Lobste.rs, and over 100 points on Hacker News! As I understand it, that means I’m now a top internet celebrity (and eligible for the 10 KB Club). Still, I must remain humble even as I catapult toward digital infamy and thus I am here to respond to feedback, answer questions, and talk about what I’ve done to prevent something like this from happening again." date = 2021-06-27 +updated = 2022-06-15 +++ My recent post on the [Great Alpine Migration Tragedy] of 2021 garnered some serious attention! I got a number of emails, a whole host of feedback on [Lobste.rs], and over **100 points** on [Hacker News]! As I understand it, that means I'm now a top internet celebrity (and eligible -for the [10 KB Club]). - -Still, I must remain humble even as I catapult toward digital infamy and -thus I am here to respond to feedback, answer questions, and talk about -what I've done to prevent something like this from happening again. +for the [10 KB Club]). Still, I must remain humble even as I catapult +toward digital infamy and thus I am here to respond to feedback, answer +questions, and talk about what I've done to prevent something like this +from happening again. <!-- more --> diff --git a/content/posts/going-full-static.md b/content/posts/going-full-static.md @@ -1,43 +1,41 @@ +++ title = "Going Full Static with Zola" -description = "" date = 2020-08-22 -updated = 2021-04-12 +updated = 2022-06-14 +++ -Those of you who read [my last "I Wrote This" post][i-wrote-this-three] -will know that I was having some trouble with my website. My site was -coded using [Sapper][sapper], a [Svelte][svelte]-based web-app -framework I had been using for some time. I had chosen to use Sapper -because it allowed me to stay as close to the web-metal as possible, -while still letting me do some fancy things like use components, -scoped CSS, and [server routes][server-routes]. However, after diving +Those of you who read [my last "I Wrote This" post] will know that I was +having some trouble with my website. My site was coded using [Sapper], a +[Svelte]-based web-app framework I had been using for some time. I had +chosen to use Sapper because it allowed me to stay as close to the +web-metal as possible, while still letting me do some fancy things like +use components, scoped CSS, and [server routes]. However, after diving deeper into website tests and statistics, I started noticing that my "static" site had a lot more moving parts than I thought. The HTML was crammed full of inline scripts and `blob://`s, tanking performance, -wreaking havoc on my [CSP][csp], and breaking the site for people with -scripts disabled. I decided to move the site to [Zola][zola], a -ludicrously simple static site generator made in Rust. Feel free to -check out the [source code here][source]. +wreaking havoc on my [CSP], and breaking the site for people with +scripts disabled. I decided to move the site to [Zola], a ludicrously +simple static site generator made in Rust. Feel free to check out the +[source code here]. <!-- more --> ## NPM Hell -I decided I was going to rewrite my site ~~because I have a bad habit -of rewriting everything all the time~~ largely because of Sapper's -underwhelming response to [this Github issue][strict-export], which -proposes a "strict export" for Sapper sites to remove inline scripts -and use of `eval()`. I think this is a great idea, but it -unfortunately has not received much attention (though it appears that -as I'm writing this, it has been added to a "Roadmap Triage" project -board). I started a new branch and began working to translate my site -to Sapper's main competitor, [Routify][routify]. Sapper and Routify -are not the same thing, but for me they both would serve well enough. -After around two days, I had a working MVP of my site in Routify. - -**EDIT:** Sapper is being retired in favor of [SvelteKit][sk], which -has [the same issue][strict-export-sk]. smh. +I decided I was going to rewrite my site ~~because I have a bad habit of +rewriting everything all the time~~ largely because of Sapper's +underwhelming response to [this Github issue], which proposes a "strict +export" for Sapper sites to remove inline scripts and use of `eval()`. I +think this is a great idea, but it unfortunately has not received much +attention (though it appears that as I'm writing this, it has been added +to a "Roadmap Triage" project board). I started a new branch and began +working to translate my site to Sapper's main competitor, [Routify]. +Sapper and Routify are not the same thing, but for me they both would +serve well enough. After around two days, I had a working MVP of my site +in Routify. + +**EDIT:** Sapper is being retired in favor of [SvelteKit], which has +[the same issue]. smh. Then disaster struck: I got a bunch of emails from Github. A series of high priority security vulnerabilities had been found in dependencies @@ -54,94 +52,99 @@ picture. ## The Last Dependency Standing -I decided to use a [static site generator][staticgen]. I'd heard of -many of the big boys in the past, like [Hugo][hugo], [Jekyll][jekyll], -and [Eleventy][11ty], but they all had their own problems when I -looked at them in the past. Hugo has god-awful templating syntax, -Jekyll is Ruby-based and I don't know Ruby, and Eleventy isn't even an -escape from Javascript! So I decided to use [Zola][zola], a "one-stop -static site engine." Zola is made in Rust, so it's super fast, and -it's designed to be dead simple. Seriously: the CLI has only five -commands, everything is configured from one `.toml` file, and your -content is all written in "[Augmented][shortcodes] -[Markdown][internal-links]." +I decided to use a [static site generator]. I'd heard of many of the big +boys in the past, like [Hugo], [Jekyll], and [Eleventy], but they all +had their own problems when I looked at them in the past. Hugo has +god-awful templating syntax, Jekyll is Ruby-based and I don't know Ruby, +and Eleventy isn't even an escape from Javascript! So I decided to use +[Zola], a "one-stop static site engine." Zola is made in Rust, so it's +super fast, and it's designed to be dead simple. Seriously: the CLI has +only five commands, everything is configured from one `.toml` file, and +your content is all written in "[Augmented] [Markdown]." The interesting thing is that there's honestly not much more to the -story because of how easy and simple Zola is to use. All of my posts -and projects go into the `content` directory, my CSS, favicon, and +story because of how easy and simple Zola is to use. All of my posts and +projects go into the `content` directory, my CSS, favicon, and miscellaneous files (non-content related stuff like emojis and public -keys) go in the `static` directory, and templates and shortcodes go -into the `templates` directory. If I was using a theme, it's files -would go into a `theme` directory. +keys) go in the `static` directory, and templates and shortcodes go into +the `templates` directory. If I was using a theme, it's files would go +into a `theme` directory. ### Benefits -* My slow Python script to convert Markdown posts to Svelte (which was +- My slow Python script to convert Markdown posts to Svelte (which was perfect at first but I then packed full excess tests and sandboxing) is gone. Zola handles that automatically. -* I got rid of TailwindCSS, and replaced it with [custom styles][css]. -It's actually pretty fun to write simple custom CSS, especially with -modern tools like variables. -* Writing new posts is ludicrously easy now. I write a post in -Markdown, throw any images or videos used [in the same -directory][colocation], and publish. -* Zola comes with a whole bunch of features built-in that I didn't -have before, like syntax highlighting and anchor links (the latter of -which I have yet to set up). Other things are just handled -automatically, like feed generation or i18n. -* Build times are much faster. Exporting with Sapper wasn't slow, but -it didn't feel instant. Zola does. +- I got rid of TailwindCSS, and replaced it with custom styles. It's +actually pretty fun to write simple custom CSS, especially with modern +tools like variables. +- Writing new posts is ludicrously easy now. I write a post in Markdown, +throw any images or videos used [in the same directory], and publish. +- Zola comes with a whole bunch of features built-in that I didn't have +before, like syntax highlighting and anchor links (the latter of which I +have yet to set up). Other things are just handled automatically, like +feed generation or i18n. +- Build times are much faster. Exporting with Sapper wasn't slow, but it +didn't feel instant. Zola does. ### Drawbacks -* You sacrifice a certain amount of control by using a static site -generator, like [link][issue-681] [properties][issue-695]. You could -solve this with [shortcodes][shortcodes], or by contributing to the -project (which I plan to do). -* I mean that's really it to be honest. +- You sacrifice a certain amount of control by using a static site +generator, like [link] [properties]. You could solve this with +[shortcodes][Augmented], or by contributing to the project (which I plan +to do). +- I mean that's really it to be honest. **EDIT:** You can now add attributes like noreferrer to links -automatically with Zola... So I guess there's no more drawbacks? -Yeah that feels right. +automatically with Zola... So I guess there's no more drawbacks? Yeah +that feels right. ## To Infinity and Beyond I'm really happy with using Zola, and I look forward to continuing to work with it in the future. I want to publish my blog's styles and -templates as a [Zola theme][themes], but I have to iron out a few -kinks (like anchor links, which are still a bit finicky on my end) -before that. I also have yet to re-implement a bunch of the indie-web -features and [GoatCounter][gc] analytics of my old site into this -version. Overall though, I think it's been a really fun and productive -experiment using Zola, and I'd highly recommend using it for anybody -looking for a great, no-nonsense static site generator. +templates as a [Zola theme], but I have to iron out a few kinks (like +anchor links, which are still a bit finicky on my end) before that. + +**EDIT:** I have since moved on from this theme on my own site, but you +can still use the theme as [d3c3nt], a simple, clean, and flexible theme +for personal sites. + +I also have yet to re-implement a bunch of the indie-web features and +[GoatCounter] analytics of my old site into this version. Overall +though, I think it's been a really fun and productive experiment using +Zola, and I'd highly recommend using it for anybody looking for a great, +no-nonsense static site generator. **EDIT:** I fixed anchor links, and I decided to forgo analytics altogether. My site's better off without JS. Until next time, FIGBERT. -[i-wrote-this-three]: @/posts/i-wrote-this-three/index.md#next-steps -[sapper]: https://sapper.svelte.dev/ -[svelte]: https://svelte.dev/ -[server-routes]: https://sapper.svelte.dev/docs#Server_routes -[csp]: https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -[zola]: https://www.getzola.org/ -[source]: https://git.figbert.com/figbert.com/figbert.com -[strict-export]: https://github.com/sveltejs/sapper/issues/1175 -[routify]: https://routify.dev/ -[sk]: https://kit.svelte.dev -[strict-export-sk]: https://github.com/sveltejs/kit/issues/93 -[staticgen]: https://www.staticgen.com/ -[hugo]: https://gohugo.io/ -[jekyll]: https://jekyllrb.com/ -[11ty]: https://www.11ty.dev/ -[shortcodes]: https://www.getzola.org/documentation/content/shortcodes/ -[internal-links]: https://www.getzola.org/documentation/content/linking/ -[css]: /global.css -[colocation]: https://www.getzola.org/documentation/content/overview/#asset-colocation -[issue-681]: https://github.com/getzola/zola/issues/681 -[issue-695]: https://github.com/getzola/zola/issues/695 -[themes]: https://www.getzola.org/themes/ -[gc]: https://www.goatcounter.com/ - +[my last "I Wrote This" post]: @/posts/i-wrote-this-three/index.md#next-steps +[Sapper]: https://sapper.svelte.dev/ +[Svelte]: https://svelte.dev/ +[server routes]: https://sapper.svelte.dev/docs#Server_routes +[CSP]: https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP +[Zola]: https://www.getzola.org/ +[source code here]: https://git.figbert.com/figbert.com-website/ + +[this Github issue]: https://github.com/sveltejs/sapper/issues/1175 +[Routify]: https://routify.dev/ +[SvelteKit]: https://kit.svelte.dev +[the same issue]: https://github.com/sveltejs/kit/issues/93 + +[static site generator]: https://www.staticgen.com/ +[Hugo]: https://gohugo.io/ +[Jekyll]: https://jekyllrb.com/ +[Eleventy]: https://www.11ty.dev/ +[Augmented]: https://www.getzola.org/documentation/content/shortcodes/ +[Markdown]: https://www.getzola.org/documentation/content/linking/ + +[in the same directory]: https://www.getzola.org/documentation/content/overview/#asset-colocation +[link]: https://github.com/getzola/zola/issues/681 +[properties]: https://github.com/getzola/zola/issues/695 + +[Zola theme]: https://www.getzola.org/themes/ +[d3c3nt]: https://d3c3nt.figbert.com +[GoatCounter]: https://www.goatcounter.com/ diff --git a/content/posts/how-to-mirror-your-iphone-to-your-mac.md b/content/posts/how-to-mirror-your-iphone-to-your-mac.md @@ -1,20 +1,21 @@ +++ title = "How to Mirror Your iDevice to your Mac" -description = "I recently found myself debugging a mobile game I'm working on (sneak peak) with a friend over Jitsi. I had no trouble sharing my Godot window, Xcode console, or IRC bouncer. But how were they going to view the output on my phone? Well turns out it's really easy." date = 2020-12-31 +updated = 2022-06-14 +++ I recently found myself debugging a mobile game I'm working on ([sneak -peak][sevivon]) with a friend over [Jitsi][jitsi]. I had no trouble sharing my -[Godot][godot] window, Xcode console, or [IRC bouncer][irc]. But how were they -going to view the output on my phone? +peak]) with a friend over [Jitsi]. I had no trouble sharing my [Godot] +window, Xcode console, or [IRC bouncer]. But how were they going to view +the output on my phone? + <!-- more --> Well turns out it's really easy, and requires no non-default software: 1. Open Quicktime -2. Press <kbd>File</kbd> -> <kbd>New Movie Recording</kbd> or <kbd>⌥</kbd> + -<kbd>⌘</kbd> + <kbd>N</kbd> +2. Press <kbd>File</kbd> -> <kbd>New Movie Recording</kbd> or +<kbd>⌥</kbd> + <kbd>⌘</kbd> + <kbd>N</kbd> 3. Plug in your iDevice (I've only tested with an iPhone) via USB 4. Click the down caret by the red record button 5. Select your device as the Camera @@ -22,19 +23,18 @@ Well turns out it's really easy, and requires no non-default software: That's it! I didn't even need to record anything, as I just used Jitsi's built-in Window Sharing feature to share the screen live. -If you want to record your phone with something more powerful than Quicktime, -you can use [OBS][obs] and select your phone as a Video Capture Device. - -Hope you've enjoyed this post! I know it's a bit shorter than normal, but I'm -hoping to post more frequently starting soon as a bunch of -[interesting][remarkable] [things][cyberpunk] are happening in and abouts my -life. - -[sevivon]: https://git.figbert.com/FIGBERT/sevivon -[jitsi]: https://jitsi.org/ -[godot]: https://godotengine.org/ -[irc]: https://thelounge.chat/ -[obs]: https://obsproject.com/ -[remarkable]: https://remarkable.com/ -[cyberpunk]: https://www.cyberpunk.net/ - +If you want to record your phone with something more powerful than +Quicktime, you can use [OBS] and select your phone as a Video Capture +Device. + +Hope you've enjoyed this post! I know it's a bit shorter than normal, +but I'm hoping to post more frequently starting soon as a bunch of +[interesting] [things] are happening in and abouts my life. + +[sneak peak]: https://git.figbert.com/sevivon/ +[Jitsi]: https://jitsi.org/ +[Godot]: https://godotengine.org/ +[IRC bouncer]: https://thelounge.chat/ +[OBS]: https://obsproject.com/ +[interesting]: https://remarkable.com/ +[things]: https://www.cyberpunk.net/ diff --git a/content/posts/how-to-replace-keybase-in-three-easy-steps/index.md b/content/posts/how-to-replace-keybase-in-three-easy-steps/index.md @@ -1,6 +1,5 @@ +++ title = "How to Replace Keybase in 3 Easy Steps" -description = "Ever since Keybase was acquired by Zoom, a company with a very bad history with security/privacy, people wanted an alternative. There have been a few different alternatives proposed: this is mine." date = 2020-07-03 updated = 2021-04-12 +++ @@ -177,4 +176,3 @@ thoughts as well. [jitsi]: https://jitsi.org/ [jitsi-in-matrix]: https://matrix.org/blog/2020/04/06/running-your-own-secure-communication-service-with-matrix-and-jitsi [jitsi-e2e]: https://jitsi.org/blog/e2ee/ - diff --git a/content/posts/i-wrote-this-one/index.md b/content/posts/i-wrote-this-one/index.md @@ -1,63 +1,96 @@ +++ title = "I Wrote This #1" -description = "So, I'm FIGBERT – I wrote this. I'm a highschooler working in the tech world, currently stuck at home like pretty much everybody else who's not trying to die. I plan on using this blog to write mainly on my experiences in the tech world, either in focused articles centered around one topic or more summary-style roundups like this, the 'I Wrote This' series." date = 2020-06-13 -updated = 2020-08-14 +updated = 2022-06-15 +++ -So, I'm FIGBERT – I wrote this. ~~nailed that intro.~~ I'm a highschooler working in the tech world, currently stuck at home like pretty much everybody else who's not trying to -die. I plan on using this blog to writing mainly on my experiences in the tech world, either in focused articles centered around one topic or more summary-style roundups like -this, the "I Wrote This" series. +So, I'm FIGBERT – I wrote this. ~~nailed that intro.~~ I'm a +highschooler working in the tech world, currently stuck at home like +pretty much everybody else who's not trying to die. I plan on using this +blog to writing mainly on my experiences in the tech world, either in +focused articles centered around one topic or more summary-style +roundups like this, the "I Wrote This" series. <!-- more --> -I've always found statements like that kind of funny in their generalness, and was thinking the other day that if I ever made a game studio I would name it "I Made This Game." -Then, when I was trying to think of what to name this series (The Weekly Fig? Fig Talks?), I thought it would be funny to do something similar. I plan to release these once a -week on Saturdays, if all goes to plan. Without further ado, here's a brief summary of interesting things that happened this week. +I've always found statements like that kind of funny in their +generalness, and was thinking the other day that if I ever made a game +studio I would name it "I Made This Game." Then, when I was trying to +think of what to name this series (The Weekly Fig? Fig Talks?), I +thought it would be funny to do something similar. I plan to release +these once a week on Saturdays, if all goes to plan. Without further +ado, here's a brief summary of interesting things that happened this +week. ## Releasing txtodo v2.0 -Some people reading this may be familiar with my most recent project, [txtodo][txtodo] – you can read a full writeup of the project [here][txtodo-writeup]. The point of txtodo -was to create a todo list application without any feature bloat I found in other competing solutions – *every task deletes at midnight*. This week I launched the MacOS companion -app for txtodo, completing my long-term "cross-platform" goal for the app. I went from not knowing SwiftUI at all to having two published apps that talk to each other! Making -computers talk to each other is, like, the hardest thing you can do with computers! ~~Ok, technically a lot of it is just Apple APIs but still, let me have this.~~ I think there -is probably one more major change I could make to the app (moving the tasks from an `@State` variable to an `@EnvironmentObject`), but after that it's pretty much bugfixes -and... the bank? I don't know. +Some people reading this may be familiar with my most recent project, +[txtodo] – you can read a full writeup of the project [here]. The point +of txtodo was to create a todo list application without any feature +bloat I found in other competing solutions – *every task deletes at +midnight*. This week I launched the MacOS companion app for txtodo, +completing my long-term "cross-platform" goal for the app. I went from +not knowing SwiftUI at all to having two published apps that talk to +each other! Making computers talk to each other is, like, the hardest +thing you can do with computers! ~~Ok, technically a lot of it is just +Apple APIs but still, let me have this.~~ I think there is probably one +more major change I could make to the app (moving the tasks from an +`@State` variable to an `@EnvironmentObject`), but after that it's +pretty much bugfixes and... the bank? I don't know. ## Signing Git Commits -I while back I saw that when I editing my project README.md using the GitHub web app, it got a little green "verified" badge next to the commit message. I looked into it for a -bit today, and found [this GitHub help article][signing-commits]. One GPG install and Protonmail-key-download later, now all my commits have a green badge! Neat! +I while back I saw that when I editing my project README.md using the +GitHub web app, it got a little green "verified" badge next to the +commit message. I looked into it for a bit today, and found [this GitHub +help article]. One GPG install and Protonmail-key-download later, now +all my commits have a green badge! Neat! ## The Meh vimrc -I made the switch from nano to vim a few months ago, but up until a few days ago I was using the barebones default `macvim`. Not anymore! I DuckDuckGo-ed "vim configuration," -and downloaded what is supposedly "The ultimate Vim configuration." from [amix][ultimate-vim]. It's a pretty good configuration out-of-the-box: I'm using the Awesome version -with the fantastic [Jetbrains Mono][jetbrains-mono] font. I'm still not that good at actually using vim to its fullest potential but I'm confident that I'll improve with a -little practice and ascend to elite vim status in no time. +I made the switch from nano to vim a few months ago, but up until a few +days ago I was using the barebones default `macvim`. Not anymore! I +DuckDuckGo-ed "vim configuration," and downloaded what is supposedly +"The ultimate Vim configuration." from [amix]. It's a pretty good +configuration out-of-the-box: I'm using the Awesome version with the +fantastic [Jetbrains Mono] font. I'm still not that good at actually +using vim to its fullest potential but I'm confident that I'll improve +with a little practice and ascend to elite vim status in no time. {{ image(sources=["chad.jpg"], fallback_path="chad.jpg", fallback_alt="The virgin classic developer vs the chad linux dev") }} ## Maybe Rust? -Speaking of elite programmers: Rust! I've been thinking about learning the language for a while, and now that I have no main project (other than maintain my finished apps and -sites), it's as good a time as any to learn a new language. It's idiomatic syntax combined with low-level abilities makes Rust seem a little bit like Python+ to me. It also -helps that it's skyrocketing in popularity – maybe I'll do the cliche Rust developer thing and post about how much I love the language on [the orange site][hn] once I learn it. -~~ok so I was planning on linking a bunch of posts like that here, but when I looked for them on HN I actually couldn't find any, but I distinctly remember reading them so I -stand by this statement.~~ +Speaking of elite programmers: Rust! I've been thinking about learning +the language for a while, and now that I have no main project (other +than maintain my finished apps and sites), it's as good a time as any to +learn a new language. It's idiomatic syntax combined with low-level +abilities makes Rust seem a little bit like Python+ to me. It also helps +that it's skyrocketing in popularity – maybe I'll do the cliche Rust +developer thing and post about how much I love the language on [the +orange site] once I learn it. ~~ok so I was planning on linking a bunch +of posts like that here, but when I looked for them on HN I actually +couldn't find any, but I distinctly remember reading them so I stand by +this statement.~~ ## From Brave to Firefox -I made the switch from [Brave][brave] to [Firefox Developer Edition][firefox] this week, after accumulating around 50 USD in BAT. I started using Brave almost when it came out -and loved it – the chromium feel with a powerful built in adblocker? It sounded too good to be true – and perhaps it was: over time the browsers performace began to slow down, -they [hijacked links][brave-hijack], launched a [weird Zoom competitor][brave-zoom] with no fanfare or announcement, and refuse to get rid of their [required KYC][brave-kyc]. -Anyways, I dropped it. Now my dock is all blue! +I made the switch from [Brave] to [Firefox Developer Edition] this week, +after accumulating around 50 USD in BAT. I started using Brave almost +when it came out and loved it – the chromium feel with a powerful built +in adblocker? It sounded too good to be true – and perhaps it was: over +time the browsers performace began to slow down, they [hijacked links], +launched a [weird Zoom competitor] with no fanfare or announcement, and +refuse to get rid of their [required KYC]. Anyways, I dropped it. Now my +dock is all blue! {{ image(sources=["dock.png"], fallback_path="dock.png", fallback_alt="My dock with all blue apps") }} ## New Music -On a non-tech-related note, a bunch of good new music came out recently. In no particular order, here are some good new songs (largely out of the Middle East): +On a non-tech-related note, a bunch of good new music came out recently. +In no particular order, here are some good new songs (largely out of the +Middle East): * [Coronavirus by Mohamed Ramadan](https://www.youtube.com/watch?v=L3e4UryXDo0) * [Zot Ani – Ela Li Lahv](https://www.youtube.com/watch?v=F2ZLege5wF8) @@ -67,20 +100,25 @@ On a non-tech-related note, a bunch of good new music came out recently. In no p ## Wrapup -So, that's been this week's update. I've got some exciting ideas for my next posts, so I hope you stick around for what's to come. Until then, farewell! +So, that's been this week's update. I've got some exciting ideas for my +next posts, so I hope you stick around for what's to come. Until then, +farewell! -- FIGBERT [txtodo]: https://txtodo.app -[txtodo-writeup]: /projects/txtodo -[signing-commits]: https://help.github.com/en/github/authenticating-to-github/managing-commit-signature-verification -[ultimate-vim]: https://github.com/amix/vimrc -[jetbrains-mono]: https://www.jetbrains.com/lp/mono/ -[hn]: https://news.ycombinator.com/ -[brave]: https://brave.com/ -[firefox]: https://www.mozilla.org/en-US/firefox/developer/ -[brave-hijack]: https://davidgerard.co.uk/blockchain/2020/06/06/the-brave-web-browser-is-hijacking-links-and-inserting-affiliate-codes/ -[brave-zoom]: https://together.brave.com/ -[brave-kyc]: https://www.reddit.com/r/btc/comments/ck56zw/privacy_focused_brave_browser_now_requires_kyc/ +[here]: @/projects/txtodo/index.md +[this GitHub help article]: https://docs.github.com/en/authentication/managing-commit-signature-verification + +[amix]: https://github.com/amix/vimrc +[Jetbrains Mono]: https://www.jetbrains.com/lp/mono/ + +[the orange site]: https://news.ycombinator.com/ + +[Brave]: https://brave.com/ +[Firefox Developer Edition]: https://www.mozilla.org/en-US/firefox/developer/ +[hijacked links]: https://davidgerard.co.uk/blockchain/2020/06/06/the-brave-web-browser-is-hijacking-links-and-inserting-affiliate-codes/ +[weird Zoom competitor]: https://together.brave.com/ +[required KYC]: https://www.reddit.com/r/btc/comments/ck56zw/privacy_focused_brave_browser_now_requires_kyc/ diff --git a/content/posts/i-wrote-this-three/index.md b/content/posts/i-wrote-this-three/index.md @@ -1,115 +1,197 @@ +++ title = "I Wrote This #3" -description = "It appears I'm not that great at keeping a weekly schedule. Right after I published my last post, I started a class on text adventures and have been living and breathing in Inform7 ever since. I've also spent some time working on this site – though I've got even bigger changes coming in the future – learning a few new languages, and listening to a whole lot of music. I think something happened in cybersec too? Oh also I learned how to drive." date = 2020-07-04 -updated = 2021-08-10 +updated = 2022-06-14 +++ -It appears I'm not that great at keeping a weekly schedule. Right after I published my last post, I started a class on text adventures and have been living and breathing in -[Inform7][inform] ever since. I've also spent some time working on this site – though I've got even bigger changes coming in the future – learning a few new -languages, and listening to a whole lot of music. I think [something happened in cybersec][twitter] too? Oh also I learned how to drive. +It appears I'm not that great at keeping a weekly schedule. Right after +I published my last post, I started a class on text adventures and have +been living and breathing in [Inform7] ever since. I've also spent some +time working on this site – though I've got even bigger changes coming +in the future – learning a few new languages, and listening to a whole +lot of music. I think [something happened in cybersec] too? Oh also I +learned how to drive. <!-- more --> ## Interactive Fiction -These past few weeks, my main work has been on interactive fiction as part of a summer class for my school. The first week was spent learning the history of text adventures (as -I will refer to them for the rest of the article, becuase calling them "interactive fiction" makes me sound like ~~a dick~~ a snob). I gathered a collection of games to play in -free time (if I ever have any more of that), from the very first of the genre – Adventure – to modern ones like Lost Pig. +These past few weeks, my main work has been on interactive fiction as +part of a summer class for my school. The first week was spent learning +the history of text adventures (as I will refer to them for the rest of +the article, becuase calling them "interactive fiction" makes me sound +like ~~a dick~~ a snob). I gathered a collection of games to play in my +free time (if I ever have any more of that), from the very first of the +genre – Adventure – to modern ones like Lost Pig. + +![My collection of text adventures: Adventure, Bronze, Counterfeit +Monkey, Curses, Hitchhiker's Guide to the Galaxy, Lost Pig, and +Slouching Towards Bedlam](collection.png) + +In the second week, we all made our own text adventures. It was a really +interesting experience – drastically different than any other +programming I've done. The main thing I struggled with was the semi-NLP +style of [Inform7]. Rather than telling the computer what to do, I felt +like I was making suggestions. I also struggled with the editor a bit. +Inform7 isn't open source, which means there's only one IDE you can use +to program in the language. That would be fine if the IDE was high +quality, but I often found it ~~really bad and draining~~ mediocre. This +was made a little better after I changed the editor colors to be much +more vibrant ~~so I wouldn't fall asleep~~, but I still felt like it +needed some work. Regardless of any struggles along the way, the payoff +after the game was finished was huge. Watching my little sister play a +text adventure for the first time, *one I had made*, was awesome. + +Without further ado, I present to you: *One Angry Wizard, or the +Tentacular Adventures of our Brave Hero through a World Most Strange and +Foreign*. You can download [the .gblorb here]. -{{ image(sources=["collection.png"], fallback_path="collection.png", fallback_alt="My collection of text adventures: Adventure, Bronze, Counterfeit Monkey, Curses, Hitchhiker's Guide to the Galaxy, Lost Pig, and Slouching Towards Bedlam") }} - -In the second week, we all made our own text adventures. It was a really interesting experience – drastically different than any other programming I've done. The main thing I -struggled with was the semi-NLP style of [Inform7][inform]. Rather than telling the computer what to do, I felt like I was making suggestions. I also struggled with the editor a -bit. Inform7 isn't open source, which means there's only one IDE you can use to program in the language. That would be fine if the IDE was high quality, but I often found it -~~really bad and draining~~ mediocre. This was made a little better after I changed the editor colors to be much more vibrant ~~so I wouldn't fall asleep~~, but I still -felt like it needed some work. Regardless of any struggles along the way, the payoff after the game was finished was huge. Watching my little sister play a text adventure for -the first time, *one I had made*, was awesome. - -Without further ado, I present to you: *One Angry Wizard, or the Tentacular Adventures of our Brave Hero through a World Most Strange and Foreign*. You can ~~play it online -here or~~ download the .gblorb [here][angry-wizard]. **EDIT:** I've removed the online version for privacy concerns. I'm going to push a project write-up to the projects -page soon, and plan on updating the game consistently for a while (if you want to send me feedback, send it to my [email address][email]). Enjoy! ## Site Work -I made some changes that you guys can see, and some other ones behind the scenes. +I made some changes that you guys can see, and some other ones behind +the scenes. ### Joining Webrings -I first encountered webrings on [Hacker News][geekring-hn], where I find most of my interesting internet things. From there, I decided to join both the [geekring][geekring] and -the [Hotline Webring][hotline-webring] – you can find links to the webrings in the nav on every page. Joining the Hotline Webring was designed to be supremely easy, but the -geekring was a little more complicated. I've never been a big IRC person (though not for lack of trying), and I ended up joining via the HTML form and getting my key via email -(I may or may not have confused my number with my private-ish key, and had to use a little bit of [bfg][bfg] magic to fix that). - -### Self-Hosting - -My site was previously hosted using a continuous deploy on [Netlify][netlify]. This was a pretty great system for me – all I had to do was commit my code to the GitHub repo, -which I was already doing, and the they would take care of everything and serve a great site – here's the kicker – **for free**. This was working really well for me for a while, -until I decided to add security headers to the site. I tried doing this in two different ways: using [Helmet][helmet] as described [in the Sapper Docs][sapper-csp] and using -Netlify [\_headers][netlify-headers]. The Helmet middleware didn't work with Netlify, and I'm honestly not sure why – possibly because of how they host the file server (I'm not -sure what/how they server the site), or maybe I just f\*cked up somewhere idk JavaScript is hard. Using the Netlify config didn't work either because I'm not a paying -subscriber, which wasn't too clear at first. This would probably be solved if I just gave them money, but I'm not going to do that any time soon. +I first encountered webrings [on Hacker News], where I find most of my +interesting internet things. From there, I decided to join both the +[geekring] and the [Hotline Webring] – you can find links to the +webrings in the nav on every page. Joining the Hotline Webring was +designed to be supremely easy, but the geekring was a little more +complicated. I've never been a big IRC person (though not for lack of +trying), and I ended up joining via the HTML form and getting my key via +email. ~~I may or may not have confused my number with my private-ish +key, and had to use a little bit of [bfg] magic to fix that.~~ -I decided to move to [DigitalOcean][digitalocean] and host the site myself (or I guess not totally myself – I don't feel comfortable running it on a Pi from my house just yet) -with [Caddy][caddy]. I went with DigitalOcean partially because of their dev-focused business model, but mostly because they're cheap (my droplet is USD$5/month and I get $50 -credit with them from the [GitHub Student Developer Pack][student-pack] – my first year of hosting for only $10). +**EDIT:** I would now very much consider myself a big IRC person. -Unfortunately, I didn't quite run the transition too well. It definitely wasn't zero downtime – it was probably more like a-few-hours downtime. I doubt this really affected -anyone because of my small audience, but I was still up late working on it. If it had happened a few days later, it might have gotten mixed up with the [Cloudflare -downtime][cloudflare] (I don't use Cloudflare). +### Self-Hosting -My current setup uses a custom CaddyServer configuration to serve my site, which I am absolutely loving so far: it is so much easier to run advanced setups with Caddy than -Apache or Nginx. I wanted to move away from Javascript analytics (via [GoatCounter][goatcounter]) to log-based analytics (via [GoAccess][goaccess]) but found that Caddy's -structured logs are not supported natively. I'm hoping [they'll add it][goaccess-gh] soon though! Also, I stumbled on [this article][goaccess-script] while writing this, and may -check that out. +My site was previously hosted using a continuous deploy on [Netlify]. +This was a pretty great system for me – all I had to do was commit my +code to the GitHub repo, which I was already doing, and the they would +take care of everything and serve a great site – here's the kicker – +**for free**. This was working really well for me for a while, until I +decided to add security headers to the site. I tried doing this in two +different ways: using [Helmet] as described [in the Sapper Docs] and +using Netlify [\_headers]. The Helmet middleware didn't work with +Netlify, and I'm honestly not sure why – possibly because of how they +host the file server (I'm not sure what/how they serve the site), or +maybe I just f\*cked up somewhere idk JavaScript is hard. Using the +Netlify config didn't work either because I'm not a paying subscriber, +which wasn't too clear at first. This would probably be solved if I just +gave them money, but I'm not going to do that any time soon. + +I decided to move to [DigitalOcean] and host the site myself (or I guess +not totally myself – I don't feel comfortable running it on a Pi from my +house just yet) with [Caddy]. I went with DigitalOcean partially because +of their dev-focused business model, but mostly because they're cheap +(my droplet is USD$5/month and I get $50 credit with them from the +[GitHub Student Developer Pack] – my first year of hosting for only +$10). + +Unfortunately, I didn't quite run the transition too well. It definitely +wasn't zero downtime – it was probably more like a-few-hours downtime. I +doubt this really affected anyone because of my small audience, but I +was still up late working on it. If it had happened a few days later, it +might have gotten mixed up with the [Cloudflare downtime] (I don't use +Cloudflare). + +My current setup uses a custom CaddyServer configuration to serve my +site, which I am absolutely loving so far: it is so much easier to run +advanced setups with Caddy than Apache or Nginx. I wanted to move away +from Javascript analytics (via [GoatCounter]) to log-based analytics +(via [GoAccess]) but found that Caddy's structured logs are not +supported natively. I'm hoping [they'll add it] soon though! Also, I +stumbled on [this article] while writing this, and may check that out. ### Next Steps -I've got two major todos for my site in the near future. The first thing I want to do is Dockerize. Using Docker will significantly clean up my current setup, and allow me to -host more fun things on the same machine (for example, [my own analytics][plausible] and maybe [git][gitea]). With that said, I probably should get a little better at Docker -first... For beginners, [Flavio Copes'][flavio-docker] has a few pretty great posts on the subject. - -The second thing I want to do is a bit of a larger project, and one I'm not yet sure how I'm going to solve it. I've run into some problems with the frameworks I use to develop -[figbert.com][figbert]. Sapper generates inline scripts and blobs, which tanks the security of my CSP. [Their proposed solution][sapper-csp] is to inject nonces with JS -middleware, but this doesn't work with CaddyServer. I would much rather Sapper [avoid inline scripts][sapper-gh] altogether, but this doesn't seem likely. I really like the -freedom that writing static sites in Svelte provides me versus other static site generators, but this could be a dealbreaker. I might talk a look at [Routify][routify] and see -if that's any better. I've also been reconsidering using TailwindCSS, however useful it is, after reading [these][etcd] [three][library-overuse][^1] [articles][tailwind]. I -attempted to replicate the current look of [figbert.com][figbert] without TailwindCSS, and failed. So I'm probably going to rewrite the site again, though I'm not sure how. -Through iteration, we will arrive at a stable version – this one, unfortunately, is not yet it. If I do leave Svelte, which is probably a 50/50 chance at this point, I would -probably go either back to [Hugo][hugo] (with some variation of the incredible [archie][archie] theme) or to [Zola][zola]. +I've got two major todos for my site in the near future. The first thing +I want to do is Dockerize. Using Docker will significantly clean up my +current setup, and allow me to host more fun things on the same machine +(for example, [my own analytics] and maybe [git]). With that said, I +probably should get a little better at Docker first... For beginners, +[Flavio Copes'] has a few pretty great posts on the subject. + +The second thing I want to do is a bit of a larger project, and one I'm +not yet sure how I'm going to solve. I've run into some problems with +the frameworks I use to develop [figbert.com]. Sapper generates inline +scripts and blobs, which tanks the security of my CSP. [Their proposed +solution][in the Sapper Docs] is to inject nonces with JS middleware, +but this doesn't work with CaddyServer. I would much rather Sapper +[avoid inline scripts] altogether, but this doesn't seem likely. I +really like the freedom that writing static sites in Svelte provides me +versus other static site generators, but this could be a dealbreaker. I +might talk a look at [Routify] and see if that's any better. I've also +been reconsidering using TailwindCSS, however useful it is, after +reading [these] three[^1] [articles]. I attempted to replicate the +current look of [figbert.com] without TailwindCSS, and failed. So I'm +probably going to rewrite the site again, though I'm not sure how. +Through iteration, we will arrive at a stable version – this one, +unfortunately, is not yet it. If I do leave Svelte, which is probably a +50/50 chance at this point, I would probably go either back to [Hugo] +(with some variation of the incredible [archie] theme) or to [Zola]. ## Real World Updates ### CyberSec -So, some pretty crazy things have happened. For one, [Twitter got hacked][twitter] by some people from [OGUsers][ogusers] who got access to some internal managment tools. This -hack, though not necessarily the most technical hack, was super high profile. There were a few [really good articles][more-money] written about the hack, but I also noticed a -few people acting in ways that I thought were not appropriate. More specifically, [Biran Krebs][krebson], who reacted to the hack be [repeatedly][dox-one] [doxxing][dox-two] the -hackers, many of whom are still teenagers. He's received relatively little [criticism][dox-callout] for doing this, though it appears to be [a pattern of behavior][dox-past]. - -There was also a brief mention of a new [macOS malware][mac-malware], but judging by the lack of further publicity it's probably not that common in the wild. That, or people -don't care because it's spread mainly through torrenting sites and they don't want to protect people they perceived to be morally below them – which is wrong, obviously. +So, some pretty crazy things have happened. For one, [Twitter got +hacked][something happened in cybersec] by some people from OGUsers who +got access to some internal managment tools. This hack, though not +necessarily the most technical, was super high profile. There were a few +[really good articles] written about the hack, but I also noticed a few +people acting in ways that I thought were not appropriate. More +specifically, [Brian Krebs], who reacted to the hack by [repeatedly] +[doxxing] the hackers, many of whom are still teenagers. He's received +relatively little [criticism] for doing this, though it appears to be [a +pattern of behavior]. + +There was also a brief mention of a new [macOS malware], but judging by +the lack of further publicity it's probably not that common in the wild. +That, or people don't care because it's spread mainly through torrenting +sites and they don't want to protect people they perceived to be morally +beneath them – which is wrong, obviously. ### Driving -I learned how to drive! Or rather, I got kind-of licensed to drive a car in the US. I've been driving around a lot lately as something fun I can do to pass time in quarantine, -and last week I finished my online driver's ed course and got my learner's permit. It was a surprisingly simple and COVID-friendly process! The most complicated/least -COVID-friendly part was going to the DMV to take the written test, but I wore a mask and gloves and glared at anybody who got remotely close to me. The next steps are much more -dangerous to do during a pandemic, but we have a year to complete them so we're going to delay them (some in-person driver's training and the driver's test) for a bit. For now +I learned how to drive! Or rather, I got kind-of licensed to drive a car +in the US. I've been driving around a lot lately as something fun I can +do to pass time in quarantine, and last week I finished my online +driver's ed course and got my learner's permit. It was a surprisingly +simple and COVID-friendly process! The most complicated/least +COVID-friendly part was going to the DMV to take the written test, but I +wore a mask and gloves and glared at anybody who got remotely close to +me. The next steps are much more dangerous to do during a pandemic, but +we have a year to complete them so we're going to delay them (some +in-person driver's training and the driver's test) for a bit. For now though, I have a piece of paper that says I can learn to drive! ### Better Platforms -I've also taken some time to focus on decentralization. I've had a [Mastodon account][mastodon] for a while, but I rarely used it. I didn't have a mobile client, and I almost -never use social media on my computers. To help change my behaviour I downloaded [Mast][mast], a paid Mastodon client for the Apple ecosystem. I went with Mast mostly because -it's absolutely *gorgeous* – and [open source][mast-src] – which is something I value in the apps I use. Apps that look really nice are fantastic inspiration for my own apps' -designs, and this one is no exception. - -I've also started using three other apps much more heavily recently: [Feedly][feedly], [Octal][octal], and [Element][element]. Feedly is a fantastic RSS reader, which helps me -keep track of all the interesting blogs that I find online (I read somewhere about self-hosting an RSS reader, which sounds pretty cool, but I forget what it was called). Octal -is a HN client for iOS, which is really handy for keeping up with my favorite tech news when I'm away from my computer. Element (previously Riot), is the first-party -[Matrix][matrix] client that makes using a decentralized E2EE chat service feel better than Discord. I love it. In an ideal world where I could choose the tools I use to -communicate with people, I would only use Signal and Element/Matrix (for replacing iMessage and Discord/Slack, respectively). +I've also taken some time to focus on decentralization. I've had a +[Mastodon account] for a while, but I rarely used it. I didn't have a +mobile client, and I almost never use social media on my computers. To +help change my behaviour I downloaded [Mast], a paid Mastodon client for +the Apple ecosystem. I went with Mast mostly because it's absolutely +*gorgeous* – and [open source] – which is something I value in the apps +I use. Apps that look really nice are fantastic inspiration for my own +apps' designs, and this one is no exception. + +I've also started using three other apps much more heavily recently: +[Feedly], [Octal], and [Element]. Feedly is a fantastic RSS reader, +which helps me keep track of all the interesting blogs that I find +online (I read somewhere about self-hosting an RSS reader, which sounds +pretty cool, but I forget what it was called). Octal is a HN client for +iOS, which is really handy for keeping up with my favorite tech news +when I'm away from my computer. Element (previously Riot), is the +first-party [Matrix] client that makes using a decentralized E2EE chat +service feel better than Discord. I love it. In an ideal world where I +could choose the tools I use to communicate with people, I would only +use Signal and Element/Matrix (for replacing iMessage and Discord/Slack, +respectively). ### Music @@ -132,61 +214,75 @@ Oh my god there's so much new music. ## Wrapup -I hope you enjoyed reading this update! I know it's much longer than usual, and I'll try and keep them shorter than this from now on. I plan on uploaded more short, -topic-focused articles rather than just updates, but those will come soon. For now though, I need to focus on knocking out some of the larger projects that I'm working on. I -keep finding cool and interesting things to do, and I need to work on finishing the ones that I've already started! +I hope you enjoyed reading this update! I know it's much longer than +usual, and I'll try and keep them shorter than this from now on. I plan +on writing more short, topic-focused articles rather than just updates, +but those will come soon. For now though, I need to focus on knocking +out some of the larger projects that I'm working on. I keep finding cool +and interesting things to do, and I need to work on finishing the ones +that I've already started! Salamat, FIGBERT --- -[^1]: The site appears to be down, and I neglected to archive it. Such is the nature of the internet. +[^1]: This previously linked to +`https://edvinleander.com/2020/07/15/stop-the-overuse-copy-pasting-and-unecessary-libraries/`, +but the site has been down for years now and I neglected to archive it. Such is the nature of the internet. + +[Inform7]: http://inform7.com/ +[something happened in cybersec]: https://techcrunch.com/2020/07/15/twitter-accounts-hacked-crypto-scam/ -[inform]: http://inform7.com/ -[angry-wizard]: /content/One%20Angry%20Wizard%2C%20or%20the%20Tentac.gblorb -[email]: mailto:figbert+textadventures@figbert.com +[the .gblorb here]: /files/one-angry-wizard.gblorb + +[on Hacker News]: https://news.ycombinator.com/item?id=23549471 [geekring]: https://geekring.net/ -[geekring-hn]: https://news.ycombinator.com/item?id=23549471 -[hotline-webring]: https://hotlinewebring.club/ +[Hotline Webring]: https://hotlinewebring.club/ [bfg]: https://rtyley.github.io/bfg-repo-cleaner/ -[netlify]: https://www.netlify.com/ -[helmet]: https://helmetjs.github.io/ -[sapper-csp]: https://sapper.svelte.dev/docs#Security -[netlify-headers]: https://docs.netlify.com/routing/headers/ -[digitalocean]: https://www.digitalocean.com/ -[caddy]: https://caddyserver.com/ -[student-pack]: https://education.github.com/pack/ -[cloudflare]: https://techcrunch.com/2020/07/17/cloudflare-dns-goes-down-taking-a-large-piece-of-the-internet-with-it/ -[goatcounter]: https://www.goatcounter.com/ -[goaccess]: https://goaccess.io/ -[goaccess-gh]: https://github.com/allinurl/goaccess/issues/1768#issuecomment-646674023 -[goaccess-script]: https://alexmv12.xyz/blog/goaccess_caddy/ -[plausible]: https://docs.plausible.io/self-hosting/ -[gitea]: https://docs.gitea.io/en-us/install-with-docker/ -[figbert]: https://figbert.com/ -[flavio-docker]: https://flaviocopes.com/tags/docker/ -[sapper-gh]: https://github.com/sveltejs/sapper/issues/1175 -[routify]: https://routify.dev/ -[etcd]: https://www.roguelazer.com/2020/07/etcd-or-why-modern-software-makes-me-sad/ -[library-overuse]: https://edvinleander.com/2020/07/15/stop-the-overuse-copy-pasting-and-unecessary-libraries/ -[tailwind]: https://johanronsse.be/2020/07/08/why-youll-probably-regret-using-tailwind/ -[hugo]: https://gohugo.io/ + +[Netlify]: https://www.netlify.com/ +[Helmet]: https://helmetjs.github.io/ +[in the Sapper Docs]: https://sapper.svelte.dev/docs#Security +[\_headers]: https://docs.netlify.com/routing/headers/ + +[DigitalOcean]: https://www.digitalocean.com/ +[Caddy]: https://caddyserver.com/ +[GitHub Student Developer Pack]: https://education.github.com/pack/ + +[Cloudflare downtime]: https://techcrunch.com/2020/07/17/cloudflare-dns-goes-down-taking-a-large-piece-of-the-internet-with-it/ + +[GoatCounter]: https://www.goatcounter.com/ +[GoAccess]: https://goaccess.io/ +[they'll add it]: https://github.com/allinurl/goaccess/issues/1768#issuecomment-646674023 +[this article]: https://alexmv12.xyz/blog/goaccess_caddy/ + +[my own analytics]: https://docs.plausible.io/self-hosting/ +[git]: https://docs.gitea.io/en-us/install-with-docker/ +[Flavio Copes']: https://flaviocopes.com/tags/docker/ + +[figbert.com]: https://figbert.com/ +[avoid inline scripts]: https://github.com/sveltejs/sapper/issues/1175 +[Routify]: https://routify.dev/ +[these]: https://www.roguelazer.com/2020/07/etcd-or-why-modern-software-makes-me-sad/ +[articles]: https://johanronsse.be/2020/07/08/why-youll-probably-regret-using-tailwind/ +[Hugo]: https://gohugo.io/ [archie]: https://github.com/athul/archie -[zola]: https://www.getzola.org/ -[twitter]: https://techcrunch.com/2020/07/15/twitter-accounts-hacked-crypto-scam/ -[ogusers]: https://ogusers.com/ -[more-money]: https://fortenf.org/e/security/2020/07/15/twitter-hack.html -[krebson]: https://krebsonsecurity.com/ -[dox-one]: https://krebsonsecurity.com/2020/07/twitter-hacking-for-profit-and-the-lols/ -[dox-two]: https://krebsonsecurity.com/2020/07/whos-behind-wednesdays-epic-twitter-hack/ -[dox-callout]: https://news.ycombinator.com/item?id=23865035 -[dox-past]: https://itwire.com/security/infosec-researchers-slam-ex-wapo-man-krebs-over-doxxing.html -[mac-malware]: https://www.wired.com/story/new-mac-ransomware-thiefquest-evilquest/ -[mastodon]: https://fosstodon.org/@figbert -[mast]: https://apps.apple.com/us/app/mast/id1437429129 -[mast-src]: https://github.com/tiagomartinho/Mast2 -[feedly]: https://feedly.com/ -[octal]: https://apps.apple.com/us/app/octal/id1308885491 -[element]: https://element.io/ -[matrix]: https://matrix.org/ +[Zola]: https://www.getzola.org/ + +[really good articles]: https://fortenf.org/e/security/2020/07/15/twitter-hack.html +[Brian Krebs]: https://krebsonsecurity.com/ +[repeatedly]: https://krebsonsecurity.com/2020/07/twitter-hacking-for-profit-and-the-lols/ +[doxxing]: https://krebsonsecurity.com/2020/07/whos-behind-wednesdays-epic-twitter-hack/ +[criticism]: https://news.ycombinator.com/item?id=23865035 +[a pattern of behavior]: https://itwire.com/security/infosec-researchers-slam-ex-wapo-man-krebs-over-doxxing.html + +[macOS malware]: https://www.wired.com/story/new-mac-ransomware-thiefquest-evilquest/ + +[Mastodon account]: https://fosstodon.org/@figbert +[Mast]: https://apps.apple.com/us/app/mast/id1437429129 +[open source]: https://github.com/tiagomartinho/Mast2 +[Feedly]: https://feedly.com/ +[Octal]: https://apps.apple.com/us/app/octal/id1308885491 +[Element]: https://element.io/ +[Matrix]: https://matrix.org/ diff --git a/content/posts/i-wrote-this-two/index.md b/content/posts/i-wrote-this-two/index.md @@ -1,87 +1,133 @@ +++ title = "I Wrote This #2" -description = "Hi! So, I just started this series and I already missed a week. Oh well. This week was a crazy week for Apple and their operating systems, as they announced iOS 14 and macOS 11 Big Sur at this year's WWDC. I've also started working on a new game project, another little side project, and finding a good alternative to Keybase now that it's owned by Zoom." date = 2020-06-27 -updated = 2020-08-14 +updated = 2022-06-15 +++ -Hi! So, I just started this series and I already missed a week. Oh well. This week was a crazy week for Apple and their operating systems, as they announced iOS 14 and macOS 11 -Big Sur at this year's [WWDC][7]. I've also started working on a new game project, another little side project, and finding a good alternative to [Keybase][31] now that it's -[owned by Zoom][20]. +Hi! So, I just started this series and I already missed a week. Oh well. +This week was a crazy week for Apple and their operating systems, as +they announced iOS 14 and macOS 11 Big Sur at this year's [WWDC]. I've +also started working on a new game project, another little side project, +and finding a good alternative to [Keybase] now that it's [owned by +Zoom]. <!-- more --> ## Jailbreaking my iPhone -When I was a kid – or at least, a younger child than I am now – I had a friend who jailbroke his phone. I thought it was super cool, and wanted to do the same. At around the -same time I was watching [TechSource][1], I got deep into those [Top 10 Amazing Jailbreak Tweaks][2] compilations. However, I wasn't allowed to jailbreak my phone because my -parents said it wasn't allowed, and that was the end of that. - -Until last week, when I decided to jailbreak my iPhone 7 running iOS 13.5.1 using the [checkra1n][3] hardware exploit. To do this, I couldn't use my [USB-C to Lightning -cable][4] due to [a known issue][5] and instead swapped to a USB-A to Lightning cable with a USB-A to USB-C adapter. After jailbreaking the phone, I began to install a host of -tweaks. One of the most interesting things I learned about the jailbreaking community is that charging upfront for apps is quite common for premium and well-known tweaks, which -stands in high contrast to the iOS App Store's ubiquitous freemium payment model (a free download followed by a monthly subscription) especially in the light of the -[Apple-Hey.com controversy][6] of recent weeks. - -All in all, I spent around USD$21 on tweaks, which is infinitely more than I have spent on the App Store – so maybe charging upfront does work. Huh. +When I was a kid – or at least, a younger child than I am now – I had a +friend who jailbroke his phone. I thought it was super cool, and wanted +to do the same. At around the same time I was watching [TechSource], I +got deep into those [Top 10 Amazing Jailbreak Tweaks] compilations. +However, I wasn't allowed to jailbreak my phone because my parents said +it wasn't allowed, and that was the end of that. + +Until last week, when I decided to jailbreak my iPhone 7 running iOS +13.5.1 using the [checkra1n] hardware exploit. To do this, I couldn't +use my [USB-C to Lightning cable] due to [a known issue] and instead +swapped to a USB-A to Lightning cable with a USB-A to USB-C adapter. +After jailbreaking the phone, I began to install a host of tweaks. One +of the most interesting things I learned about the jailbreaking +community is that charging upfront for apps is quite common for premium +and well-known tweaks, which stands in high contrast to the iOS App +Store's ubiquitous freemium payment model (a free download followed by a +monthly subscription) especially in the light of the [Apple-Hey.com +controversy] of recent weeks. + +All in all, I spent around USD$21 on tweaks, which is infinitely more +than I have spent on the App Store – so maybe charging upfront does +work. Huh. {{ gif(sources=["jailbreak.webm", "jailbreak.mp4"]) }} ## Updating my iDevices to Developer Betas -Soon after completing the jailbreak, [WWDC][7] happened and new developer betas were released. Never one to miss jumping on a hype train, I updated both of my main devices to -the [new software][8]. These new betas come with a whole host of bugs, as is to be expected, which I plan to write about in a blog post coming soon. So far, however, I'm liking -these updates – the PiP on iOS is *incredible*, and the new design on macOS is growing on me. +Soon after completing the jailbreak, [WWDC] happened and new developer +betas were released. Never one to miss jumping on a hype train, I +updated both of my main devices to the [new software]. These new betas +come with a whole host of bugs, as is to be expected, which I plan to +write about in a blog post coming soon. So far, however, I'm liking +these updates – the PiP on iOS is *incredible*, and the new design on +macOS is growing on me. Some interesting resources: -* [An interview of Craig Federighi by MKBHD][9] -* [These][12] [three][13] [issues][14] on GitLab for iTerm2 users -* [These][15] [two][16] posts for Firefox -* [This Github issue][17] for Homebrew users. ~~so basically everybody.~~ +* [An interview of Craig Federighi by MKBHD] +* [These] [three] [issues] on GitLab for iTerm2 users +* [These][t2] [two] posts for Firefox +* [This Github issue] for Homebrew users. ~~so basically everybody.~~ -Interestingly, I was having a bunch of issues with brew (`curl` was broken?) after updating to Big Sur but now it seems to be working flawlessly. Very nice. +Interestingly, I was having a bunch of issues with brew (`curl` was +broken?) after updating to Big Sur but now it seems to be working +flawlessly. Very nice. ## Making a Doughnut in Blender -For my next medium-large project, I'm going to need to make some 3D art and models. One problem: I don't know how to do that, or rather, I didn't. Thanks internet! I powered -through the incredible [Blender Beginner Tutorial Series][18] by the [Blender Guru][19]. Here's my final animation: +For my next medium-large project, I'm going to need to make some 3D art +and models. One problem: I don't know how to do that, or rather, I +didn't. Thanks internet! I powered through the incredible [Blender +Beginner Tutorial Series] by the [Blender Guru]. Here's my final +animation: {{ gif(sources=["doughnut.webm", "doughnut.mp4"]) }} ## Replacing Keybase -Now that [Keybase is compromised][20], I thought it would be good to seek out an alternative. Initially, I thought that [keys.pub](https://keys.pub) would be perfect – I thought -it was a slightly-tweaked fork. However, this does not appear to be the case. Instead, it seems kinda like garbo – it doesn't have the budget Keybase had, and as a result, is -majorly lacking in features. However, I've replaced it completely, and am happier with this setup than I ever was with Keybase. My new setup uses [Matrix][21] and -[Riot][22] for messaging, [Jitsi][23] for video chat, [Syncthing][24] for file storage, and an [Indieweb][25] h-card for identity verification. I plan on writing more about this -at a later date, but I'm really pleased with the results so far. +Now that [Keybase is compromised][owned by Zoom], I thought it would be +good to seek out an alternative. Initially, I thought that [keys.pub] +would be perfect – I thought it was a slightly-tweaked fork. However, +this does not appear to be the case. Instead, it seems kinda like garbo +– it doesn't have the budget Keybase had, and as a result, is majorly +lacking in features. However, I've replaced Keybase completely, and am +happier with this setup than I ever was with Keybase. My new setup uses +[Matrix] and [Riot] for messaging, [Jitsi] for video chat, [Syncthing] +for file storage, and an [Indieweb] h-card for identity verification. I +plan on writing more about this at a later date, but I'm really pleased +with the results so far. ## Future Projects -I've got a few interesting projects in the pipeline at the moment, not counting the few articles that I've already promised to write: *Glitches in macOS Big Sur and How to Fix -Them* and *How to Replace Keybase in 4 Easy Steps*. My next major project is a dreidel game/simulator for mobile devices – I plan to code it with [Godot][26], make the models -with [Blender][27], and do any music/sound stuff in [FLStudio][28]. Naturally, I'll keep you all updated on any progress there. - -I'm also working on a much smaller project that should take around a day or two to complete. The working title is "howmanyisraels.com" – essentially, it's a website that takes -the size of the State of Israel, and compares it to the size of a given location and tells you how many times Israel could fit inside it. All I need to do is find a suitable -mapping API (preferably not by Google) that will tell me the size of different locations and I can whip it into a static site! - -I'm also planning on revamping the txtodo macOS app with Mac Catalyst, which I feel I haven't properly explored. I've also discovered a bug in the app that causes issues when -tasks are modified by CloudKit instead of the user, so I'm going to have to work on that as well. Shouldn't be hard! +I've got a few interesting projects in the pipeline at the moment, not +counting the few articles that I've already promised to write: *Glitches +in macOS Big Sur and How to Fix Them* and *How to Replace Keybase in 4 +Easy Steps*. My next major project is a dreidel game/simulator for +mobile devices – I plan to code it with [Godot], make the models with +[Blender], and do any music/sound stuff in [FLStudio]. Naturally, I'll +keep you all updated on any progress there. + +I'm also working on a much smaller project that should take around a day +or two to complete. The working title is "howmanyisraels.com" – +essentially, it's a website that takes the size of the State of Israel, +and compares it to the size of a given location and tells you how many +times Israel could fit inside it. All I need to do is find a suitable +mapping API (preferably not by Google) that will tell me the size of +different locations and I can whip it into a static site! + +I'm also planning on revamping the txtodo macOS app with Mac Catalyst, +which I feel I haven't properly explored. I've also discovered a bug in +the app that causes issues when tasks are modified by CloudKit instead +of the user, so I'm going to have to work on that as well. Shouldn't be +hard! {{ image(sources=["rick-and-morty.jpg"], fallback_path="rick-and-morty.jpg", fallback_alt="Let's go. In and out. Twenty-minute adventure.") }} ## Interesting Blog Tidbits -I'm not sure what tense to write my headers in – I currently write them in [present continuous][30] tense but I am considering writing them like I do Git commits. Huh. I'm also -committing to writing more non-update blog posts (i.e. the two I mentioned above), but we'll see how that goes. Writing is hard, and you shouldn't make false promises. -I'm also working on implementing webmentions to the site, which is a little difficult with a static site but I'm going to give it a try. Lastly, I really need to learn how to -use vim but it's so goddamn hard. I'm writing this blog post with it but I'm definitely not using it to its full potential at all. +I'm not sure what tense to write my headers in – I currently write them +in [present continuous] tense but I am considering writing them like I +do Git commits. Huh. I'm also committing to writing more non-update blog +posts (i.e. the two I mentioned above), but we'll see how that goes. +Writing is hard, and you shouldn't make false promises. I'm also working +on implementing webmentions to the site, which is a little difficult +with a static site but I'm going to give it a try. Lastly, I really need +to learn how to use vim but it's so goddamn hard. I'm writing this blog +post with it but I'm definitely not using it to its full potential at +all. ## New Music -Wow, these have been a great two weeks for the Israeli music scene. In no particular order, here are some good new songs (basically in the order they appear on the trending -tab): +Wow, these have been a great two weeks for the Israeli music scene. In +no particular order, here are some good new songs (basically in the +order they appear on the trending tab): * [Habib Albi – Static and Ben El](https://www.youtube.com/watch?v=lYfrKmEYpdA) * [Rak Banot – Itay Levi and Stephane Legar](https://www.youtube.com/watch?v=0WU9CXeJ5Mk) @@ -95,39 +141,44 @@ I know music isn't tech, but I like it and now it's a recurring section. ## Wrapup -So, that's been this week's update. I'm really enjoying writing updates on this blog, and I hope you stick around. Until then, farewell! +So, that's been this week's update. I'm really enjoying writing updates +on this blog, and I hope you stick around. Until then, farewell! -- FIGBERT -[1]: https://www.youtube.com/TechSource -[2]: https://www.youtube.com/results?search_query=top+ten+jailbreak+tweaks -[3]: https://checkra.in -[4]: https://www.apple.com/shop/product/MKQ42AM/A/usb-c-to-lightning-cable-2-m?fnode=144dec38cb2f057991fcf0394f49d96332a50edd5d077c1b8e763a73d98c66fa0acc4bf5a9fbc5197db4c82a35b2b5a386b340793d8bdb9286ed0f407079076a9f0804555d1ce0ab56920358efc07fc4a9f9e70db82827d6233fce0a081119a6dcb8f5f4a016056eacaf37dde0917b3d -[5]: https://github.com/checkra1n/BugTracker/issues/1#issue-519574712 -[6]: https://hey.com/apple -[7]: https://developer.apple.com/wwdc20 -[8]: https://developer.apple.com/download -[9]: https://www.youtube.com/watch?v=Q2aaCDNjWEg -[10]: https://stackoverflow.com/questions/62555495/macos-terminal-fails-to-login -[11]: https://developer.apple.com/forums/thread/649941 -[12]: https://gitlab.com/gnachman/iterm2/-/issues/8964 -[13]: https://gitlab.com/gnachman/iterm2/-/issues/8975 -[14]: https://gitlab.com/gnachman/iterm2/-/issues/8969 -[15]: https://www.reddit.com/r/firefox/comments/hg6cy8/gifs_and_video_on_reddit_wont_play_on_macos_big -[16]: https://bugzilla.mozilla.org/show_bug.cgi?id=1647816 -[17]: https://github.com/Homebrew/brew/issues/7803 -[18]: https://www.youtube.com/playlist?list=PLjEaoINr3zgEq0u2MzVgAaHEBt--xLB6U -[19]: https://www.youtube.com/channel/UCOKHwx1VCdgnxwbjyb9Iu1g -[20]: https://keybase.io/blog/keybase-joins-zoom -[21]: https://matrix.org -[22]: https://about.riot.im -[23]: https://jitsi.org -[24]: https://syncthing.net -[25]: https://indieweb.org -[26]: https://godotengine.org -[27]: https://www.blender.org -[28]: https://www.image-line.com/flstudio -[30]: https://en.wikipedia.org/wiki/Present_continuous -[31]: https://keybase.io/ - +[WWDC]: https://web.archive.org/web/20201105203007/https://developer.apple.com/wwdc20/ +[Keybase]: https://keybase.io/ +[owned by Zoom]: https://keybase.io/blog/keybase-joins-zoom + +[TechSource]: https://www.youtube.com/TechSource +[Top 10 Amazing Jailbreak Tweaks]: https://www.youtube.com/results?search_query=top+ten+jailbreak+tweaks +[checkra1n]: https://checkra.in +[USB-C to Lightning cable]: https://www.apple.com/shop/product/MM0A3AM/A/usb-c-to-lightning-cable-1-m +[a known issue]: https://github.com/checkra1n/BugTracker/issues/1#issue-519574712 +[Apple-Hey.com controversy]: https://hey.com/apple + +[new software]: https://developer.apple.com/download +[An interview of Craig Federighi by MKBHD]: https://www.youtube.com/watch?v=Q2aaCDNjWEg +[These]: https://gitlab.com/gnachman/iterm2/-/issues/8964 +[three]: https://gitlab.com/gnachman/iterm2/-/issues/8975 +[issues]: https://gitlab.com/gnachman/iterm2/-/issues/8969 +[t2]: https://www.reddit.com/r/firefox/comments/hg6cy8/gifs_and_video_on_reddit_wont_play_on_macos_big +[two]: https://bugzilla.mozilla.org/show_bug.cgi?id=1647816 +[This Github issue]: https://github.com/Homebrew/brew/issues/7803 + +[Blender Beginner Tutorial Series]: https://www.youtube.com/playlist?list=PLjEaoINr3zgEq0u2MzVgAaHEBt--xLB6U +[Blender Guru]: https://www.youtube.com/channel/UCOKHwx1VCdgnxwbjyb9Iu1g + +[keys.pub]: https://keys.pub +[Matrix]: https://matrix.org +[Riot]: https://about.riot.im +[Jitsi]: https://jitsi.org +[Syncthing]: https://syncthing.net +[Indieweb]: https://indieweb.org + +[Godot]: https://godotengine.org +[Blender]: https://www.blender.org +[FLStudio]: https://www.image-line.com/flstudio + +[present continuous]: https://en.wikipedia.org/wiki/Present_continuous diff --git a/content/posts/keybase-hidden-address.md b/content/posts/keybase-hidden-address.md @@ -1,11 +1,14 @@ +++ title = "Keybase Has an Onion Address" -description = "Little known fact about Keybase: it has two onion addresses." date = 2020-07-03 +updated = 2022-06-15 +++ -Little known fact about [Keybase](https://keybase.io/): it has two onion addresses. The short [fncuwbiisyh6ak3i.onion](http://fncuwbiisyh6ak3i.onion/), and the longer -[keybase5wmilwokqirssclfnsqrjdsi7jdir5wy7y7iu3tanwmtp6oid.onion](http://keybase5wmilwokqirssclfnsqrjdsi7jdir5wy7y7iu3tanwmtp6oid.onion). Huh. +Little known fact about [Keybase]: it has two onion addresses. <!-- more --> +The short `fncuwbiisyh6ak3i.onion` and the longer +`keybase5wmilwokqirssclfnsqrjdsi7jdir5wy7y7iu3tanwmtp6oid.onion`. Huh. + +[Keybase]: https://keybase.io/ diff --git a/content/posts/mac-control-center-is-better/index.md b/content/posts/mac-control-center-is-better/index.md @@ -1,16 +1,20 @@ +++ title = "MacOS Control Center is Better" -description = "Regardless of your opinion on the iOS-ifying in macOS Big Sur, the new Control Center has at least one leg up on that of iOS." date = 2020-10-07 +++ -I've been using the macOS Big Sur Beta for a couple of months now. So far it's pretty fantastic, and a surprisingly smooth experience over all. One brand new feature in this -update is the introduction of the Control Center. A close relation of its iOS counterpart, they differ in one key way: Control Center on macOS actually turns off services. +I've been using the macOS Big Sur Beta for a couple of months now. So +far it's pretty fantastic, and a surprisingly smooth experience over +all. One brand new feature in this update is the introduction of the +Control Center. A close relation of its iOS counterpart, they differ in +one key way: Control Center on macOS actually turns off services. <!-- more --> {{ gif(sources=["cc.webm", "cc.mp4"]) }} -Did you catch that? It's pretty subtle. When you try and turn off Bluetooth or Wifi on iOS, they aren't actually turned off: they're just temporarily disabled. The interface -still broadcasts, it just doesn't accept new connections. It's one of my biggest pet peeves, and I'm glad Apple got it right with macOS. Now if they could just port it to iOS... - +Did you catch that? It's pretty subtle. When you try and turn off +Bluetooth or Wifi on iOS, they aren't actually turned off: they're just +temporarily disabled. The interface still broadcasts, it just doesn't +accept new connections. It's one of my biggest pet peeves, and I'm glad +Apple got it right with macOS. Now if they could just port it to iOS... diff --git a/content/posts/moving-to-hetzner-from-digitalocean/index.md b/content/posts/moving-to-hetzner-from-digitalocean/index.md @@ -1,6 +1,5 @@ +++ title = "Moving To Hetzner Cloud from DigitalOcean" -description = "Since I began working on self-hosting, I've been using a DigitalOcean VPS running Debian 10. However, after investigating the alternatives in the space, I'll be moving to Hetzner Cloud when my DigitalOcean credits run out in six months. Here's why." date = 2020-11-01 +++ @@ -79,4 +78,3 @@ Until then, this is FIGBERT signing off. I should make a more consistent outro. [k3s]: https://k3s.io/ [umami]: https://umami.is/ [plausible]: https://plausible.io/ - diff --git a/content/posts/my-first-regex.md b/content/posts/my-first-regex.md @@ -1,6 +1,5 @@ +++ title = "My First RegEx" -description = "Yesterday, I wrote my first regular expression. I’ve always regarded regex as an arcane art of true shell wizards – and for the most part, I still do. Now though, I’ve gotten a glimpse of their world." date = 2021-01-21 +++ @@ -52,4 +51,3 @@ direction. [pr]: https://github.com/calleerlandsson/Tofu/pull/60 [sl]: https://drewdevault.com/2020/12/12/Shell-literacy.html [tc]: https://github.com/ThinkChaos - diff --git a/content/posts/package-in-the-bush.md b/content/posts/package-in-the-bush.md @@ -1,6 +1,5 @@ +++ title = "A Package in the Bush" -description = "After using my Macbook Pro for a time, I noticed that my charger had slightly yellowed at the ends. Though I’m unsure how, it seemed like my charger had sustained some sort of heat damage. I went over to Wirecutter to pick one out, ordered it off Amazon, and... it never came." date = 2021-03-19 +++ diff --git a/content/posts/pebkac-txtodo-rewrite/index.md b/content/posts/pebkac-txtodo-rewrite/index.md @@ -1,21 +1,26 @@ +++ title = "Problem Exists Between Keyboard and Chair: How I Spent 2 Days Chasing a Bug that Didn't Exist" -description = "Post-WWDC2020, I decided to rewrite the backend of txtodo in SwiftUI using the new App and Scene structure. Rebuilding the app from scratch may have not been the best choice, but during that process I have massively simplified the app's data structure, despaghettified some messy UI code, and spent two full days trying to solve a problem that didn't exist. This is the story of that last bit." date = 2020-07-28 -updated = 2020-08-16 +updated = 2022-06-14 +++ -Post-[WWDC2020][wwdc], I decided to rewrite the backend of txtodo in SwiftUI using the new [App and Scene structure][app-and-scene]. Rebuilding the app from scratch may have not -been the best choice, but during that process I have massively simplified the app's data structure, despaghettified some messy UI code, and spent two full days trying to solve a -problem that didn't exist. This is the story of that last bit. +Post-[WWDC2020], I decided to rewrite the backend of txtodo in SwiftUI +using the new [App and Scene structure]. Rebuilding the app from scratch +may have not been the best choice, but during that process I have +massively simplified the app's data structure, despaghettified some messy +UI code, and spent two full days trying to solve a problem that didn't +exist. This is the story of that last bit. <!-- more --> ## Structural Changes -The new app, so far, was mostly the same as the old version but without the `AppDelegate.swift` or `SceneDelegate.swift` files (using the new XCode 12 multiplatform app -template). I also combined the Core Data `FloatingTask` and `DailyTask` entities into one `Task` entity. By this point, everything was running well enough so I started to -migrate more code into the new codebase starting with the fetch request: +The new app, so far, was mostly the same as the old version but without +the `AppDelegate.swift` or `SceneDelegate.swift` files (using the new +XCode 12 multiplatform app template). I also combined the Core Data +`FloatingTask` and `DailyTask` entities into one `Task` entity. By this +point, everything was running well enough so I started to migrate more +code into the new codebase starting with the fetch request: ```swift @FetchRequest( @@ -30,18 +35,27 @@ migrate more code into the new codebase starting with the fetch request: ## Breaking TaskView -Tasks are displayed as `TaskView`s in a `ForEach` loop on the homescreen, which is simple enough. The `TaskView` struct, however, is relatively complicated. The purpose of -`TaskView` is to represent and manipulate a single `Task`. In the previous version of the app (I'm going to call the original version 2.0 and the rewrite 3.0 from now on), this -involved passing a number of attributes individually to be manipulated as the view's `@State`. When migrating the view, I reduced this to a single `@ObservedObject`. I also -removed some of the text styling, which I planned to port over after I got the UI functional. +Tasks are displayed as `TaskView`s in a `ForEach` loop on the +homescreen, which is simple enough. The `TaskView` struct, however, is +relatively complicated. The purpose of `TaskView` is to represent and +manipulate a single `Task`. In the previous version of the app (I'm +going to call the original version 2.0 and the rewrite 3.0 from now on), +this involved passing a number of attributes individually to be +manipulated as the view's `@State`. When migrating the view, I reduced +this to a single `@ObservedObject`. I also removed some of the text +styling, which I planned to port over after I got the UI functional. I ran the app on my device, and this happened: {{ video(sources=["ascending-checkmarks-error.webm", "ascending-checkmarks-error.mp4"]) }} -Well that was unexpected. Instead of checking off the tasks I selected, tasks were checked off starting from the bottom and ascending – obviously not the intended behavior! My -first thought was that it was caused by the use of `@ObservedObject` to declare the view's task property – I haven't seen it used to manipulate a Core Data entity before, but -it's worked fine so far in txtodo – so I rewrote the variables to match version 2.0. +Well that was unexpected. Instead of checking off the tasks I selected, +tasks were checked off starting from the bottom and ascending – +obviously not the intended behavior! My first thought was that it was +caused by the use of `@ObservedObject` to declare the view's task +property – I haven't seen it used to manipulate a Core Data entity +before, but it's worked fine so far in txtodo – so I rewrote the +variables to match version 2.0. ```swift // VERSION 3.0 @@ -69,13 +83,17 @@ struct floatingTaskView: View { } ``` -Still no change. It was getting pretty late at this point, but I decided to stick it out for just a bit longer. I rewrote the `TaskView` struct from scratch *two more times* to -no avail. Something was wrong, but I had no idea where it was and there was no way I was going to figure it out at two in the morning by coding it again the exact same way. +Still no change. It was getting pretty late at this point, but I decided +to stick it out for just a bit longer. I rewrote the `TaskView` struct +from scratch *two more times* to no avail. Something was wrong, but I +had no idea where it was and there was no way I was going to figure it +out at two in the morning by coding it again the exact same way. ## Fantastic Bugs and Where to Find Them -The next morning, I took a look at the code again. If the problem wasn't in `TaskView`, where was it? The only other thing in the UI was the button to make a new task, which -looked something like this: +The next morning, I took a look at the code again. If the problem wasn't +in `TaskView`, where was it? The only other thing in the UI was the +button to make a new task, which looked something like this: ```swift Button(action: { @@ -96,8 +114,11 @@ Button(action: { } ``` -Some of you may have figured it out by this point. At the time, I was still confused – this was the exact method I was using in my previous app, but with preset values – how -could it be broken? I modified the generation slightly so I could tell the difference between tasks, and hopefully get to the bottom of the issue: +Some of you may have figured it out by this point. At the time, I was +still confused – this was the exact method I was using in my previous +app, but with preset values – how could it be broken? I modified the +generation slightly so I could tell the difference between tasks, and +hopefully get to the bottom of the issue: ```swift let newTask = Task(context: self.managedObjectContext) @@ -115,26 +136,37 @@ I ran the app again and saw this: ## Intentional Behavior -The tasks weren't being marked off in ascending order. They were being moved to the bottom automatically when marked as complete, which I couldn't see because a) all the tasks -were identical and b) there were no animations to indicate that was happening. They were sorted by the `FetchRequest` with a `NSSortDescriptor`, to make sure that the unfinished -tasks are the first thing the user sees. The "glitch" I had spent two days chasing down was entirely by design, and I had just forgotten. - -There were two main things I learned from this experience. First, it's incredibly important to be able to take breaks. The difference between spending two days trying to fix a -non-existent glitch and realizing it's a feature you implemented could be as simple as a nap – it was for me. Secondly, your test and placeholder data is more significant than -you might think: [garbage in, garbage out][GIGO] definitely applies here. If all your test data is the same, your tests are not good tests. +The tasks weren't being marked off in ascending order. They were being +moved to the bottom automatically when marked as complete, which I +couldn't see because a) all the tasks were identical and b) there were +no animations to indicate that was happening. They were sorted by the +`FetchRequest` with a `NSSortDescriptor`, to make sure that the +unfinished tasks are the first thing the user sees. The "glitch" I had +spent two days chasing down was entirely by design, and I had just +forgotten. + +There were two main things I learned from this experience. First, it's +incredibly important to be able to take breaks. The difference between +spending two days trying to fix a non-existent glitch and realizing it's +a feature you implemented could be as simple as a nap – it was for me. +Secondly, your test and placeholder data is more significant than you +might think: [garbage in, garbage out] definitely applies here. If all +your test data is the same, your tests are not good tests. ## Wrap-up -To make the sorting more clear, I randomized the tasks' priority, name, and category (as seen above) and added an animation with `.animation(.easeIn(duration: 0.25))`. The -current prototype looks something like this: +To make the sorting more clear, I randomized the tasks' priority, name, +and category (as seen above) and added an animation with +`.animation(.easeIn(duration: 0.25))`. The current prototype looks +something like this: {{ video(sources=["update-preview.webm", "update-preview.mp4"]) }} -This has been a really fun blog post to write! A got a big laugh out of this bug chase, and I hope you've enjoyed reading it. +This has been a really fun blog post to write! A got a big laugh out of +this bug chase, and I hope you've enjoyed reading it. Till next time, FIGBERT -[wwdc]: https://developer.apple.com/wwdc20/ -[app-and-scene]: https://developer.apple.com/videos/play/wwdc2020/10037/ -[GIGO]: https://en.wikipedia.org/wiki/Garbage_in%2C_garbage_out - +[WWDC2020]: https://web.archive.org/web/20201105203007/https://developer.apple.com/wwdc20/ +[App and Scene structure]: https://developer.apple.com/videos/play/wwdc2020/10037/ +[garbage in, garbage out]: https://en.wikipedia.org/wiki/Garbage_in%2C_garbage_out diff --git a/content/posts/remarkable-tablet.md b/content/posts/remarkable-tablet.md @@ -1,6 +1,5 @@ +++ title = "Quite the reMarkable Device" -description = "Lately, there’s been renewed interest in clean, simple technology built to help us focus. Protocols like Gemini strip away the chaos of the web. Hardware hackers fit screens in mirrors and build beautiful minimalist displays to read the news, display data neatly in a picture frame, or provide a daily summary. Hidden amongst these many awesome projects is the reMarkable 2." date = 2021-01-22 updated = 2021-08-10 +++ diff --git a/content/posts/sass-style-update.md b/content/posts/sass-style-update.md @@ -1,17 +1,16 @@ +++ title = "SASS and Light Mode" -description = "I'm on a roll! A second blog post in less than a month! Crazy. Anyway, as you may have noticed – depending on whether or not you read this via RSS or on the main site – I changed the site styles. I got rid of dark mode, added styles for code and keyboard blocks, and changed the look of links to a new cool design." date = 2021-01-02 -updated = 2021-01-22 +updated = 2022-06-15 +++ I'm on a roll! A second blog post in less than a month! Crazy. Anyway, as you may have noticed – depending on whether or not you read this via RSS or on the main site – I changed the site styles. I got rid of dark mode, added styles for code and keyboard blocks, and changed -the look of links to a new cool design. +the look of links to a new cool design. **Update:** I brought back dark +mode. Light mode gave me anxiety. -**Update:** I brought back dark mode. Light mode gave me anxiety. <!-- more --> It all started the other day when I was cruising through cyberspace @@ -60,4 +59,3 @@ other, but it's an interesting divide. [sass]: https://sass-lang.com/ [sass-syntax]: https://sass-lang.com/documentation/syntax [post]: @/posts/how-to-mirror-your-iphone-to-your-mac.md - diff --git a/content/posts/some-quality-shitposting.md b/content/posts/some-quality-shitposting.md @@ -1,34 +1,34 @@ +++ title = "Some quality shitposting" -description = "" date = 2021-02-10 +updated = 2022-06-15 +++ I was doing my daily HN and Lobster trawling, when I stumbled on [a -post][shitpost] by [boringcactus][boringcactus] which sounded somewhat -familiar. About half way through I realized it was a truly epic -shitpost and genuinely burst out laughing. +post] by [boringcactus] which sounded somewhat familiar. About half way +through I realized it was a truly epic shitpost and genuinely burst out +laughing. + <!-- more --> -The story beings on February 2, 2021, on Drew Devault's blog, with a -post entitled [*I'm tired of this anti-Wayland horseshit*][wayland]. -It's a good read – Drew's a smart guy (he makes [Sourcehut][srcht]). -In it, he disparages detractors of Wayland and says that much of the -people who criticize it haven't given it a close enough look and -should think about what they're saying before they go shitting on -maintainers of an all-together pretty dope project. +The story begins on February 2, 2021, on Drew Devault's blog, with a +post entitled [*I'm tired of this anti-Wayland horseshit*]. It's a good +read – Drew's a smart guy (he makes [Sourcehut]). In it, he disparages +detractors of Wayland and says that much of the people who criticize it +haven't given it a close enough look and should think about what they're +saying before they go shitting on maintainers of an all-together pretty +dope project. Seven days later he wrote [*Rust: "Move fast and break things" as a -moral imperative*][rust], in which he criticizes the Rust -Foundation's attitude toward stability and platform support. A fatal -mistake. In one fell swoop, and one `s/Wayland/Rust`, boringcactus -ended this man's career. Check it out: +moral imperative*][rust], in which he criticizes the Rust Foundation's +attitude toward stability and platform support. A fatal mistake. In one +fell swoop, and one `s/Wayland/Rust`, boringcactus ended this man's +career. Check it out: -[*I'm tired of this anti-Rust horseshit*][shitpost] +[*I'm tired of this anti-Rust horseshit*][a post] -[shitpost]: https://www.boringcactus.com/2021/02/09/anti-rust-horseshit.html +[a post]: https://web.archive.org/web/20210224202137/https://www.boringcactus.com/2021/02/09/anti-rust-horseshit.html [boringcactus]: https://www.boringcactus.com/ -[wayland]: https://drewdevault.com/2021/02/02/Anti-Wayland-horseshit.html -[srcht]: https://sourcehut.org/ +[*I'm tired of this anti-Wayland horseshit*]: https://drewdevault.com/2021/02/02/Anti-Wayland-horseshit.html +[Sourcehut]: https://sourcehut.org/ [rust]: https://drewdevault.com/2021/02/09/Rust-move-fast-and-break-things.html - diff --git a/content/posts/wrong-way-to-switch-server-os.md b/content/posts/wrong-way-to-switch-server-os.md @@ -1,17 +1,16 @@ +++ title = "The Wrong Way to Switch Operating Systems on Your Server" -description = "After moving my server to Hetzner, I built up a large collection of self-hosted services I use on a daily basis: from fun things like an RSS reader and an IRC bouncer, to critical services like my email. I ran them all with docker-compose from a Debian VPS. For the last couple months, however, I’ve been meaning to move away from Debian and towards something more minimal and clean. Over this last weekend, I decided to move to Alpine Linux." date = 2021-06-17 +updated = 2022-06-15 +++ After [moving my server to Hetzner][mv], I built up a large collection of self-hosted services I use on a daily basis: from fun things like an [RSS reader] and an [IRC bouncer], to critical services like my -[email]. I ran them all with `docker-compose` from a [Debian] VPS. - -For the last couple months, however, I've been meaning to move away -from Debian and towards something more minimal and clean. Over this -last weekend, I decided to move to [Alpine Linux]. +[email]. I ran them all with `docker-compose` from a [Debian] VPS. For +the last couple months, however, I've been meaning to move away from +Debian and towards something more minimal and clean. Over this last +weekend, I decided to move to [Alpine Linux]. <!-- more --> diff --git a/content/projects/d3c3nt.md b/content/projects/d3c3nt.md @@ -0,0 +1,26 @@ ++++ +title = "d3c3nt" +date = 2022-02-19 +updated = 2022-06-15 +weight = 2 ++++ + +[**d3c3nt**] is a simple, clean, and flexible theme for [Zola]. The +theme evolved from use on my site, made with vanilla CSS and HTML – and +completely sans Javascript. All in all, it's fairly... decent. + +<!-- more --> + +d3c3nt styles common HTML elements like headers, paragraphs, and lists; +plus semantic elements like blockquotes, tables, abbreviations, [and +more]. It also provides [custom shortcodes] to incorporate modern web +elements in your markdown. + +To see the theme in action, poke around [the demo instance][**d3c3nt**] +– and explore the source code [on my forge]. + +[**d3c3nt**]: https://d3c3nt.figbert.com +[Zola]: https://www.getzola.org +[and more]: https://d3c3nt.figbert.com/posts/markdown-syntax/ +[custom shortcodes]: https://d3c3nt.figbert.com/posts/rich-content/ +[on my forge]: https://git.figbert.com/d3c3nt/ diff --git a/content/projects/d3c3nt/index.md b/content/projects/d3c3nt/index.md @@ -1,30 +0,0 @@ -+++ -title = "d3c3nt" -description = "d3c3nt is a simple, clean, and flexible theme for Zola. The theme evolved from use on my site, made with vanilla CSS and HTML – and completely sans Javascript. All in all, it’s fairly… decent." -date = 2022-02-19 -weight = 2 -+++ - -[**d3c3nt**] is a simple, clean, and flexible theme for [Zola]. The -theme evolved from use on my site, made with vanilla CSS and HTML – and -completely sans Javascript. All in all, it's fairly... decent. - -<!-- more --> - -d3c3nt styles common HTML elements like headers, paragraphs, and lists; -plus semantic elements like blockquotes, tables, abbreviations, [and -more]. It also provides [custom shortcodes] to incorporate modern web -elements in your markdown. - -To see the theme in action, poke around this site and [the demo -instance][**d3c3nt**] – and explore the source code [on Gitea]. - -Shout out to [hegz] for being the first person to adopt my theme in -the wild! - -[**d3c3nt**]: https://d3c3nt.figbert.com -[Zola]: https://www.getzola.org -[and more]: https://d3c3nt.figbert.com/posts/markdown-syntax/ -[custom shortcodes]: https://d3c3nt.figbert.com/posts/rich-content/ -[on Gitea]: https://git.figbert.com/figbert/d3c3nt -[hegz]: https://hegz.me diff --git a/content/projects/privacy-redirect-for-safari/index.md b/content/projects/privacy-redirect-for-safari/index.md @@ -1,8 +1,7 @@ +++ title = "Privacy Redirect for Safari" -description = "Privacy Redirect for Safari is a web extension that automatically redirects Twitter, Reddit, YouTube, Instagram, Google Translate, Google Maps, Google Search, and Medium to alternative front-ends like Nitter and Teddit. These front-ends provide users with ways to access the content of popular sites, without exploiting your private information. Until now, extensions that could do this were limited to users of Chrome and Firefox. Privacy Redirect for Safari expands this functionality to Safari." date = 2021-08-14 -updated = 2022-03-04 +updated = 2022-06-14 weight = 0 +++ @@ -11,10 +10,9 @@ redirects Twitter, Reddit, YouTube, Instagram, Google Translate, Google Maps, Google Search, and Medium to alternative front-ends like [Nitter] and [Teddit]. These front-ends provide users with ways to access the content of popular sites, without exploiting your private information. - -Until now, extensions that could do this were limited to users of Chrome -and Firefox. Privacy Redirect for Safari expands this functionality to -Safari. +Until now, extensions that could redirect to these front-ends were +limited to users of Chrome and Firefox. Privacy Redirect for Safari +expands this functionality to Apple's native browser. <!-- more --> diff --git a/content/projects/simply-translate.md b/content/projects/simply-translate.md @@ -0,0 +1,55 @@ ++++ +title = "SimplyTranslate" +date = 2021-07-02 +updated = 2022-06-15 +weight = 4 ++++ + +[**SimplyTranslate**][st] is a collection of "translation scrapers with +interfaces for gemini and the web," made by [metalune]. In other words, +it's a privacy-respecting front end for Google Translate, similar to +Twitter's [Nitter]. Over the course of a couple days – and one +synchronous hacking session – I containerized the program to make it +easier to deploy on servers worldwide. + +<!-- more --> + +When I first found the program, I immediately wanted to add it to my +collection of self-hosted front ends. I had only one problem: I run my +services with Docker, and SimplyTranslate had no Dockerfile. I tried +slapping something together quickly, but curling from the container only +threw an error: + +``` +curl: (52) Empty reply from server +``` + +I hopped onto the `#simple-web` IRC channel on [Libera.Chat] and started +chatting with the devs. A couple days of back-and-forth later, we sat +down to debug together. After scouring the internet, we determined that +the application was binding to the wrong interface: `127.0.0.1`, which +is only accessible from the local machine, instead of `0.0.0.0`, which +is public. + +I cooked up a pair of working Dockerfiles – the first running the app +directly and the second through [uvicorn]. Metalune made a [repo for the +Dockerfiles][repo], and I sent in a [patch via email][patch]. It was +[committed] within the hour. + +This contribution was particularly interesting! We collaborated over IRC +and across timezones, and I ended up returning to git's roots by +submitting the patch via `git send-email`. Compared to the GitHub +workflow, this feels very natural! + +You can use SimplyTranslate over on metalune's [hosted instance], and +browse the source code [on sourcehut][st]. + +[st]: https://sr.ht/~metalune/SimplyTranslate/sources +[metalune]: gemini://metalune.xyz +[Nitter]: https://github.com/zedeus/nitter +[Libera.Chat]: https://libera.chat +[uvicorn]: https://www.uvicorn.org +[repo]: https://git.sr.ht/~metalune/simplytranslate_docker/ +[patch]: https://lists.sr.ht/~metalune/simplytranslate-devel/patches/23516 +[committed]: https://git.sr.ht/~metalune/simplytranslate_docker/commit/4fc34e3503def3a8436dab4f84a1731070a715ba +[hosted instance]: https://simplytranslate.org diff --git a/content/projects/simply-translate/index.md b/content/projects/simply-translate/index.md @@ -1,55 +0,0 @@ -+++ -title = "SimplyTranslate" -description = "SimplyTranslate is a collection of “translation scrapers with interfaces for gemini and the web,” made by metalune. In other words, it’s a privacy-respecting front end for Google Translate, similar to Twitter’s Nitter. Over the course of a couple days – and one synchronous hacking session – I containerized the program to make it easier to deploy on servers worldwide." -date = 2021-07-02 -weight = 4 -+++ - -[**SimplyTranslate**][st] is a collection of "translation scrapers with -interfaces for gemini and the web," made by [metalune]. In other words, -it's a privacy-respecting front end for Google Translate, similar to -Twitter's [Nitter]. Over the course of a couple days – and one -synchronous hacking session – I containerized the program to make it -easier to deploy on servers worldwide. - -<!-- more --> - -When I first found the program, I immediately wanted to add it to my -collection of self-hosted front ends. I had only one problem: I run my -services with Docker, and SimplyTranslate had no Dockerfile. I tried -slapping something together quickly, but curling from the container only -threw an error: - -``` -curl: (52) Empty reply from server -``` - -I hopped onto the `#simple-web` IRC channel on [Libera.Chat] and started -chatting with the devs. A couple days of back-and-forth later, we sat -down to debug together. After scouring the internet, we determined that -the application was binding to the wrong interface: `127.0.0.1`, which -is only accessible from the local machine, instead of `0.0.0.0`, which -is public. - -I cooked up a pair of working Dockerfiles – the first running the app -directly and the second through [uvicorn]. Metalune made a [repo for the -Dockerfiles][repo], and I sent in a [patch via email][patch]. It was -[committed] within the hour. - -This contribution was particularly interesting! We collaborated over IRC -and across timezones, and I ended up returning to git's roots by -submitting the patch via `git send-email`. Compared to the GitHub -workflow, this feels very natural! - -You can use SimplyTranslate over on metalune's [hosted instance], and -browse the source code [on sourcehut][st]. - -[st]: https://sr.ht/~metalune/SimplyTranslate/sources -[metalune]: gemini://metalune.xyz -[Nitter]: https://github.com/zedeus/nitter -[Libera.Chat]: https://libera.chat -[uvicorn]: https://www.uvicorn.org -[repo]: https://git.sr.ht/~metalune/simplytranslate_docker/ -[patch]: https://lists.sr.ht/~metalune/simplytranslate-devel/patches/23516 -[committed]: https://git.sr.ht/~metalune/simplytranslate_docker/commit/4fc34e3503def3a8436dab4f84a1731070a715ba -[hosted instance]: https://translate.metalune.xyz/ diff --git a/content/projects/tofu/index.md b/content/projects/tofu/index.md @@ -1,6 +1,5 @@ +++ title = "Tofu" -description = "Tofu is an easy-to-use, open-source, two-factor authentication app designed specifically for iOS, made by Calle Luks. I adopted it after migrating from Authy, and ended up overhauling its icon system." date = 2021-04-07 weight = 3 +++ diff --git a/content/projects/txtodo/index.md b/content/projects/txtodo/index.md @@ -1,16 +1,14 @@ +++ title = "txtodo" -description = "txtodo is a minimalist open-source todo list app inspired by Jeff Huang’s One File to Rule Them All. Inspired by Mac-assed Mac apps like IINA, Sketch, and Safari." date = 2020-05-20 -updated = 2021-04-08 +updated = 2022-06-14 weight = 1 +++ -[**txtodo**][txtodo] is a minimalist open-source todo list app -inspired by Jeff Huang's [*One File to Rule Them All*][ofrta] and -[Mac-assed Mac apps][mma] like [IINA][iina], [Sketch][sktch], and -Safari. It's available for download on iOS and macOS via the App -Store. +[**txtodo**] is a minimalist open-source todo list app inspired by Jeff +Huang's [*One File to Rule Them All*] and [Mac-assed Mac apps] like +[IINA], [Sketch], and Safari. It's available for download on iOS and +macOS via the App Store. <!-- more --> @@ -18,33 +16,32 @@ Store. txtodo lists your immediate, short-term tasks to help you get things done without overthinking it. At midnight, all tasks are discarded so -you can start fresh tomorrow. You can also create up to three -long-term tasks that "float" with you from day-to-day. +you can start fresh tomorrow. You can also create up to three long-term +tasks that "float" with you from day-to-day. -On 15 February 2020, I deleted my account with Trello. A solo -developer, I know my projects inside and out. I know what features -need work, and which graphics need a refresh. I don't need a massive -[crudware][crud] suite keep track of every little move. I need -something small. +On 15 February 2020, I deleted my account with Trello. A solo developer, +I know my projects inside and out. I know what features need work, and +which graphics need a refresh. I don't need a massive [crudware] suite +to keep track of every little move. I need something small. ![txtodo on iOS 14, with no tasks][ios] -A dead-simple UX and midnight expiration date prevents the -overwhelming buildup of tasks we delay over and over again, and helps -you deal only with tasks you can get done *that day*. +A dead-simple UX and midnight expiration date prevents the overwhelming +buildup of tasks we delay over and over again, and helps you deal only +with tasks you can get done *that day*. -Download the app [on the App Store][store], and explore the source -code [on my Gitea][src]. +Download the app [on the App Store], and explore the source code [on my +forge]. -[txtodo]: https://txtodo.app/ -[ofrta]: https://jeffhuang.com/productivity_text_file/ -[mma]: https://daringfireball.net/linked/2020/03/20/mac-assed-mac-apps -[iina]: https://iina.io/ -[sktch]: https://www.sketch.com/ +[**txtodo**]: https://txtodo.app/ +[*One File to Rule Them All*]: https://jeffhuang.com/productivity_text_file/ +[Mac-assed Mac apps]: https://daringfireball.net/linked/2020/03/20/mac-assed-mac-apps +[IINA]: https://iina.io/ +[Sketch]: https://www.sketch.com/ [macos]: blank.jpg -[crud]: http://catb.org/jargon/html/C/crudware.html +[crudware]: http://catb.org/jargon/html/C/crudware.html [ios]: simulator.jpg -[store]: https://apps.apple.com/us/app/txtodo/id1504609185 -[src]: https://git.figbert.com/FIGBERT/txtodo +[on the App Store]: https://apps.apple.com/us/app/txtodo/id1504609185 +[on my forge]: https://git.figbert.com/txtodo/ diff --git a/nginx.conf b/nginx.conf @@ -10,4 +10,3 @@ http { default_type application/octet-stream; } } -