From d84217fe5a0f389de8afcfacacd95b1c9dfd6eca Mon Sep 17 00:00:00 2001 From: Paweł Redman Date: Sun, 21 Jun 2026 12:41:59 +0200 Subject: Licensing --- LICENSE.md | 9 + LICENSES/0BSD.txt | 5 + LICENSES/CC-BY-SA-4.0.txt | 418 +++++++++++++++++++++ README.md | 8 + build.py | 17 +- 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 +- static/blog/site_before_typst.png | Bin 0 -> 219466 bytes static/software/tremulous/now_defend.webp | Bin 0 -> 106772 bytes 50 files changed, 667 insertions(+), 61 deletions(-) create mode 100644 LICENSE.md create mode 100644 LICENSES/0BSD.txt create mode 100644 LICENSES/CC-BY-SA-4.0.txt create mode 100644 README.md create mode 100644 static/blog/site_before_typst.png create mode 100644 static/software/tremulous/now_defend.webp diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..b288d7c --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,9 @@ +# License + +The following files are licensed under CC-BY-SA 4.0: + +- all files in `site/content/`, +- `site/content/index.typ`, +- all files in `static/` + +Everything else is licensed under 0BSD. diff --git a/LICENSES/0BSD.txt b/LICENSES/0BSD.txt new file mode 100644 index 0000000..72c7baf --- /dev/null +++ b/LICENSES/0BSD.txt @@ -0,0 +1,5 @@ +Copyright (C) 2006 by Rob Landley + +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/LICENSES/CC-BY-SA-4.0.txt b/LICENSES/CC-BY-SA-4.0.txt new file mode 100644 index 0000000..d25b9e9 --- /dev/null +++ b/LICENSES/CC-BY-SA-4.0.txt @@ -0,0 +1,418 @@ +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required in Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + +======================================================================= + +Creative Commons is not a party to its public +licenses. Notwithstanding, Creative Commons may elect to apply one of +its public licenses to material it publishes and in those instances +will be considered the "Licensor." The text of the Creative Commons +public licenses is dedicated to the public domain under the CC0 Public +Domain Dedication. Except for the limited purpose of indicating that +material is shared under a Creative Commons public license or as +otherwise permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the +public licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/README.md b/README.md new file mode 100644 index 0000000..197002d --- /dev/null +++ b/README.md @@ -0,0 +1,8 @@ +# redman.xyz + +This is the source code for my personal website, [redman.xyz](https://redman.xyz/). + +# License + +See `LICENSE.md`. + diff --git a/build.py b/build.py index 3e72993..5c2c69f 100644 --- a/build.py +++ b/build.py @@ -1,10 +1,13 @@ #!/usr/bin/env python3 +# SPDX-License-Identifier: 0BSD +# Copyright © Paweł Redman import itertools as it import json import os import shutil from argparse import ArgumentParser +from collections.abc import Iterable from dataclasses import dataclass from datetime import datetime from pathlib import Path @@ -78,12 +81,13 @@ class Builder: payload_path.parent.mkdir(parents=True, exist_ok=True) # Maybe sorting/filtering should be done in Typst? - pages = [ - page - for page in pages - if page.date is not None - ] - pages.sort(key=lambda page: page.date, reverse=True) + pages = [page for page in pages if page.date is not None] + + def page_date(page: CompiledPage) -> datetime: + assert page.date is not None + return page.date + + pages.sort(key=page_date, reverse=True) with payload_path.open('w') as file: payload = { @@ -137,6 +141,7 @@ def main() -> None: builder = Builder(site_dir, static_dir, public_dir, temp_dir) + iterator: Iterable[object] if args.watch: watch_filter = DefaultFilter(ignore_paths=[temp_dir]) iterator = it.chain(range(1), watch(site_dir, watch_filter=watch_filter)) 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 diff --git a/static/blog/site_before_typst.png b/static/blog/site_before_typst.png new file mode 100644 index 0000000..33d1b23 Binary files /dev/null and b/static/blog/site_before_typst.png differ diff --git a/static/software/tremulous/now_defend.webp b/static/software/tremulous/now_defend.webp new file mode 100644 index 0000000..25d3d5c Binary files /dev/null and b/static/software/tremulous/now_defend.webp differ -- cgit