From d84217fe5a0f389de8afcfacacd95b1c9dfd6eca Mon Sep 17 00:00:00 2001 From: Paweł Redman Date: Sun, 21 Jun 2026 12:41:59 +0200 Subject: Licensing --- site/common.typ | 3 + site/content/blog/typst_migration.typ | 48 +++++++++++++-- site/content/bsc_thesis.typ | 3 + site/content/gsoc/academic_year_ends.typ | 3 + site/content/gsoc/convergence_problems.typ | 3 + site/content/gsoc/differentiating_code.typ | 3 + .../content/gsoc/differentiating_code_addendum.typ | 3 + site/content/gsoc/first.typ | 3 + site/content/gsoc/first_merge.typ | 3 + site/content/gsoc/index.typ | 3 + site/content/gsoc/june_ends.typ | 3 + site/content/gsoc/mallett_merge.typ | 3 + site/content/gsoc/method_comparison.typ | 3 + site/content/gsoc/mid_august.typ | 3 + site/content/gsoc/new_color_quality_metrics.typ | 3 + site/content/gsoc/nondimensionalization.typ | 3 + site/content/gsoc/otsu2018_1.typ | 3 + site/content/gsoc/otsu2018_2.typ | 3 + site/content/gsoc/otsu2018_3.typ | 3 + site/content/gsoc/otsu2018_4.typ | 3 + site/content/gsoc/plan_june.typ | 3 + site/content/gsoc/progress_late_june.typ | 3 + site/content/gsoc/proposal.typ | 3 + site/content/gsoc/prototypes_repo.typ | 3 + .../gsoc/scipy_minimize_value_threshold.typ | 3 + site/content/gsoc/work_product_submission.typ | 3 + site/content/math/angle_between_two_vectors.typ | 3 + site/content/math/atan2.typ | 3 + site/content/math/index.typ | 3 + site/content/math/integrating_cos2x.typ | 3 + site/content/math/integrating_sin2x.typ | 3 + site/content/math/ray_vs_sphere.typ | 3 + .../math/rotational_symmetries_bravais_lattice.typ | 3 + site/content/software/cem.typ | 3 + site/content/software/gnlse_python.typ | 3 + site/content/software/index.typ | 3 + site/content/software/mapcat.typ | 3 + site/content/software/minitrem.typ | 3 + site/content/software/polarization.typ | 3 + site/content/software/ray.typ | 3 + site/content/software/schachtmeister2.typ | 3 + site/content/software/tremulous.typ | 72 ++++++++++++---------- site/index.typ | 31 +++++----- 43 files changed, 216 insertions(+), 55 deletions(-) (limited to 'site') diff --git a/site/common.typ b/site/common.typ index 8906173..9f08c37 100644 --- a/site/common.typ +++ b/site/common.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: 0BSD +// Copyright © Paweł Redman + #let webroot = "/" diff --git a/site/content/blog/typst_migration.typ b/site/content/blog/typst_migration.typ index 50d28cd..28ee708 100644 --- a/site/content/blog/typst_migration.typ +++ b/site/content/blog/typst_migration.typ @@ -1,12 +1,50 @@ -#import "/common.typ": post +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + +#import "/common.typ": post, link-self, img, static #show: post.with( title: "Migration to Typst", - date: datetime(year: 2026, month: 6, day: 14), + date: datetime(year: 2026, month: 6, day: 18), +) + +After #link-self("gsoc/index")[Google Summer of Code 2020], I began working for Nokia. As a full-time software engineer, I lost interest in programming as a hobby. Because I couldn't really blog about the cool stuff I was doing at work, this site was rotting for almost 6 years. + +#figure( + img(static("blog/site_before_typst.png")), + caption: [Rotting redman.xyz from before the migration], ) +A DokuWiki update broke my #link("https://redman.xyz/git/opticks/")[custom theme], and at some point LaTeX stopped working too. I just couldn't be bothered to fix any of it. + +Two things changed my mind: #link("https://typst.app")[Typst] and AI. + += Typst + +For the longest time, I was looking for a good and universal markup language. I tried: + +- Markdown, which is too limited. +- reStructuredText, which is slightly less limited Markdown. +- Wikitext, which is much less limited, but only because it counts raw HTML as "markup". +- HTML, which is way too verbose for writing prose or math. +- BBCode, which makes me feel old just for mentioning it. +- #link-self("blog/latex_vs_typst")[LaTeX], the tenth circle of Hell. + +Also, all but LaTeX treat math as a second-class citizen. They require plugins, extra pain, and maintenance, and still use the TeX language anyway. + +#link("https://typst.app")[Typst] is so well-designed that every other markup immediately felt obsolete. It's as simple as Markdown for prose, yet seamlessly integrates advanced typesetting, equations, diagrams, and a proper scripting language. On top of that, compile times are measured in milliseconds. + +As of this writing, HTML output is still experimental. Even so, it's already the most pleasant way to write a personal blog I've ever experienced, and by a long shot. + += AI + +Typst alone wouldn't be enough. I still had to convert tens of articles full of equations from Wikitext to Typst. This was an excellent use case for AI, though. + +LLMs are scarily good at coding if they're tightly constrained, especially when the work is very tedious. I started by writing common Typst code by hand so that every article would only have a minimal preamble that set everything up. Then I wrote a stub article. At that point, GPT 5.5 had enough context to mass-convert all my pages, making only a few minor mistakes in math. The whole process cost me \$6 and one afternoon. + +One important instruction I had in my `AGENTS.md` was: "keep text verbatim." LLMs like to fix typos and rephrase bad English, and I wanted to keep my articles 100% mine. + +This is a pattern I've been using very successfully for a while now. Write the hardest, least obvious 10% of code yourself and let the LLM do the remaining 90%. It's not blind vibe-coding if you know exactly where you're going. -Loose thoughts: += The new site -- Fully automatic DokuWiki -> Typst conversion using GPT 5.5 -- Finds typos \ No newline at end of file diff --git a/site/content/bsc_thesis.typ b/site/content/bsc_thesis.typ index d9790ca..dc8adf4 100644 --- a/site/content/bsc_thesis.typ +++ b/site/content/bsc_thesis.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, static #show: post.with( diff --git a/site/content/gsoc/academic_year_ends.typ b/site/content/gsoc/academic_year_ends.typ index 38f6fe6..b052c63 100644 --- a/site/content/gsoc/academic_year_ends.typ +++ b/site/content/gsoc/academic_year_ends.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post #show: post.with( diff --git a/site/content/gsoc/convergence_problems.typ b/site/content/gsoc/convergence_problems.typ index 8be6671..05f4cf8 100644 --- a/site/content/gsoc/convergence_problems.typ +++ b/site/content/gsoc/convergence_problems.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, link-self, static, img #show: post.with( diff --git a/site/content/gsoc/differentiating_code.typ b/site/content/gsoc/differentiating_code.typ index d68efb7..16f8a84 100644 --- a/site/content/gsoc/differentiating_code.typ +++ b/site/content/gsoc/differentiating_code.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post #show: post.with( diff --git a/site/content/gsoc/differentiating_code_addendum.typ b/site/content/gsoc/differentiating_code_addendum.typ index 9d8bad1..fb01de1 100644 --- a/site/content/gsoc/differentiating_code_addendum.typ +++ b/site/content/gsoc/differentiating_code_addendum.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, link-self #show: post.with( diff --git a/site/content/gsoc/first.typ b/site/content/gsoc/first.typ index 7ff2619..1e5018f 100644 --- a/site/content/gsoc/first.typ +++ b/site/content/gsoc/first.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, link-self #show: post.with( diff --git a/site/content/gsoc/first_merge.typ b/site/content/gsoc/first_merge.typ index 6b78217..89bd655 100644 --- a/site/content/gsoc/first_merge.typ +++ b/site/content/gsoc/first_merge.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post #show: post.with( diff --git a/site/content/gsoc/index.typ b/site/content/gsoc/index.typ index f669671..f310092 100644 --- a/site/content/gsoc/index.typ +++ b/site/content/gsoc/index.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, link-self, static, img #show: post.with( diff --git a/site/content/gsoc/june_ends.typ b/site/content/gsoc/june_ends.typ index 49fab67..42ba658 100644 --- a/site/content/gsoc/june_ends.typ +++ b/site/content/gsoc/june_ends.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post #show: post.with( diff --git a/site/content/gsoc/mallett_merge.typ b/site/content/gsoc/mallett_merge.typ index 115a4da..d63e6e0 100644 --- a/site/content/gsoc/mallett_merge.typ +++ b/site/content/gsoc/mallett_merge.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post #show: post.with( diff --git a/site/content/gsoc/method_comparison.typ b/site/content/gsoc/method_comparison.typ index db6b4df..d4614cc 100644 --- a/site/content/gsoc/method_comparison.typ +++ b/site/content/gsoc/method_comparison.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, link-self, static, img #show: post.with( diff --git a/site/content/gsoc/mid_august.typ b/site/content/gsoc/mid_august.typ index f517d84..9daa5d2 100644 --- a/site/content/gsoc/mid_august.typ +++ b/site/content/gsoc/mid_august.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, link-self, anchor #show: post.with( diff --git a/site/content/gsoc/new_color_quality_metrics.typ b/site/content/gsoc/new_color_quality_metrics.typ index 4f83c00..913dece 100644 --- a/site/content/gsoc/new_color_quality_metrics.typ +++ b/site/content/gsoc/new_color_quality_metrics.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, static, img #show: post.with( diff --git a/site/content/gsoc/nondimensionalization.typ b/site/content/gsoc/nondimensionalization.typ index 7c6dff6..66cc05e 100644 --- a/site/content/gsoc/nondimensionalization.typ +++ b/site/content/gsoc/nondimensionalization.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post #show: post.with( diff --git a/site/content/gsoc/otsu2018_1.typ b/site/content/gsoc/otsu2018_1.typ index f86db9b..5737fd5 100644 --- a/site/content/gsoc/otsu2018_1.typ +++ b/site/content/gsoc/otsu2018_1.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, link-self #show: post.with( diff --git a/site/content/gsoc/otsu2018_2.typ b/site/content/gsoc/otsu2018_2.typ index 4ae754b..707190e 100644 --- a/site/content/gsoc/otsu2018_2.typ +++ b/site/content/gsoc/otsu2018_2.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, link-self, static, img #show: post.with( diff --git a/site/content/gsoc/otsu2018_3.typ b/site/content/gsoc/otsu2018_3.typ index c37b8d8..8bed036 100644 --- a/site/content/gsoc/otsu2018_3.typ +++ b/site/content/gsoc/otsu2018_3.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, link-self, static, img #show: post.with( diff --git a/site/content/gsoc/otsu2018_4.typ b/site/content/gsoc/otsu2018_4.typ index d0584f6..a5b05d9 100644 --- a/site/content/gsoc/otsu2018_4.typ +++ b/site/content/gsoc/otsu2018_4.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, link-self, static, img #show: post.with( diff --git a/site/content/gsoc/plan_june.typ b/site/content/gsoc/plan_june.typ index 0a7344b..882b845 100644 --- a/site/content/gsoc/plan_june.typ +++ b/site/content/gsoc/plan_june.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post #show: post.with( diff --git a/site/content/gsoc/progress_late_june.typ b/site/content/gsoc/progress_late_june.typ index 808cd32..f04b51e 100644 --- a/site/content/gsoc/progress_late_june.typ +++ b/site/content/gsoc/progress_late_june.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post #show: post.with( diff --git a/site/content/gsoc/proposal.typ b/site/content/gsoc/proposal.typ index 9731600..37d4c7b 100644 --- a/site/content/gsoc/proposal.typ +++ b/site/content/gsoc/proposal.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post #show: post.with( diff --git a/site/content/gsoc/prototypes_repo.typ b/site/content/gsoc/prototypes_repo.typ index d892158..77e031a 100644 --- a/site/content/gsoc/prototypes_repo.typ +++ b/site/content/gsoc/prototypes_repo.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, static, img #show: post.with( diff --git a/site/content/gsoc/scipy_minimize_value_threshold.typ b/site/content/gsoc/scipy_minimize_value_threshold.typ index c133827..c76a141 100644 --- a/site/content/gsoc/scipy_minimize_value_threshold.typ +++ b/site/content/gsoc/scipy_minimize_value_threshold.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post #show: post.with( diff --git a/site/content/gsoc/work_product_submission.typ b/site/content/gsoc/work_product_submission.typ index 0b83867..8fb2a01 100644 --- a/site/content/gsoc/work_product_submission.typ +++ b/site/content/gsoc/work_product_submission.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, link-self #show: post.with( diff --git a/site/content/math/angle_between_two_vectors.typ b/site/content/math/angle_between_two_vectors.typ index 043d65a..c3b9c93 100644 --- a/site/content/math/angle_between_two_vectors.typ +++ b/site/content/math/angle_between_two_vectors.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, link-self, static, img #show: post.with( diff --git a/site/content/math/atan2.typ b/site/content/math/atan2.typ index 7fa77c8..09cf19f 100644 --- a/site/content/math/atan2.typ +++ b/site/content/math/atan2.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, static, img, anchor #show: post.with( diff --git a/site/content/math/index.typ b/site/content/math/index.typ index a1a6c4a..4b6d3c1 100644 --- a/site/content/math/index.typ +++ b/site/content/math/index.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, link-self #show: post.with( diff --git a/site/content/math/integrating_cos2x.typ b/site/content/math/integrating_cos2x.typ index 11fdd67..1d4949f 100644 --- a/site/content/math/integrating_cos2x.typ +++ b/site/content/math/integrating_cos2x.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, link-self #show: post.with( diff --git a/site/content/math/integrating_sin2x.typ b/site/content/math/integrating_sin2x.typ index ceda615..90cf02b 100644 --- a/site/content/math/integrating_sin2x.typ +++ b/site/content/math/integrating_sin2x.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, link-self #show: post.with( diff --git a/site/content/math/ray_vs_sphere.typ b/site/content/math/ray_vs_sphere.typ index a035596..75c60ac 100644 --- a/site/content/math/ray_vs_sphere.typ +++ b/site/content/math/ray_vs_sphere.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, static, img #show: post.with( diff --git a/site/content/math/rotational_symmetries_bravais_lattice.typ b/site/content/math/rotational_symmetries_bravais_lattice.typ index 13eb75b..10290df 100644 --- a/site/content/math/rotational_symmetries_bravais_lattice.typ +++ b/site/content/math/rotational_symmetries_bravais_lattice.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post #show: post.with( diff --git a/site/content/software/cem.typ b/site/content/software/cem.typ index 1754553..7ef9104 100644 --- a/site/content/software/cem.typ +++ b/site/content/software/cem.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, static, img, link-self #show: post.with( diff --git a/site/content/software/gnlse_python.typ b/site/content/software/gnlse_python.typ index 373a4ec..4c60ee6 100644 --- a/site/content/software/gnlse_python.typ +++ b/site/content/software/gnlse_python.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, static, img, link-self #show: post.with( diff --git a/site/content/software/index.typ b/site/content/software/index.typ index 1211bc2..c763273 100644 --- a/site/content/software/index.typ +++ b/site/content/software/index.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, static, link-self #show: post.with( diff --git a/site/content/software/mapcat.typ b/site/content/software/mapcat.typ index ad90def..f67375a 100644 --- a/site/content/software/mapcat.typ +++ b/site/content/software/mapcat.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, link-self #show: post.with( diff --git a/site/content/software/minitrem.typ b/site/content/software/minitrem.typ index 9c1c488..5dcae1e 100644 --- a/site/content/software/minitrem.typ +++ b/site/content/software/minitrem.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, static, img #show: post.with( diff --git a/site/content/software/polarization.typ b/site/content/software/polarization.typ index 3e514be..3c29a97 100644 --- a/site/content/software/polarization.typ +++ b/site/content/software/polarization.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, static, img #show: post.with( diff --git a/site/content/software/ray.typ b/site/content/software/ray.typ index df64659..5761754 100644 --- a/site/content/software/ray.typ +++ b/site/content/software/ray.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, static, img, link-self #show: post.with( diff --git a/site/content/software/schachtmeister2.typ b/site/content/software/schachtmeister2.typ index f000360..907d999 100644 --- a/site/content/software/schachtmeister2.typ +++ b/site/content/software/schachtmeister2.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post #show: post.with( diff --git a/site/content/software/tremulous.typ b/site/content/software/tremulous.typ index 129fcf2..a883748 100644 --- a/site/content/software/tremulous.typ +++ b/site/content/software/tremulous.typ @@ -1,8 +1,11 @@ +// SPDX-License-Identifier: CC-BY-SA-4.0 +// Copyright © Paweł Redman + #import "/common.typ": post, static, img, link-self #show: post.with( - title: "Tremulous", - date: datetime(year: 2026, month: 6, day: 18), + title: "Tremulous: a personal history", + date: datetime(year: 2026, month: 6, day: 21), ) Tremulous was a truly fascinating game. @@ -14,36 +17,34 @@ It was a standalone game based on the Quake III: Arena engine. The gameplay was As much as I like Q3, it's an exhausting game. The constant action is very demanding, but also quite repetitive. Tremulous fixed this by turning it into a proper shooter/real-time strategy hybrid. On top of that, playing as aliens was a dramatically different experience to playing as humans. It was actually two games in one in a real sense. -Building also added a whole another dimension to the dynamic and unforgiving combat. There was only one game mode: aliens versus humans. The objective was simple. Destroy the enemy's spawn points (eggs or telenodes) and kill all the enemies. The game ended when one of the teams cannot continue. No artificial "score N points to win", no areas to capture, no little scenarios to play out, It was very elegant like chess. +Building also added a whole other dimension to the dynamic and unforgiving combat. There was only one game mode: aliens versus humans. The objective was simple. Destroy the enemy's spawn points (eggs or telenodes) and kill all the enemies. The game ended when one of the teams could no longer continue. No artificial "score N points to win", no areas to capture, no little scenarios to play out, It was very elegant, almost like chess. But I don't think the game was that fun. What kept me playing for almost two decades was the openness. Tremulous wasn't a commercial game made by a company. Dark Legion Development was a group of programmers and artists who just decided to make a game in their free time. Source code was licensed under GPL, assets under CC-BY-SA and anyone could host their own server. It was a very fertile ground for a curious kid like me. I learned everything from sound design, mapping, English and the C programming language all from playing the game and dissecting its internals. It started a chain of events that eventually led me to becoming a professional software engineer. -= My Tremulous diary - -While writing this article, I started reminiscing about all the fun adventures I had over the two decades I spent playing Tremulous. Below are some of the coolest moments I could remember. +(The game is still playable, but I write in the past tense because there are no regular players or games anymore.) -== The beginning += The beginning I discovered Tremulous in summer of 2006 through a random Polish forum. Coincidentally, it wasn't long after its 1.1.0 release, the version that held onto players until the very end. I was immediately hooked. -== Paint += Paint -I very quickly got interested in how the game worked. At the age of 10, I believed I was too dumb to learn programming. I understood nothing about what an .exe even was. I'd open one in Notepad and wonder, "who writes this?!" +I very quickly got interested in how the game worked. At the age of 10, I believed I was too dumb to learn programming. I understood nothing about it. I'd open an `.exe` in Notepad and wonder, "who writes this?!" Instead, I turned to mapping. Mapping is the art of designing and building the playable area of a video game. In Tremulous this meant arranging 3D shapes in GtkRadiant into walls, floors, doors, obstacles, and so on. You'd then wallpaper the shapes with images (textures), place lights, compile and load the finished file into the game to playtest. -In 2007, I released "Paint." It was arguably the most polarizing map in the game's history. It had fierce hates -- for obvious reasons -- but also many people loved it. I'll let screenshots speak for themselves. +In 2007, I released "Paint." It was arguably the most polarizing map in the game's history. It had fierce haters --- for obvious reasons --- but also many people loved it. I'll let screenshots speak for themselves. #figure( img(static("software/tremulous/shot0022.jpg")), caption: [Paint, main area (October 2007)], ) -The idea for the first Paint wasn't actually original. I basically copied an Unreal Tournament map with the same name, of which I can't find any traces anymore. +The idea for the first Paint wasn't actually original. I copied an Unreal Tournament map with the same name. I'd credit it, but I can't find any traces of it on the internet. -I kept iterating and made many more Paints over the years. I quickly outgrew the "flat houses" idea from that UT map with each Paint getting progressively more ambitious/deranged. +I kept iterating and made many more Paints over the years. I quickly outgrew the "flat houses" idea from the UT map, with each Paint getting progressively more ambitious/deranged. #figure( img(static("software/tremulous/shot0023.jpg")), @@ -62,31 +63,31 @@ I found an #link("https://forum.tremulous.net/index.php?topic=7427.0")[an ancien caption: [Paint 7, bouncy space room], ) -Paint 7 was the most played of the series by a good margin. It had a special, secret control room. If you raced the other team to it and built your base there first, you'd be undefeatable. Also, you'd had a button that played the Benny Hill theme song and shook the entire map. Each game was a trainwreck. +Paint 7 was the most played of the series by a good margin. It had a special, secret control room. If you raced the other team to it and built your base there first, you'd be undefeatable. Also, you'd have a button that played the Benny Hill theme song and shook the entire map. Each game was a trainwreck. -In later Paints, I tried improving playability, removed the control room and essentially ruined the fun. Worse still, I decided Paint 10 should be serious, disabled fullbright and used photorealistic textures. +In later Paints, I tried improving playability, removed the control room and essentially ruined the fun. Worse still, I decided Paint 10 should be serious, disabled fullbright and used photorealistic textures. It wasn't very popular. #figure( img(static("software/tremulous/unvanquished_2026-06-15_211812_000.jpg")), - caption: [Paint 10, alien outside], + caption: [Paint 10, main area (2011)], ) #figure( img(static("software/tremulous/unvanquished_2026-06-15_211740_000.jpg")), - caption: [Paint 10, main area (2011)], + caption: [Paint 10, alien outside], ) In retrospect, Paint 7 was a perfect comedic relief to play in-between serious games and I inadvertently left my niche by trying to make a proper map. -== Redfusion += Redfusion Tremfusion was an improved client for Tremulous. To me, the best feature was advanced scripting. -At some point, I learned enough programming to mod the game's client. I expanded Tremfusion's scripting language and sent the source to a couple of friends as Redfusion. Unfortunately, it most likely has been lost to the sands of time. +At some point, I learned enough programming to mod the game's client. I expanded Tremfusion's scripting language and sent the source to a couple of friends as "Redfusion." I didn't know Git back then, so the source code is lost to the sands of time. -== Cuboid += Cuboid -I spent a lot of time playing on Rotačák's R Unlimited CZ. He later went on to release #link("https://store.steampowered.com/app/634070/Murnatan/")[Murnatan] on Steam, a remake of Tremulous, which sadly completely flopped. +I spent a lot of time playing on Rotačák's R Unlimited CZ. He later went on to release #link("https://store.steampowered.com/app/634070/Murnatan/")[Murnatan] on Steam, a remake of Tremulous, which sadly flopped. His mod let players build as many buildings as they wanted (stock Tremulous is very conservative), build them on top of each other, and also added structural buildings like crates. Games got quite sophisticated with both teams building elaborate forts. @@ -96,21 +97,24 @@ Cuboid added scalable buildings to the game. You could build cuboids out of conc It was completely overengineered and didn't gain much popularity. Still, I have very fond memories of no-lifing the first version in two weeks over a spring break. -== Unvanquished += Unvanquished Around 2014-2015, I was an active contributor to #link("https://unvanquished.net/")[Unvanquished], the spiritual successor to Tremulous. I implemented beacons, Borderlands-style damage indicators and helped artists import a whole bunch of models into the game. The project was under very active development until kharnov, the project head, suddenly had to leave due to personal reasons. I lost interest shortly after. -== New EDGE += New EDGE New EDGE was a continuation of EDGE, which itself was a continuation of Rotačák's mod. New buildings, new aliens, new guns, many new original and high-quality assets. It was a lot of fun. -TODO: add screenshots +#figure( + img(static("software/tremulous/now_defend.webp")), + caption: [The average ams base (early 2010s)], +) I eventually became a quite prolific contributor, adding many more new ideas. #link("https://github.com/mtiusane/new-edge")[The repository] is still up. -== GrangerHub += GrangerHub By 2015 or so, the playerbase had been divided between the old 1.1.0 and the never-finished 1.2.0 for years. The former was much more active with New EDGE being the only populated 1.2 server left. @@ -120,7 +124,7 @@ Predictably, New EDGE was soon starved of players and we all resentfully switche They kept stalling, saying the code wasn't ready and that they would release the mythical "1.3.0" soon. -== An Almango += An Almango In 2016, I met MaeJong, a mapper and one of GrangerPub's top admins. We teamed up to create the only (as far as I know) collaborative map. For this purpose, I created #link-self("software/mapcat")[mapcat]. We worked on smaller segments of the map in parallel and used the tool to automatically join them all together. @@ -182,7 +186,7 @@ However, most of the map is "stream of consciousness" type of nonsense: #figure( img(static("software/tremulous/unvanquished_2026-06-16_000516_000.jpg")), - caption: [Unable to determine context or content of above screenshot], + caption: [I don't remember why I made this], ) #figure( @@ -192,7 +196,7 @@ However, most of the map is "stream of consciousness" type of nonsense: #figure( img(static("software/tremulous/unvanquished_2026-06-16_001329_000.jpg")), - caption: [An homage to #link("https://www.youtube.com/watch?v=ebba3zVktX0")[PacificSound3003]], + caption: [MaeJong's homage to #link("https://www.youtube.com/watch?v=ebba3zVktX0")[PacificSound3003]], ) @@ -203,7 +207,7 @@ However, most of the map is "stream of consciousness" type of nonsense: The map has been ported to Unvanquished and is still playable there. -== Zittrig / Der Bunker += Zittrig / Der Bunker It turned out that the source code debate was just one issue. The whole GrangerHub was grossly mismanaged. MaeJong, other top admins and even DevHC --- multiprotocol's author --- all defected. Together we created Der Bunker, a new multiprotocol server. @@ -215,12 +219,12 @@ Not long after, I publicly released the multiprotocol server code. I still host Der Bunker's history was mostly uneventful after this drama blew over. I'll give myself some credit for its stability and longevity. I insisted that, from the very beginning, we'd have: -- No benevolent dictator for life. Four people (DevHC, Kai, Majeong and I) had full access and authority over the server. +- No benevolent dictator for life. Four people (DevHC, Kai, MaeJong and I) had full access and authority over the server. - Minimal moderation. Everything was allowed unless it actively disrupted gameplay (killing your teammates, destroying your own base, etc.) or was illegal IRL. Leadership had to be transparent and open to criticism, otherwise we'd end up with another GrangerHub situation. #link("https://www.youtube.com/watch?v=y2-tbdolriU")[ZdrytchX] uploaded many gameplay videos from this era (and earlier years) to his YouTube channel. -== Schachtmeister += Schachtmeister Speaking of minimal moderation, the flip side was that we went #emph[hard] on people who purposefully ruined the game for others. @@ -228,21 +232,21 @@ In particular, we had one very special player. Desala would routinely cause seri So, I went scorched-earth and developed #link-self("software/schachtmeister2")[Schachtmeister], together with DevHC who integrated it with Tremulous. The idea was quite simple but surprisingly effective. Schachtmeister looked up every player's WHOIS and reverse DNS records, and compared them with a known-bad database. This way, we could ban #emph[entire] VPN providers all at once. Even ISPs with dynamic IPs like UPC (apparently Desala's home internet provider) wouldn't save you --- Schachtmeister flagged those and gave all admins a heads-up. -The database grew very quickly. Desala either ran out of VPNs, money or patience and stared behaving. RIP, bozo. +The database grew very quickly. Desala either ran out of VPNs, money or patience and started behaving. RIP, bozo. Fun aside: Schachtmeister is a deliberate misspelling of Schachmeister (German for "chess master"). Yalt, a German mapper/modder, named one of the areas in one of his maps "Ventillationsschacht" ("ventilation shaft"). This comically long name would often appear in team chats and we eventually started using "schacht" as a generic insult, basically meaning "dumbass". Hence, the "master of dumbasses". -== The pandemic += The pandemic Tremulous saw a resurgence during the pandemic. It wasn't uncommon to see the server so full that it was barely playable. Like in the good old days. Around that time, Der Bunker hosted a couple of special events. I have two videos from April Fools' Day in 2021 when we turned the game into absolute brainrot: #link("https://www.youtube.com/watch?v=iwV8kzOahBM")[glourno_2021] and #link("https://www.youtube.com/watch?v=jMbMUVjzCkI")[glourno_2021: Aliens]. The Christmas mod in 2020 was even dumber, but I don't have any clips at hand. -== The end += The end I eventually lost interest and handed Kai full control over the server. Around 2025, Der Bunker died a natural death as the last Tremulous server. -As of writing, Kai still hosts Der Bunker in Unvanquished, and I very occassionally contribute to the project. +As of writing, Kai still hosts Der Bunker in Unvanquished, and I very occasionally contribute to the project. #figure( img( diff --git a/site/index.typ b/site/index.typ index 5a78be8..7f6b76a 100644 --- a/site/index.typ +++ b/site/index.typ @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: CC-BY-SA 4.0 +// Copyright © Paweł Redman + #import "/common.typ": template, link-self, webroot, format-date-en #let payload = json(sys.inputs.payload) @@ -7,29 +10,25 @@ front_page: true, ) -I'm Paweł Redman, known online as enneract, a software engineer working on LTE/NR Layer 1 with a BSc in Optics and Photonics Engineering. - -TODO: what else should I write here? +I'm Paweł Redman, known online as enneract. I'm a software engineer working on LTE/NR Layer 1 with a BSc in Optics and Photonics Engineering. -= Latest posts += Latest writing -#for page in payload.pages { +#for page in payload.pages.slice(0, 5) { let date = datetime( year: page.year, month: page.month, day: page.day, ) - if (datetime.today() - date).days() > 365 { - continue - } - - [ - - #format-date-en(date) #link(webroot + page.url, page.title) - ] + [ - #link(webroot + page.url, page.title) --- #format-date-en(date) ] } -= Interests += Projects and interests + +- #strong[Cellular networks] + + - I'm currently a Senior Software Engineer in Nokia's Radio and Layer 1 R&D division. - #strong[Color science] @@ -38,17 +37,17 @@ TODO: what else should I write here? - #strong[Computational physics] - - #link-self("software/gnlse_python")[gnlse-python] --- non-linear light propagation in optical fibers + - #link-self("software/gnlse_python")[gnlse-python] --- nonlinear light propagation in optical fibers - #link-self("software/polarization")[polarization] --- a tool I wrote for myself to learn light polarization - #link-self("software/cem")[cem] --- my old FDTD wave simulator - #link-self("software/ray")[ray] --- my old path tracer - #strong[Game development] - - #link-self("software/tremulous")[Tremulous] --- a 3D FPS/RTS hybrid I spent almost two decades playing and modding + - #link-self("software/tremulous")[Tremulous] --- a 3D FPS/RTS hybrid I spent almost two decades playing, mapping, modding, and helping keep alive - #link-self("software/schachtmeister2")[Schachtmeister] --- a tool for catching ban evaders in Tremulous - #link-self("software/mapcat")[mapcat] --- a tool for collaborative mapping in Tremulous - #link("https://unvanquished.net/")[Unvanquished] --- the spiritual successor to Tremulous, to which I've contributed code and assets - #link-self("software/minitrem")[Minitrem] --- my 2D RTS game inspired by Tremulous -- #strong[#link-self("math/index")[Mathematics]] +- #strong[#link-self("math/index")[Mathematics]] --- notes, derivations, odds and ends -- cgit