update website

This commit is contained in:
trimill 2024-05-12 19:21:34 -04:00
parent c6495852ba
commit 354e41873a
Signed by: trimill
GPG key ID: 4F77A16E17E10BCB
17 changed files with 441 additions and 319 deletions

View file

@ -6,7 +6,7 @@ timestamp: 2022-06-01T00:00:00-04:00
Much like any ordinary child, I spent much of my childhood watching math videos on YouTube. During this time I discovered many channels that you might already be familiary with: [3Blue1Brown](https://www.youtube.com/c/3blue1brown), [Numberphile](https://www.youtube.com/user/numberphile), [Stand-up Maths](https://www.youtube.com/user/standupmaths), and many, many others. I credit these videos with inspiring me to continue my fascination with mathematics. However, one of these channels rises above all others in terms of how it shaped me: [Vihart](https://www.youtube.com/user/Vihart).
Vi's videos, although lacking in pixels, more than make up for it with their humor, art, music, and beautiful introductions into various mathematics concepts that one would be lucky to even mention in a school curriculum. These videos introduced me to [$$ \tau $$](https://www.youtube.com/watch?v=FtxmFlMLYRI) (tau) - the superior circle constant, equal to the ratio between a circle's circumference and its radius (two times $$ \pi $$). Each day this June, leading up to June 28 ([tau day](https://tauday.org)), I will be posting a creative demonstration of the beauty of this constant, circles, and mathematics as a whole.
Vi's videos, although lacking in pixels, more than make up for it with their humor, art, music, and beautiful introductions into various mathematics concepts that one would be lucky to even mention in a school curriculum. These videos introduced me to [$\tau$](https://www.youtube.com/watch?v=FtxmFlMLYRI) (tau) - the superior circle constant, equal to the ratio between a circle's circumference and its radius (two times $\pi$). Each day this June, leading up to June 28 ([tau day](https://tauday.org)), I will be posting a creative demonstration of the beauty of this constant, circles, and mathematics as a whole.
All code used to generate these visualizations will be available [on GitHub](https://github.com/TriMill/28-days-of-tau/) the same day the blog post is released.
@ -14,6 +14,6 @@ All code used to generate these visualizations will be available [on GitHub](htt
![Day 1 - Labyrinth](/static/i/blog/tau-day1.png)
This image shows the digits of tau (as represented in a base-10 positional system) by assigning each one an angle, where 0 is directly right and each subsequent digit is $$ \frac{\tau}{10} $$ radians counterclockwise. The first digit is right next to the center, and following digits are further out and connected by arcs.
This image shows the digits of tau (as represented in a base-10 positional system) by assigning each one an angle, where 0 is directly right and each subsequent digit is $\frac{\tau}{10}$ radians counterclockwise. The first digit is right next to the center, and following digits are further out and connected by arcs.
[GitHub](https://github.com/TriMill/28-days-of-tau/tree/main/day1)

View file

@ -8,6 +8,6 @@ timestamp: 2022-06-03T00:00:00-04:00
![Day 3 - Polygons](/static/i/blog/tau-day3.png)
One of the oldest methods known to calculate circle constants is inscribing polygons of increasing side counts within circles. It is easy to find the area of these polygons, and as the number of sides increases the area approaches $$ \frac{\tau}{2} $$ (assuming a circle with radius 1).
One of the oldest methods known to calculate circle constants is inscribing polygons of increasing side counts within circles. It is easy to find the area of these polygons, and as the number of sides increases the area approaches $\frac{\tau}{2}$ (assuming a circle with radius 1).
[GitHub](https://github.com/TriMill/28-days-of-tau/tree/main/day3)

View file

@ -9,5 +9,5 @@ My favorite number is 12. Some people I have talked to do not understand the con
- 12 has 6 factors (1, 2, 3, 4, 6, and 12), which is more factors than any positive integer less than it.
- The dodecahedron, one of the five platonic solids (and the only one to have pentagonal faces), has 12 faces. The cube (the only platonic solid with square faces) has 12 edges.
- Base 12 is a very good positional number system, much more practical than base 10 (although not as good as base 6)
- The Riemann zeta function evaluated at -1 is equal to $$ \frac{-1}{12} $$
- The Riemann zeta function evaluated at -1 is equal to $\frac{-1}{12}$
- i like it :)

View file

@ -4,8 +4,7 @@ desc: The future of syndication is finally here
timestamp: 2022-07-04T12:49:00-04:00
---
![citrons: "we should have a unified GEORGE RSS feed that combines all of the RSS feeds in GEORGE
"](/static/i/blog/rssb_origins.png)
![citrons: "we should have a unified GEORGE RSS feed that combines all of the RSS feeds in GEORGE"](/static/i/blog/rssb_origins.png)
When this idea was brought up a few months ago, I stated in response that I would pursue it at a later date if no one else had (possibly). Recently, that later date has occured.

View file

@ -16,5 +16,5 @@ If you are not happy with preexisting pies, it is quite simple to innovate an en
With pie, the possibilities are endless.
[^1]: [this list](https://thepizzacalc.com/pizza-toppings-list-4/) includes 80 standard pizza toppings. this yields $$ 2^{80} $$ possible pizzas. if a human lives for 100 years and eats 3 meals per day, they will eat about 110,000 meals, which is far less than $$ 2^{80} $$.
[^1]: [this list](https://thepizzacalc.com/pizza-toppings-list-4/) includes 80 standard pizza toppings. this yields $2^{80}$ possible pizzas. if a human lives for 100 years and eats 3 meals per day, they will eat about 110,000 meals, which is far less than $2^{80}$.

BIN
flaskr/static/i/bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 747 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 736 B

View file

@ -0,0 +1,76 @@
.codehilite .c { color: #999999; font-style: italic } /* Comment */
.codehilite .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.codehilite .esc { color: #d0d0d0 } /* Escape */
.codehilite .g { color: #d0d0d0 } /* Generic */
.codehilite .k { color: #6ab825; font-weight: bold } /* Keyword */
.codehilite .l { color: #d0d0d0 } /* Literal */
.codehilite .n { color: #d0d0d0 } /* Name */
.codehilite .o { color: #d0d0d0 } /* Operator */
.codehilite .x { color: #d0d0d0 } /* Other */
.codehilite .p { color: #d0d0d0 } /* Punctuation */
.codehilite .ch { color: #999999; font-style: italic } /* Comment.Hashbang */
.codehilite .cm { color: #999999; font-style: italic } /* Comment.Multiline */
.codehilite .cp { color: #cd2828; font-weight: bold } /* Comment.Preproc */
.codehilite .cpf { color: #999999; font-style: italic } /* Comment.PreprocFile */
.codehilite .c1 { color: #999999; font-style: italic } /* Comment.Single */
.codehilite .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */
.codehilite .gd { color: #d22323 } /* Generic.Deleted */
.codehilite .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */
.codehilite .gr { color: #d22323 } /* Generic.Error */
.codehilite .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */
.codehilite .gi { color: #589819 } /* Generic.Inserted */
.codehilite .go { color: #cccccc } /* Generic.Output */
.codehilite .gp { color: #aaaaaa } /* Generic.Prompt */
.codehilite .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */
.codehilite .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */
.codehilite .gt { color: #d22323 } /* Generic.Traceback */
.codehilite .kc { color: #6ab825; font-weight: bold } /* Keyword.Constant */
.codehilite .kd { color: #6ab825; font-weight: bold } /* Keyword.Declaration */
.codehilite .kn { color: #6ab825; font-weight: bold } /* Keyword.Namespace */
.codehilite .kp { color: #6ab825 } /* Keyword.Pseudo */
.codehilite .kr { color: #6ab825; font-weight: bold } /* Keyword.Reserved */
.codehilite .kt { color: #6ab825; font-weight: bold } /* Keyword.Type */
.codehilite .ld { color: #d0d0d0 } /* Literal.Date */
.codehilite .m { color: #3677a9 } /* Literal.Number */
.codehilite .s { color: #ed9d13 } /* Literal.String */
.codehilite .na { color: #bbbbbb } /* Name.Attribute */
.codehilite .nb { color: #24909d } /* Name.Builtin */
.codehilite .nc { color: #447fcf; text-decoration: underline } /* Name.Class */
.codehilite .no { color: #40ffff } /* Name.Constant */
.codehilite .nd { color: #ffa500 } /* Name.Decorator */
.codehilite .ni { color: #d0d0d0 } /* Name.Entity */
.codehilite .ne { color: #bbbbbb } /* Name.Exception */
.codehilite .nf { color: #447fcf } /* Name.Function */
.codehilite .nl { color: #d0d0d0 } /* Name.Label */
.codehilite .nn { color: #447fcf; text-decoration: underline } /* Name.Namespace */
.codehilite .nx { color: #d0d0d0 } /* Name.Other */
.codehilite .py { color: #d0d0d0 } /* Name.Property */
.codehilite .nt { color: #6ab825; font-weight: bold } /* Name.Tag */
.codehilite .nv { color: #40ffff } /* Name.Variable */
.codehilite .ow { color: #6ab825; font-weight: bold } /* Operator.Word */
.codehilite .w { color: #666666 } /* Text.Whitespace */
.codehilite .mb { color: #3677a9 } /* Literal.Number.Bin */
.codehilite .mf { color: #3677a9 } /* Literal.Number.Float */
.codehilite .mh { color: #3677a9 } /* Literal.Number.Hex */
.codehilite .mi { color: #3677a9 } /* Literal.Number.Integer */
.codehilite .mo { color: #3677a9 } /* Literal.Number.Oct */
.codehilite .sa { color: #ed9d13 } /* Literal.String.Affix */
.codehilite .sb { color: #ed9d13 } /* Literal.String.Backtick */
.codehilite .sc { color: #ed9d13 } /* Literal.String.Char */
.codehilite .dl { color: #ed9d13 } /* Literal.String.Delimiter */
.codehilite .sd { color: #ed9d13 } /* Literal.String.Doc */
.codehilite .s2 { color: #ed9d13 } /* Literal.String.Double */
.codehilite .se { color: #ed9d13 } /* Literal.String.Escape */
.codehilite .sh { color: #ed9d13 } /* Literal.String.Heredoc */
.codehilite .si { color: #ed9d13 } /* Literal.String.Interpol */
.codehilite .sx { color: #ffa500 } /* Literal.String.Other */
.codehilite .sr { color: #ed9d13 } /* Literal.String.Regex */
.codehilite .s1 { color: #ed9d13 } /* Literal.String.Single */
.codehilite .ss { color: #ed9d13 } /* Literal.String.Symbol */
.codehilite .bp { color: #24909d } /* Name.Builtin.Pseudo */
.codehilite .fm { color: #447fcf } /* Name.Function.Magic */
.codehilite .vc { color: #40ffff } /* Name.Variable.Class */
.codehilite .vg { color: #40ffff } /* Name.Variable.Global */
.codehilite .vi { color: #40ffff } /* Name.Variable.Instance */
.codehilite .vm { color: #40ffff } /* Name.Variable.Magic */
.codehilite .il { color: #3677a9 } /* Literal.Number.Integer.Long */

View file

@ -40,6 +40,8 @@
--accent-1: #2aca98;
--accent-1-dark: #268d78;
--error: #ee6d7d;
--error-bg: #9b3440;
--bgimg: url("/static/i/bg.png");
}
.only-theme-light {
display: none;
@ -58,6 +60,8 @@
--accent-2: #0f7904;
--accent-2-dark: #094a05;
--error: #a50518;
--error-bg: #ee6d7d;
--bgimg: url("/static/i/bg_light.png");
}
.only-theme-dark {
display: none;
@ -73,6 +77,8 @@
--accent-1: #2aca98;
--accent-1-dark: #268d78;
--error: #ee6d7d;
--error-bg: #9b3440;
--bgimg: url("/static/i/bg.png");
}
:root.theme-light {
@ -84,18 +90,8 @@
--accent-1: #0642c3;
--accent-1-dark: #07136d;
--error: #a50518;
}
:root.theme-special {
--bg: #ffff00;
--bg-intense: #ffffff;
--bg-faded: #00ff00;
--fg: #ff00ff;
--fg-faded: #ff0000;
--accent-1: #00ffff;
--accent-1-dark: #0000ff;
--error: #000000;
font-family: "Comic Sans MS", cursive;
--error-bg: #ee6d7d;
--bgimg: url("/static/i/bg_light.png");
}
:root {
@ -130,7 +126,9 @@ h1 {
}
body {
background: var(--bg);
background-image: var(--bgimg);
background-color: var(--bg);
image-rendering: pixelated;
width: min(750px, 90vw);
margin: auto;
min-height: 100vh;
@ -256,3 +254,32 @@ button:active, input[type=button]:active {
.error {
color: var(--error);
}
#abdetect-container {
position: relative;
display: inline-block;
text-align: center;
margin-bottom: 5px;
}
#abthankyou {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
color: var(--fg-faded);
font-size: 12px;
}
#ad {
z-index: 99999;
background: var(--error-bg);
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
color: var(--fg);
font-weight: bold;
}

View file

@ -3,13 +3,16 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{ meta.title }}</title>
<meta name="author" content="trimill">
<meta name="description" content="{{ meta.desc }}">
<meta name="theme-color" content="#2aca98">
<meta property="og:description" content="{{ meta.desc }}">
<meta property="og:title" content="{{ meta.title }}">
<meta property="og:site_name" content="trimill.xyz">
<meta property="og:image" content="{{ url_for('static', filename='logo640.png') }}">
<title>{{ meta.title }}</title>
<link rel="icon" type="image/png" sizes="16x16" href="{{ url_for('static', filename='logo16.png') }}">
<link rel="icon" type="image/png" sizes="32x32" href="{{ url_for('static', filename='logo32.png') }}">
@ -18,6 +21,7 @@
<link rel="icon" type="image/png" sizes="640x640" href="{{ url_for('static', filename='logo640.png') }}">
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
<style>
body {
{% if meta.fullscreen == True %}
@ -38,22 +42,16 @@
<a href="/blog/">Blog™</a> ·
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8" style="position: sticky;">
<a href="?theme={{ data.next_theme[theme] | safe }}">
<!--<rect width="8" height="8" fill="#00000000">-->
{% if theme == "dark" %}
<path d="M2.72 0c-1.58.53-2.72 2.02-2.72 3.78 0 2.21 1.79 4 4 4 1.76 0 3.25-1.14 3.78-2.72-.4.13-.83.22-1.28.22-2.21 0-4-1.79-4-4 0-.45.08-.88.22-1.28z" />
<title>Dark theme</title>
{% elif theme == "light" %}
<path d="M4 0c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-2.5 1c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm5 0c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-2.5 1c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-3.5 1.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm7 0c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-6 2.5c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm5 0c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5zm-2.5 1c-.28 0-.5.22-.5.5s.22.5.5.5.5-.22.5-.5-.22-.5-.5-.5z" />
<title>Light theme</title>
{% elif theme == "special" %}
<image href="/static/i/apioform1.png" width="8" height="8" />
transform="translate(0 1)">
<title>Ocular apiation occuring, do not close page until eyes have been apiated to completion.</title>
{% else %}
<path d="M3.41 0a.5.5 0 0 0-.13.06l-3 1.5a.5.5 0 1 0 .44.88l3-1.5a.5.5 0 0 0-.31-.94zm1 1.5a.5.5 0 0 0-.13.06l-4 2a.5.5 0 1 0 .44.88l4-2a.5.5 0 0 0-.31-.94zm0 2a.5.5 0 0 0-.13.06l-3 1.5a.5.5 0 0 0 .22.94h2a.5.5 0 0 0 .16-1l1.06-.56a.5.5 0 0 0-.31-.94zm-2.56 3.5a.5.5 0 0 0 .16 1h1a.5.5 0 1 0 0-1h-1a.5.5 0 0 0-.09 0 .5.5 0 0 0-.06 0z" transform="translate(1)" />
<title>System default theme</title>
{% endif %}
<!--</rect>-->
</a>
</svg>
</nav>
@ -68,6 +66,21 @@
</main>
{% if meta.fullscreen != True %}
<hr>
<div id="abdetect-container">
<span class="ad-slot" id="ad">
you aren't using an adblocker! click
<a href="https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/">here (firefox)</a> or
<a href="https://chromewebstore.google.com/detail/ublock-origin/cjpalhdlnbpafiamejdnhcphjbkeiagm">here (chrome)</a> to install one.
</span>
<span id="abthankyou">
thank you for using an adblocker!
</span>
<span style="visibility: hidden;">
you aren't using an adblocker! click
<a href="">here (firefox)</a> or
<a href="">here (chrome)</a> to install one.
</span>
</div>
{% block footer_content %}{% endblock %}
<footer>
{{ data.feet | random | safe }}

View file

@ -2,13 +2,14 @@
{% block head %}
<!-- KaTex -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css" integrity="sha384-Xi8rHCmBmhbuyyhbI88391ZKP2dmfnOl4rT9ZfRI7mLTdk1wblIUnrIq35nqwEvC" crossorigin="anonymous">
<link rel="stylesheet" href="/static/pygments.css">
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.js" integrity="sha384-X/XCfMm41VSsqRNQgDerQczD69XqmjOOOwYQvr/uuC+j4OPoNhVgjdGFwhvN02Ja" crossorigin="anonymous"></script>
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/contrib/auto-render.min.js" integrity="sha384-+XBljXPPiv+OzfbB3cVmLHf4hdUFHlWNZN5spNQ7rmHTXpd7WvJum6fIACpNNfIR" crossorigin="anonymous"></script>
<script>
document.addEventListener("DOMContentLoaded", function() {
renderMathInElement(document.body, {
delimiters: [
{left: '$$', right: '$$', display: false},
{left: '$', right: '$', display: false},
{left: '\\[', right: '\\]', display: true},
],
throwOnError : false

View file

@ -36,18 +36,16 @@
{% block footer_content %}
{% if theme == "light" %}
<iframe height="50" src="https://george.gh0.pw/embed.cgi?trimill&c_bg=%23f6f5f2&c_fg=%2328262b&c_links=%230642c3&c_george=%230d8101&c_underline=%230d8101" style="border:none;width:100%;" sandbox="allow-top-navigation"></iframe>
{% elif theme == "special" %}
<iframe height="50" src="https://george.gh0.pw/embed.cgi?trimill&c_bg=%23ffff00&c_fg=%23ff00ff&c_links=%2300ffff&c_george=%2300ff00&c_underline=%2300ff00" style="border:none;width:100%;" sandbox="allow-top-navigation"></iframe>
<iframe title="GEORGE" height="50" src="https://george.gh0.pw/embed.cgi?trimill&c_bg=%23f6f5f2&c_fg=%2328262b&c_links=%230642c3&c_george=%230d8101&c_underline=%230d8101" style="border:none;width:100%;" sandbox="allow-top-navigation"></iframe>
{% elif theme == "system" %}
<iframe height="50" class="only-theme-dark" src="https://george.gh0.pw/embed.cgi?trimill&c_bg=%23131720&c_fg=%23e6ded6&c_links=%232aca98&c_george=%23268d78&c_underline=%23268d78" style="border:none;width:100%;" sandbox="allow-top-navigation"></iframe>
<iframe height="50" class="only-theme-light" src="https://george.gh0.pw/embed.cgi?trimill&c_bg=%23f6f5f2&c_fg=%2328262b&c_links=%230642c3&c_george=%230d8101&c_underline=%230d8101" style="border:none;width:100%;" sandbox="allow-top-navigation"></iframe>
<iframe title="GEORGE" height="50" class="only-theme-dark" src="https://george.gh0.pw/embed.cgi?trimill&c_bg=%23131720&c_fg=%23e6ded6&c_links=%232aca98&c_george=%23268d78&c_underline=%23268d78" style="border:none;width:100%;" sandbox="allow-top-navigation"></iframe>
<iframe title="GEORGE" height="50" class="only-theme-light" src="https://george.gh0.pw/embed.cgi?trimill&c_bg=%23f6f5f2&c_fg=%2328262b&c_links=%230642c3&c_george=%230d8101&c_underline=%230d8101" style="border:none;width:100%;" sandbox="allow-top-navigation"></iframe>
{% else %}
<iframe height="50" src="https://george.gh0.pw/embed.cgi?trimill&c_bg=%23131720&c_fg=%23e6ded6&c_links=%232aca98&c_george=%23268d78&c_underline=%23268d78" style="border:none;width:100%;" sandbox="allow-top-navigation"></iframe>
<iframe title="GEORGE" height="50" src="https://george.gh0.pw/embed.cgi?trimill&c_bg=%23131720&c_fg=%23e6ded6&c_links=%232aca98&c_george=%23268d78&c_underline=%23268d78" style="border:none;width:100%;" sandbox="allow-top-navigation"></iframe>
{% endif %}
<p>
<iframe src="https://john.citrons.xyz/embed?ref=trimill.xyz" style="margin-left:auto;display:block;margin-right:auto;max-width:732px;width:100%;height:94px;border:none;"></iframe>
<iframe title="johnvertisement" src="https://john.citrons.xyz/embed?ref=trimill.xyz" style="margin-left:auto;display:block;margin-right:auto;max-width:732px;width:100%;height:94px;border:none;"></iframe>
</p>
<br>

View file

@ -2,18 +2,26 @@
{% extends "/_base.html" %}
{% block content %}
<h2><a href="https://g.trimill.xyz/trimill/complexpr">complexpr</a></h2>
<h2><a href="https://cx.trimill.xyz/">CXGraph</a></h2>
<p>
Complexpr is a toy programming language with an interpreter written in Rust. It is dynamically typed, with
native support for rational and complex numbers, lists and maps, and first-class functions. It features
pipeline operators (similar to Elixir's <code>|&gt;</code>) to express nested function calls more cleanly.
CXGraph is the successor to Complex Grapher. It allows the definition of multiple functions,
iteration, and interactive sliders and draggable points. It is implemented primarily in Rust
using WASM and WebGPU.
</p>
<h2><a href="https://g.trimill.xyz/trimill/talc">Talc</a></h2>
<p>
Talc is a procedural/functional programming language implemented in Rust. It supports
several numeric types, first-class functions, file I/O, string manipulation, exceptions,
and several other features.
</p>
<h2><a href="https://g.trimill.xyz/trimill/quectocraft">Quectocraft</a></h2>
<p>
Quectocraft is an extensible, ultra-minimalist implementation of a Minecraft server. By doing away with most
features of the vanilla server (such as world generation and interaction) it can run without consuming many system
resources. It is written primarily in Rust, but can load simple plugins written in Lua to add chat features and commands.
Quectocraft is an extensible, ultra-minimalist implementation of a Minecraft server.
By doing away with most features of the vanilla server (such as world generation and
interaction) it can run without consuming many system resources. It is written primarily
in Rust, but can load simple plugins written in Lua to add chat features and commands.
</p>
<h2><a href="https://g.trimill.xyz/trimill/rss-bundler">RSS Bundler</a></h2>
@ -22,19 +30,19 @@
feeds, merges them together, and stores and serves the result. RSS Bundler is written in Rust.
</p>
<h2><a href="/projects/complex_grapher">Complex grapher</a></h2>
<p>
Complex grapher allows you to functions using <a href="https://en.wikipedia.org/wiki/Domain_coloring">domain coloring</a>.
Functions are written in a custom expression language and compiled to GLSL. WebGL is then used to generate a color for each pixel.
Complex grapher also has support for iterating functions, allowing you to generate fractals such as the Mandelbrot and Julia sets.
</p>
<h2><a href="/projects/zzcxz_vis">zzcxz visualizer</a></h2>
<p>
zzcxz visualizer displays a force-directed graph of <a href="https://zzcxz.citrons.xyz/">zzcxz</a>, a collaborative interactive
fiction project. It is written in JavaScript and uses D3.js.
</p>
<h2><a href="https://g.trimill.xyz/trimill/complexpr">complexpr</a></h2>
<p>
Complexpr is a toy programming language with an interpreter written in Rust. It is dynamically typed, with
native support for rational and complex numbers, lists and maps, and first-class functions. It features
pipeline operators (similar to Elixir's <code>|&gt;</code>) to express nested function calls more cleanly.
</p>
<h2><a href="https://g.trimill.xyz/trimill/sysh">sysh</a></h2>
<p>
sysh is a shell that allows users to run Linux syscalls directly. It supports the entire set of x86_64 syscalls, as well as