diff options
| author | Elis Eriksson <spelis.tech@gmail.com> | 2026-05-27 19:57:56 +0200 |
|---|---|---|
| committer | Elis Eriksson <spelis.tech@gmail.com> | 2026-05-27 19:57:56 +0200 |
| commit | f9200559114d9f2fa61f738b5322b0a5467538b6 (patch) | |
| tree | 3c6a6bd37250a560c67f598c2425a2031b9b307a | |
| parent | ae399cf38d26715c4a09b029b849abace3c3f309 (diff) | |
| download | spelis-web-f9200559114d9f2fa61f738b5322b0a5467538b6.tar spelis-web-f9200559114d9f2fa61f738b5322b0a5467538b6.tar.gz spelis-web-f9200559114d9f2fa61f738b5322b0a5467538b6.tar.bz2 spelis-web-f9200559114d9f2fa61f738b5322b0a5467538b6.tar.lz spelis-web-f9200559114d9f2fa61f738b5322b0a5467538b6.tar.xz spelis-web-f9200559114d9f2fa61f738b5322b0a5467538b6.tar.zst spelis-web-f9200559114d9f2fa61f738b5322b0a5467538b6.zip | |
new update or smth idk
| -rw-r--r-- | .cache/eleventy-fetch-1fc116fe93737d8c4d05b10967cad1 | 1 | ||||
| -rw-r--r-- | .cache/eleventy-fetch-1fc116fe93737d8c4d05b10967cad1.buffer | bin | 0 -> 289838 bytes | |||
| -rw-r--r-- | _includes/base.njk | 121 | ||||
| -rw-r--r-- | _includes/meta.njk | 6 | ||||
| -rw-r--r-- | _includes/og-image.og.njk | 6 | ||||
| -rw-r--r-- | _layouts/home.njk | 4 | ||||
| -rw-r--r-- | _layouts/page.njk | 4 | ||||
| -rw-r--r-- | _layouts/post.njk | 4 | ||||
| -rw-r--r-- | assets/css/main.css | 26 | ||||
| -rw-r--r-- | content/blog/cbin.md | 14 | ||||
| -rw-r--r-- | content/blog/pipedals.md | 59 | ||||
| -rw-r--r-- | content/error.njk | 76 | ||||
| -rw-r--r-- | content/extras.md | 9 | ||||
| -rw-r--r-- | content/index.md | 16 | ||||
| -rw-r--r-- | public/site.json | 6 | ||||
| -rw-r--r-- | siteconfig.mjs | 12 |
16 files changed, 203 insertions, 161 deletions
diff --git a/.cache/eleventy-fetch-1fc116fe93737d8c4d05b10967cad1 b/.cache/eleventy-fetch-1fc116fe93737d8c4d05b10967cad1 new file mode 100644 index 0000000..19f92a0 --- /dev/null +++ b/.cache/eleventy-fetch-1fc116fe93737d8c4d05b10967cad1 @@ -0,0 +1 @@ +{"cachedAt":1774643665190,"type":"buffer","metadata":{"response":{"url":"https://share.spelis.projnull.eu/pfps/normal.png","status":200,"headers":{"accept-ranges":"bytes","connection":"keep-alive","content-length":"289838","content-type":"image/png","date":"Fri, 27 Mar 2026 20:34:25 GMT","etag":"\"6946f8f4-46c2e\"","last-modified":"Sat, 20 Dec 2025 19:28:52 GMT","server":"nginx"}}}}
\ No newline at end of file diff --git a/.cache/eleventy-fetch-1fc116fe93737d8c4d05b10967cad1.buffer b/.cache/eleventy-fetch-1fc116fe93737d8c4d05b10967cad1.buffer Binary files differnew file mode 100644 index 0000000..061825a --- /dev/null +++ b/.cache/eleventy-fetch-1fc116fe93737d8c4d05b10967cad1.buffer diff --git a/_includes/base.njk b/_includes/base.njk index 51eedc7..7c32f5a 100644 --- a/_includes/base.njk +++ b/_includes/base.njk @@ -1,70 +1,77 @@ <!DOCTYPE html> <html lang="en"> + <head> - <meta charset="UTF-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <link rel="stylesheet" href="{{ "/assets/css/highlight.css" | url}}"> - <link rel="stylesheet" href="{{ "/assets/fonts/KodeMono.css" | url}}"> - <link rel="stylesheet" href="{{ "/assets/fonts/JetBrains.css" | url}}"> - <link rel="stylesheet" href="{{ "/assets/css/main.css" | url}}"> - <link rel="stylesheet" href="{% getBundleFileUrl "css" %}"> - - {% block head %}{% endblock %} - {% if title %} - <title>{{ title }} - {{ site.title }}</title> - {% else %} - <title>{{ site.title }}</title> - {% endif %} - {% include "./meta.njk" %} + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <link rel="stylesheet" href="{{ " /assets/css/highlight.css" | url}}"> + <link rel="stylesheet" href="{{ " /assets/fonts/KodeMono.css" | url}}"> + <link rel="stylesheet" href="{{ " /assets/fonts/JetBrains.css" | url}}"> + <link rel="stylesheet" href="{{ " /assets/css/main.css" | url}}"> + <link rel="stylesheet" href="{% getBundleFileUrl "css" %}"> + + {% block head %}{% endblock %} + {% if title %} + <title>{{ title }} - {{ site.title | safe }}</title> + {% else %} + <title>{{ site.title | safe }}</title> + {% endif %} + {% include "./meta.njk" %} - <link rel="shortcut icon" href="{{ "/assets/images/favicon.png" | url}}" type="image/png"> + <link rel="shortcut icon" href="{{ " /assets/images/favicon.png" | url}}" type="image/png"> </head> + <body> - <header> - <a href="{{"/" | url}}" class="logo"> - {{ "/assets/images/logo.svg" | embedSVG | safe }} - <h1>{{ site.title }}</h1> - </a> - <button id="menu-open" aria-label="Navmenu open" class="mobile-menu">[OPEN]</button> - {% include "nav.njk" %} - </header> - <main> - {% block content %}{% endblock %} - </main> + <header> + <a href="{{" /" | url}}" class="logo"> + {{ "/assets/images/logo.svg" | embedSVG | safe }} + <h1>{{ site.title }}</h1> + </a> + <button id="menu-open" aria-label="Navmenu open" class="mobile-menu">[OPEN]</button> + {% include "nav.njk" %} + </header> + <main> + {% block content %}{% endblock %} + </main> - <footer> - <div class="social"> - {%- for s in site.footerLinks -%} - <a no-transition href="{{ s.href }}" target="_blank">{{ s.name }}</a> - {%- endfor -%} - </div> - </footer> + <footer> + <div class="social"> + {%- for s in site.footerLinks -%} + <a no-transition href="{{ s.href }}" class="tooltip" target="_blank">{{ s.name }}<span class="tooltiptext">{{ + s.tooltip }}</span></a> + {%- endfor -%} + </div> + </footer> - <script src="{{ "/assets/js/main.js" | url}}"></script> - <script src="{% getBundleFileUrl "js" %}"></script> - <script defer src="{{ "/assets/js/lib/quicklink.umd.js" | url}}"></script> + <script src="{{ " /assets/js/main.js" | url}}"></script> + <script src="{% getBundleFileUrl "js" %}"></script> + <script defer src="{{ " /assets/js/lib/quicklink.umd.js" | url}}"></script> - <script> - window.addEventListener('load', () => { - quicklink.listen(); - }); - </script> + <script> + window.addEventListener('load', () => { + quicklink.listen(); + }); + </script> - <svg style="visibility:hidden;" width="0" height="0"> - <defs> - <filter id="transition" x="0%" y="0%" width="100%" height="100%"> - <feTurbulence id="noise" type="fractalNoise" baseFrequency="0.2 0" seed="0" result="NOISE" numOctaves="2"></feTurbulence> - <feDisplacementMap id="displacement" in="SourceGraphic" in2="NOISE" scale="0" xChannelSelector="A" yChannelSelector="R"></feDisplacementMap> - </filter> + <svg style="visibility:hidden;" width="0" height="0"> + <defs> + <filter id="transition" x="0%" y="0%" width="100%" height="100%"> + <feTurbulence id="noise" type="fractalNoise" baseFrequency="0.2 0" seed="0" result="NOISE" numOctaves="2"> + </feTurbulence> + <feDisplacementMap id="displacement" in="SourceGraphic" in2="NOISE" scale="0" xChannelSelector="A" + yChannelSelector="R"></feDisplacementMap> + </filter> - - <filter id="image-filter" bx:pinned="true" primitiveUnits="objectBoundingBox"> - <feTurbulence result="turbulence-1" baseFrequency="0.8 0.1" type="fractalNoise"></feTurbulence> - <feDisplacementMap result="displacement-map-0" in="SourceGraphic" in2="turbulence-1" scale="0.1" xChannelSelector="R" yChannelSelector="R"></feDisplacementMap> - </filter> - </defs> - </svg> - <script src="{{ "/assets/js/transitions.js" | url}}"></script> + <filter id="image-filter" bx:pinned="true" primitiveUnits="objectBoundingBox"> + <feTurbulence result="turbulence-1" baseFrequency="0.8 0.1" type="fractalNoise"></feTurbulence> + <feDisplacementMap result="displacement-map-0" in="SourceGraphic" in2="turbulence-1" scale="0.1" + xChannelSelector="R" yChannelSelector="R"></feDisplacementMap> + </filter> + + </defs> + </svg> + <script src="{{ " /assets/js/transitions.js" | url}}"></script> </body> -</html>
\ No newline at end of file + +</html> diff --git a/_includes/meta.njk b/_includes/meta.njk index 7d3fa8e..efecb0c 100644 --- a/_includes/meta.njk +++ b/_includes/meta.njk @@ -9,10 +9,10 @@ <meta name="twitter:title" content="{{ title }}" /> <meta name="twitter:description" content="{{ description }}" /> <meta name="twitter:card" content="summary_large_image"> -<meta name="twitter:image" content="{% ogImage "/../_includes/og-image.og.njk", { title: t, siteTitle:site.title } %}" /> +<meta name="twitter:image" content="{% ogImage "/../_includes/og-image.og.njk", { title: t, siteTitle:site.title | safe } %}" /> <meta name="twitter:image:width" content="1200"> <meta name="twitter:image:height" content="630"> -<meta property="og:image" content="{% ogImage "/../_includes/og-image.og.njk", { title: t, siteTitle:site.title } %}" /> +<meta property="og:image" content="{% ogImage "/../_includes/og-image.og.njk", { title: t, siteTitle:site.title | safe } %}" /> <meta property="og:image:width" content="1200"> <meta property="og:image:height" content="630"> -<meta property="og:image:type" content="image/png">
\ No newline at end of file +<meta property="og:image:type" content="image/png"> diff --git a/_includes/og-image.og.njk b/_includes/og-image.og.njk index ab4fbe2..7f3f7ad 100644 --- a/_includes/og-image.og.njk +++ b/_includes/og-image.og.njk @@ -25,7 +25,7 @@ </style> <div class="root"> - <div class="site">{{ siteTitle }}</div> + <div class="site">{{ siteTitle | safe }}</div> - <h1 class="title">{{ title }}</h1> -</div>
\ No newline at end of file + <h1 class="title">{{ title | safe }}</h1> +</div> diff --git a/_layouts/home.njk b/_layouts/home.njk index bafd7fe..897968d 100644 --- a/_layouts/home.njk +++ b/_layouts/home.njk @@ -1,10 +1,10 @@ {% extends "base.njk" %} {% block header %} -<h1>{{ title }}</h1> +<h1>{{ title | safe }}</h1> {% endblock %} {% block content %} HOME {{ content | safe }} -{% endblock %}
\ No newline at end of file +{% endblock %} diff --git a/_layouts/page.njk b/_layouts/page.njk index 3e1d403..52c8154 100644 --- a/_layouts/page.njk +++ b/_layouts/page.njk @@ -1,7 +1,7 @@ {% extends "base.njk" %} {% block header %} -<h1>{{ title }}</h1> +<h1>{{ title | safe }}</h1> {% endblock %} {% block content %} @@ -9,4 +9,4 @@ <div> {{ content | safe }} </div> -{% endblock %}
\ No newline at end of file +{% endblock %} diff --git a/_layouts/post.njk b/_layouts/post.njk index a36d28d..3eccafa 100644 --- a/_layouts/post.njk +++ b/_layouts/post.njk @@ -1,7 +1,7 @@ {% extends "base.njk" %} {% block header %} -<h1>{{ title }}</h1> +<h1>{{ title | safe }}</h1> {% endblock %} {% block content %} @@ -12,4 +12,4 @@ <div> {{ content | safe }} </div> -{% endblock %}
\ No newline at end of file +{% endblock %} diff --git a/assets/css/main.css b/assets/css/main.css index a51da84..4e4ab7d 100644 --- a/assets/css/main.css +++ b/assets/css/main.css @@ -11,7 +11,7 @@ a { color: var(--text); --brackets-color: var(--accent); padding: 0.2rem; - clip-path: polygon(0% 0,0% calc(100% - 0.2rem), 0.2rem 100%,100% 100%, 100% 0%); + /* clip-path: polygon(0% 0,0% calc(100% - 0.2rem), 0.2rem 100%,100% 100%, 100% 0%); */ border-radius: 0rem; text-decoration: none; position: relative; @@ -57,14 +57,32 @@ a[target="_blank"]::after { content: "}"; } +.tooltip { + position:relative; + display:inline-block; +} + +.tooltiptext { + visibility: hidden; + color: var(--base); + background: var(--text); + text-align: center; + position: absolute; + z-index: 1; + top: 100%; + left: 50%; + margin-left: -50%; +} +.tooltip:hover .tooltiptext { + visibility: visible; +} a.active, a:focus, a:hover { + background: var(--text); color: var(--base); --brackets-color: var(--base-3); - clip-path: polygon(0% 0,0% calc(100% - 0.4rem), 0.4rem 100%,100% 100%, 100% 0%); - background-color: var(--text); } header { @@ -236,4 +254,4 @@ picture img { display: block; padding: 0.5rem; } -}
\ No newline at end of file +} diff --git a/content/blog/cbin.md b/content/blog/cbin.md new file mode 100644 index 0000000..3dbd1a3 --- /dev/null +++ b/content/blog/cbin.md @@ -0,0 +1,14 @@ +--- +title: Made a Pastebin site :P +keywords: pastebin bin paste cbin +--- + +These past few days I've spent my time working on a project called CBin, along with my friend Jan Palma (who made the frontend). It is a pastebin server written in C (if you couldn't tell) + +It takes text, stores it in memory, and hands it back when asked. No accounts, no fluff, no "yeah stick this OAuth up your ass or fuck off". + +It runs entirely in-memory with FIFO eviction (sadly kind of slow, but fast enough to where it's unnoticable), meaning old pastes get yeeted off the face of the earth when things get full. + +The frontend lives in a separate universe (HTML/Typescript/CSS), maintained by Jan Palma, because I have no will to make a frontend myself (shit would look straight out of 1998) + +Overall, CBin is fast (fast enough), small, and mildly feral. It does one job, doesn't apologize for anything, and will absolutely forget your data if you blink wrong, or I get a power outage for more than a day. Not exactly the most memory safe but whatever. It's good enough to where if you aren't actively trying, you won't even notice. diff --git a/content/blog/pipedals.md b/content/blog/pipedals.md new file mode 100644 index 0000000..3136e3d --- /dev/null +++ b/content/blog/pipedals.md @@ -0,0 +1,59 @@ +--- +title: Dead simple digital guitar pedals in C +keywords: guitar pedal c simple +--- + +There's something I hate about the entire "professional digital audio workstation ecosystem", it's the complexity. + +Now I get why its so complex, it's for user simplicity. But I'm a programmer, I love tinkering, and I especially like simplicity in developing. + +Simplicity kind of fights the whole idea of VST plugins (or similar things). They have big SDKs that require you to conform to it's philosophies and all that bullshit. + +So I just replaced the entire workflow with this: + +`arecord | weird little C pedal programs | aplay` + +And somehow it just works. It just builds on Unix philosophies of making simple and transparent software, as well as using pipes and simple Linux tools (`aplay`, `arecord`) + +Each little pedal works something like this: (C pseudocode) + +```c +int main(int argc, char *argv[]) { + init_arg(argc,argv); // Sets CLI arguments for a pedal once. + while (1) { + size_t n = fread(in_i16, sizeof(int16_t), BLOCK_SIZE, stdin); // read raw data from arecord or previous pedal + if (n == 0) break; // abort if no data received + /* Convert i16 to float */ + effect(in_f, out_f, n); // run the effect for the current block of data + /* Make sure output isn't too loud and convert back to i16 */ + fwrite(out_i16, sizeof(int16_t), n, stdout); // write raw data to next pedal or aplay + } +} +``` + +And a pedal looks something like this: + +```c +static float gain; + +void init_arg(int argc, char **argv) { + if (argc != 1) // Validate argument count + error("Invalid arguments", "Usage: boost <gain>"); + gain = atof(argv[0]); // Store argument once (arguments starts at 0, check the source code i dare you) +} + +// Very simple gain pedal +void effect(const float *in, float *out, int n) { + for (int i = 0; i < n; i++) { + out[i] = in[i] * gain; // this is where math is done, most pedals should be a little more complex than this. + } +} +``` + +That's it. Just a small set of small programs to be chained together to produce cool guitar effects. + +There's also a little helper CLI which keeps you from entering the wrong parameters into arecord and aplay. + +Anyways that's basically it for this post. E-mail me patches [Guide](https://git.spelis.li/#patches) for new cool pedals or bugfixes. + +Some of the code is admittedly a little cursed, but honestly if the signal goes in and comes back out sounding cooler, I consider that a success. diff --git a/content/error.njk b/content/error.njk deleted file mode 100644 index 61c45d5..0000000 --- a/content/error.njk +++ /dev/null @@ -1,76 +0,0 @@ -<h1 id="error-code">Error</h1> -<img src="" id="error-image" style="width: 100%;"> - -<script> - const params = new URLSearchParams(window.location.search) - const code = params.get("code") || "404" - - // yes, i typed these out manually. - const messages = { - 400: "Bad request", - 401: "Unauthorized", - 402: "Payment required", - 403: "Forbidden", - 404: "Not found", - 405: "Method not allowed", - 406: "Not acceptable", - 407: "Proxy authentication required", - 408: "Request timeout", - 409: "Conflict", - 410: "Gone", - 411: "Length required", - 412: "Precondition failed", - 413: "Payload too large", - 414: "Request-URI too long", - 415: "Unsupported media type", - 416: "Request range not satisfiable", - 417: "Expectation failed", - 418: "I'm a teapot", - 419: "Page expired", - 420: "Enhance your calm", - 421: "Misdirected request", - 422: "Unprocessable entity", - 423: "Locked", - 424: "Failed dependency", - 425: "Too early", - 426: "Upgrade required", - 428: "Precondition Required", - 429: "Too many requests", - 431: "Request header fields too large", - 444: "No response", - 450: "Blocked by windows parental controls", - 451: "Unavailable for legal reasons", - 495: "SSL certificate error", - 496: "SSL certificate required", - 497: "HTTP request sent to HTTPS port", - 498: "Token expired/invalid", - 499: "Client closed request", - - - 500: "Internal server error", - 501: "Not implemented", - 502: "Bad gateway", - 503: "Service unavailable", - 504: "Gateway timeout", - 506: "Variant also negotiates", - 507: "Insufficient storage", - 508: "Loop detected", - 509: "Bandwidth limit exceeded", - 510: "Not extended", - 511: "Network authentication required", - 521: "Web server is down", - 522: "Connection timed out", - 523: "Origin is unreachable", - 525: "SSL handshake failed", - 530: "Site frozen", - 599: "Network connect timeout error" - } - - document.getElementById("error-code").textContent = "Error " + code + " - " + (messages[code] || "Unexpected error") - const host = Math.random() < 0.5 ? "cat" : "dog"; - const url = host === "dog" - ? `https://http.dog/${code}.jpg` - : `https://http.cat/${code}`; - - document.getElementById("error-image").src = url; -</script> diff --git a/content/extras.md b/content/extras.md new file mode 100644 index 0000000..2043a71 --- /dev/null +++ b/content/extras.md @@ -0,0 +1,9 @@ +--- +title: Extras +layout: page +nav: 19 +--- + +[CBin](https://paste.spelis.li/) +[CGit](https://git.spelis.li/) +[File Share](https://share.spelis.li/) diff --git a/content/index.md b/content/index.md index 3e41358..b8f6b69 100644 --- a/content/index.md +++ b/content/index.md @@ -1,10 +1,20 @@ --- -title: "Home" +title: "Hey, I'm Spelis!" --- -Hey, I'm Spelis! +<!-- I write software and games mainly in **C**, **Python**, and **Java**. Most of what I build lands somewhere between backend systems, low-level programming, and game development. --> +<!----> +<!-- I care a lot about performance, simplicity, and understanding how things work under the hood. A lot of what I do is learning by building, breaking, and refining things as I go; usually with a few questionable decisions along the way. --> -I write software mainly in **C**, **Python** and **Java**. Currently learning **Zig**. +I'm a student from Sweden with a passion for writing simple code and playing bass guitar. Right now I mostly practice playing my favorite songs and writing the code that i like writing. + +### Knowledge + +* C + * Raylib +* Java + * FabricMC mods + * PaperMC plugins --- diff --git a/public/site.json b/public/site.json index 70517fe..b428dad 100644 --- a/public/site.json +++ b/public/site.json @@ -4,8 +4,8 @@ "description": "My personal portfolio", "categories": ["Developer","Portfolio"], "refs": [ - "stefan.projnull.eu", - "janpalma.cz", - "projnull.eu" + "projnull.eu", + "git.spelis.li", + "share.spelis.li" ] } diff --git a/siteconfig.mjs b/siteconfig.mjs index 0028867..3dccd21 100644 --- a/siteconfig.mjs +++ b/siteconfig.mjs @@ -3,14 +3,14 @@ export const config = { footerLinks: [ - {name: "Github", href:"https://github.com/spelis/"}, - {name: "YouTube", href:"https://www.youtube.com/@Spelis"}, - {name: "E-Mail", href:"mailto:spelis.tech@gmail.com"}, + {name: "Github", tooltip: "@Spelis", href:"https://github.com/spelis/"}, + {name: "YouTube", tooltip: "@Spelis", href:"https://www.youtube.com/@Spelis"}, + {name: "E-Mail", tooltip:"spelis@spelis.li", href:"mailto:spelis@spelis.li"}, + {name: "BlueSky", tooltip:"@spelis.li", href:"https://bsky.app/profile/spelis.li"}, ], headerLinks: [ - {name: "Skolmaten", href:"https://spelis.projnull.eu/skolmaten/"}, - {name: "Git", href:"https://git.spelis.projnull.eu/"}, - {name: "Files", href:"https://share.spelis.projnull.eu/"}, + {name: "Git", href:"https://git.spelis.li/"}, + {name: "Paste", href:"https://paste.spelis.li/"}, ] } |
