summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.cache/eleventy-fetch-1fc116fe93737d8c4d05b10967cad11
-rw-r--r--.cache/eleventy-fetch-1fc116fe93737d8c4d05b10967cad1.bufferbin0 -> 289838 bytes
-rw-r--r--_includes/base.njk121
-rw-r--r--_includes/meta.njk6
-rw-r--r--_includes/og-image.og.njk6
-rw-r--r--_layouts/home.njk4
-rw-r--r--_layouts/page.njk4
-rw-r--r--_layouts/post.njk4
-rw-r--r--assets/css/main.css26
-rw-r--r--content/blog/cbin.md14
-rw-r--r--content/blog/pipedals.md59
-rw-r--r--content/error.njk76
-rw-r--r--content/extras.md9
-rw-r--r--content/index.md16
-rw-r--r--public/site.json6
-rw-r--r--siteconfig.mjs12
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
new file mode 100644
index 0000000..061825a
--- /dev/null
+++ b/.cache/eleventy-fetch-1fc116fe93737d8c4d05b10967cad1.buffer
Binary files differ
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/"},
]
}