Compare commits

..

11 Commits

31 changed files with 391 additions and 780 deletions

View File

@@ -3,6 +3,7 @@
title, title,
date = "", // date posted date = "", // date posted
dateUpdated = "", dateUpdated = "",
dateIndeterminate = "", // raw date without an explanation marker next to it
subtitle = "", subtitle = "",
banner = "", banner = "",
bannerAlt = "", bannerAlt = "",
@@ -12,6 +13,7 @@
title: string; title: string;
date?: string; date?: string;
dateUpdated?: string; dateUpdated?: string;
dateIndeterminate?: string;
subtitle?: string; subtitle?: string;
banner?: string; banner?: string;
bannerAlt?: string; bannerAlt?: string;
@@ -36,9 +38,14 @@
</div> </div>
{/if} {/if}
</div> </div>
{#if date} {#if date || dateIndeterminate}
<div class="date-container"> <div class="date-container">
<p class="date">posted :: {date}</p> {#if dateIndeterminate}
<p class="date">:: {dateIndeterminate}</p>
{/if}
{#if date}
<p class="date">posted :: {date}</p>
{/if}
{#if dateUpdated} {#if dateUpdated}
<p class="date">last updated :: {dateUpdated}</p> <p class="date">last updated :: {dateUpdated}</p>
{/if} {/if}

View File

@@ -1,6 +1,7 @@
<script lang="ts"> <script lang="ts">
let y: number; let y: number;
// TODO change out for <a href="#top"/>
function scrollToTop() { function scrollToTop() {
document.documentElement.scrollTop = 0; document.documentElement.scrollTop = 0;
} }

View File

@@ -122,9 +122,9 @@
line-height: 2.0rem; line-height: 2.0rem;
} }
.gallery-container:hover .gallery-img, .gallery-container:hover .gallery-img-placeholder { /* .gallery-container:hover .gallery-img, .gallery-container:hover .gallery-img-placeholder {
width: 260px; width: 260px;
} } */
.gallery-container:hover .gallery-text-container { .gallery-container:hover .gallery-text-container {
grid-template-rows: 0fr 1fr 1fr; grid-template-rows: 0fr 1fr 1fr;

View File

@@ -27,7 +27,6 @@
<a href="/projects">Projects</a> <a href="/projects">Projects</a>
<a class="link-level-2" href="/projects/projectn5">Homesick</a> <a class="link-level-2" href="/projects/projectn5">Homesick</a>
<a href="/blog">Blog</a> <a href="/blog">Blog</a>
<a href="/feed">Art Feed</a>
</div> </div>
<div class="content-box"> <div class="content-box">
<h6>Meta</h6> <h6>Meta</h6>

View File

@@ -2,7 +2,6 @@
<a href="/">home</a> <a href="/">home</a>
<a href="/projects">projects</a> <a href="/projects">projects</a>
<a href="/blog">blog</a> <a href="/blog">blog</a>
<a href="/feed">art_feed</a>
<a href="/meta/about">about</a> <a href="/meta/about">about</a>
{/snippet} {/snippet}

View File

@@ -47,11 +47,11 @@
link: "projects/projectn5", link: "projects/projectn5",
}, },
{ {
title: "Art Feed", title: "Projects",
description: "<b>[major update]</b> My creative side lives here", description: "<b>[updated]</b> An overview of all my projects!",
img: "feed/banner.webp", img: "projects/banner.webp",
altText: "A rainbow-like holographic effect produced by bending a reflective sheet of cardboard.", altText: "An upside-down New 3DS XL lying open on a desk with a small USB-C breakout board attached to it, and a USB-C cable plugged in. The 3DS is glowing to indicate that it is charging.",
link: "feed", link: "projects",
}, },
]; ];
@@ -63,13 +63,6 @@
altText: "View at a tram bridge rising and then curving to the left.", altText: "View at a tram bridge rising and then curving to the left.",
link: "blog", link: "blog",
}, },
{
title: "Projects",
description: "An overview of my more technical projects",
img: "projects/banner.webp",
altText: "An upside-down New 3DS XL lying open on a desk with a small USB-C breakout board attached to it, and a USB-C cable plugged in. The 3DS is glowing to indicate that it is charging.",
link: "projects",
},
{ {
title: "Files", title: "Files",
description: "Find things I've put for download on my Copyparty instance", description: "Find things I've put for download on my Copyparty instance",

View File

@@ -1,39 +0,0 @@
<script lang="ts">
import Banner2 from "$lib/banner2.svelte";
import Content from "$lib/viewport/content.svelte";
import GalleryRow, { type GalleryRowEntry } from "$lib/lists/gallery-row.svelte";
const subpages: GalleryRowEntry[] = [
{
title: "Drawing Gallery",
description: "Some cool things I've drawn!",
img: "drawings/banner.webp",
altText: "Several Faber-Castell Polychromos colour pencils lined up with markings next to them in the same colour on a sheet of paper.",
link: "drawings",
},
{
title: "Discography",
description: "Small stories about my past music",
img: "/main/hypertext.webp",
altText: "",
link: "music",
},
];
</script>
<svelte:head>
<title>Art | denizk0461</title>
</svelte:head>
<Content>
<Banner2
title="Art"
banner="banner.webp"
bannerAlt="A rainbow-like holographic effect produced by bending a reflective sheet of cardboard."
subtitle="my creative side" />
<p>Here I have collected the products of some of my creative endeavours. Check them out below!</p>
<GalleryRow entries={subpages} />
</Content>

View File

@@ -1,32 +0,0 @@
<p class="lightyears-text">The world looks so different now. The world looks so different now. The world looks so different now.</p>
## Background
One of my favourite music artists, [Jaron](https://youtu.be/GXvqQ5-P82I), released his album LIGHTYEARS a little over a year ago. For his visuals, he uses a variety of symbols in place of Latin letters, and there's a converter on [his website](https://jaronsteele.com/) too. Only problem is that my browser can't seem to display most of the characters because the characters aren't included in most fonts.
That's why I made a font! It allows you to type Latin characters from `A-Z` as well as numbers `0-9` and `!?` in the LIGHTYEARS style. Like this:
<p class="lightyears-text">trans rights!</p>
The font exclusively uses characters from the Noto font family. Many of the Noto varieties have been stitched together to recreate the whole LIGHTYEARS alphabet.
To create the font, I used [FontForge](https://fontforge.org). Finding this tool was both a blessing and a curse, as it was exactly what I needed, but it kept. crashing. all. the. time. I tried both the AppImage as well as the release on `dnf` and both had the same issues. I managed to make it work, but it took a lot of patience. Eventually I figured out that importing Noto Maths gave me a 3-8 second window before the editor crashed. The project file would forget the imported font, but if I had copied any glyphs it would keep those.
## Download & use
[Download the font here](https://files.natconf.dev/public/lightyears.woff2). It's in the web-optimised `woff2` format and has most characters stripped to minimise its file size it's less than 20 kilobytes in size! Uppercase and lowercase letters are the same.
For use on your website, put the font into your resources/static/similar folder and then add this block of code to your CSS file:
<pre class="code-block">
@font-face &#123;
font-family: "LIGHTYEARS";
src: url("/fonts/lightyears.woff2");
font-weight: 400;
font-style: normal;
}
</pre>
Then you can change any element's font by setting `font-family: 'LIGHTYEARS', sans-serif;`. Because it's the Latin characters and Arabic numbers that have been changed, you can type text in regular English and people can 'decrypt' the messages by copy-pasting the text somewhere else!
You do **not** need Jaron's converter to type stylised text! The converter returns the actual symbols from other scripts, whereas this font only changes how letters look.

View File

@@ -30,7 +30,10 @@ export enum BlogPostTag {
NULL = "all", // placeholder when a 'no tag' is needed. if in doubt, do not use this NULL = "all", // placeholder when a 'no tag' is needed. if in doubt, do not use this
ART = "art-stuff", // ramblings to do with art ART = "art-stuff", // ramblings to do with art
DRAWING = "drawing", // self-explanatory DRAWING = "drawing", // self-explanatory
IMADETHIS = "i-made-this", // stuff i made
// not used because of the new projects page serving this exact purpose
// IMADETHIS = "i-made-this", // stuff i made
META = "natconf-meta", // about the website itself META = "natconf-meta", // about the website itself
RANT = "rant", // self-explanatory RANT = "rant", // self-explanatory
TECH_TIP = "tech-tip", // tech guides TECH_TIP = "tech-tip", // tech guides
@@ -80,20 +83,6 @@ export const posts: BlogPostLink[] = [
], ],
} }
}, },
{
key: "2026/0325",
post: {
date: "2026-03-25",
time: "22:22",
banner: "banner.webp",
bannerAlt: "A sunset captured from an Autobahn exit.",
title: "I made a LIGHTYEARS font",
description: "I feel electric and it's only getting brighter!",
tags: [
BlogPostTag.IMADETHIS,
],
}
},
{ {
key: "2026/0317", key: "2026/0317",
post: { post: {
@@ -151,7 +140,6 @@ export const posts: BlogPostLink[] = [
tags: [ tags: [
BlogPostTag.ART, BlogPostTag.ART,
BlogPostTag.DRAWING, BlogPostTag.DRAWING,
BlogPostTag.IMADETHIS,
], ],
} }
}, },
@@ -181,7 +169,6 @@ export const posts: BlogPostLink[] = [
tags: [ tags: [
BlogPostTag.ART, BlogPostTag.ART,
BlogPostTag.DRAWING, BlogPostTag.DRAWING,
BlogPostTag.IMADETHIS,
], ],
} }
}, },

View File

@@ -1,123 +0,0 @@
<script lang="ts">
import Content from "$lib/viewport/content.svelte";
import Banner2 from "$lib/banner2.svelte";
import TableOfContents from "$lib/components/table-of-contents.svelte";
export let data;
</script>
<svelte:head>
<title>Art Feed | denizk0461</title>
</svelte:head>
{#snippet pageButtons(currentIndex: number)}
<div class="page-button-container blurred-background">
{#if currentIndex == 1}
<p class="page-button page-button-left">x</p>
{:else}
<a class="page-button page-button-left page-button-clickable" href="?p={currentIndex - 1}">&lt;</a>
{/if}
{#each { length: data.maxPages }, index}
<a class="page-index" href="?p={index + 1}">{index + 1}</a>
{/each}
{#if currentIndex == data.maxPages}
<p class="page-button page-button-right">x</p>
{:else}
<a class="page-button page-button-right page-button-clickable" href="?p={currentIndex + 1}">&gt;</a>
{/if}
</div>
{/snippet}
<Content>
<Banner2
title="Art & Project Feed"
banner="banner.webp"
bannerAlt="Mirror picture of me, pixelated beyond recognition"
subtitle="subtitle missing"
/>
{@render pageButtons(data.currentPage)}
<p>Welcome to my (new) art feed! It is heavily inspired by <a href="https://deathsurplus.com/">DeathSurplus' art blog</a> definitely go check out his page!</p>
<p>This page is intended to offer a shared space for all my projects without the need to create strictly-separated pages for each hobby. Some other pages on this website have been merged into this one; namely the "Small Projects" and "Drawing Gallery" pages, so don't be surprised if content from those pages shows up here.</p>
<p>I'll add some more of my past projects, new projects, and an option to filter by project type <i>soon™</i>. Maybe I'll also split the content into pages, if I ever figure out how to do that.</p>
<p>I <b>MAY</b> merge this with the <a href="/projects">Projects</a> page, I've not yet decided.</p>
<TableOfContents />
{#each data.feedEntries as entry}
<h2>{entry.title}</h2>
<p class="subtitle">{entry.subtitle}</p>
<p class="subtitle">{entry.date}</p>
<svelte:component this={entry.content} />
{/each}
</Content>
<style>
.page-button-container {
display: flex;
flex-direction: row;
align-items: stretch;
justify-content: center;
border-radius: var(--border-radius);
overflow: hidden;
width: fit-content;
margin: 12px auto;
border-top: var(--border-style) var(--border-dash-size) var(--color-highlight-alt);
border-bottom: var(--border-style) var(--border-dash-size) var(--color-highlight-alt);
}
.page-button, .page-index {
font-family: var(--font-mono);
padding: 8px 18px;
font-weight: 600;
margin: 0;
transition: background-color var(--duration-animation) var(--anim-curve);
}
.page-button {
color: var(--color-text);
}
.page-button-left {
border-right: var(--border-style) var(--border-dash-size) var(--color-highlight-alt);
}
.page-button-right {
border-left: var(--border-style) var(--border-dash-size) var(--color-highlight-alt);
}
.page-button-clickable:hover {
cursor: pointer;
}
.page-index:link, .page-index:visited {
color: var(--color-text)
}
.page-index:hover, .page-button-clickable:hover {
text-decoration: none;
background-color: var(--color-background-highlight-alt);
}
.subtitle {
font-family: var(--font-mono);
margin: 0;
font-size: 1rem;
line-height: 1.4rem;
font-style: italic;
font-weight: 700;
color: var(--color-highlight-alt);
}
.subtitle::before {
content: "<!-- ";
}
.subtitle::after {
content: " -->";
}
</style>

View File

@@ -1,50 +0,0 @@
import { entries } from './feed';
interface FeedEntry {
content: any;
title: string;
subtitle: string;
date: string;
}
let entriesPerPage = 8;
export async function load({ params, url }) {
// Get page index
let pageIndex = Number(url.searchParams.get('p'));
if (pageIndex == 0) {
pageIndex = 1;
}
// TODO check if index exceeds maximum permitted and redirect (to max page?)
let feedEntries: FeedEntry[] = [];
let start = (pageIndex - 1) * entriesPerPage;
for (let i = start; i < start + entriesPerPage; i += 1) {
// Stop iterating when end reached
if (i >= entries.length) {
break;
}
// Vite complains if I don't do this even though it's stupid
const path = entries[i].split("/");
const page = await import(`./${path[0]}/${path[1]}.md`);
const md = page.metadata;
feedEntries.push({
content: page.default,
title: md.title,
subtitle: md.subtitle,
date: md.date,
});
}
let currentPage = pageIndex;
let maxPages = Math.ceil(entries.length / entriesPerPage);
return {
currentPage,
maxPages,
feedEntries,
};
}

View File

@@ -1,8 +0,0 @@
export let entries: string[] = [
// 2026
"misc/lightyears-font",
"drawings/firstmonth",
// 2024
"electronics/3ds-usb-c",
"electronics/deej0461",
];

View File

@@ -36,33 +36,13 @@
bannerAlt="An upside-down New 3DS XL lying open on a desk with a small USB-C breakout board attached to it, and a USB-C cable plugged in. The 3DS is glowing to indicate that it is charging." bannerAlt="An upside-down New 3DS XL lying open on a desk with a small USB-C breakout board attached to it, and a USB-C cable plugged in. The 3DS is glowing to indicate that it is charging."
subtitle="Things I have worked on" /> subtitle="Things I have worked on" />
<!-- <p>Welcome to my projects page! Here I show off all the things I have done. Projects are ordered by general topic, sorted reverse-chronologically, and have a status marker assigned that shows whether they are active or not. have fun browsing~!</p> --> <p>Welcome to my (new) projects page! Here I show off all the things I have done. Projects are ordered reverse-chronologically and have some other neat information displayed. have fun browsing~!</p>
<!-- <p>The projects page also has two sister pages that go into detail about specific subgroups of projects:</p> <p>This page, in its current form, is inspired by <a href="https://deathsurplus.com/">DeathSurplus' art blog</a> definitely go check out his website!</p>
<GalleryRow entries={subpages} /> --> <p>I'll add some more of my past projects, new projects, and an option to filter by project type <i>soon™</i>. Maybe I'll also split the content into pages.</p>
<!-- <TableOfContents /> --> <hr>
<!-- <h2 id="games">Games</h2>
{#each games as project}
{@render projectSummary({ project: project })}
{/each}
<h2 id="hardware">Hardware</h2>
{#each hardware as project}
{@render projectSummary({ project: project })}
{/each}
<h2 id="apps">Apps</h2>
{#each apps as project}
{@render projectSummary({ project: project })}
{/each}
<h2 id="music">Music</h2>
{#each music as project}
{@render projectSummary({ project: project })}
{/each} -->
<div class="project-container"> <div class="project-container">
{#each projects as p} {#each projects as p}
@@ -72,7 +52,21 @@
</Content> </Content>
{#snippet project(p: Project)} {#snippet project(p: Project)}
<a href="{p.category}/{p.id}">{p.title}</a> {#if p.directLink}
<a class="project-wrapper" href={p.directLink}>
{@render projectContent(p)}
</a>
{:else}
<a class="project-wrapper" href="{p.category}/{p.id}">
{@render projectContent(p)}
</a>
{/if}
{/snippet}
{#snippet projectContent(p: Project)}
<p>{p.title}</p>
<p>{p.subtitle}</p>
<p>{p.date}</p>
{/snippet} {/snippet}
<!-- {#snippet projectSummary({ <!-- {#snippet projectSummary({
@@ -109,7 +103,18 @@
<style> <style>
.project-container { .project-container {
display: grid; display: grid;
grid-template-columns: 1fr 1fr; /* grid-template-columns: 1fr 1fr; */
grid-template-columns: 1fr;
}
.project-wrapper {
display: flex;
flex-direction: column;
/* gap: 4px; */
}
.project-wrapper p {
margin: 0;
} }
/* .project-subtitle { /* .project-subtitle {

View File

@@ -16,7 +16,7 @@
<Banner2 <Banner2
title="{data.projectDetails.title}" title="{data.projectDetails.title}"
subtitle="{data.projectDetails.subtitle}" subtitle="{data.projectDetails.subtitle}"
date="{data.projectDetails.date}" dateIndeterminate="{data.projectDetails.date}"
dateUpdated="{data.projectDetails.dateUpdated}" dateUpdated="{data.projectDetails.dateUpdated}"
banner="{data.projectDetails.banner}" banner="{data.projectDetails.banner}"
bannerAlt="{data.projectDetails.bannerAlt}" bannerAlt="{data.projectDetails.bannerAlt}"
@@ -24,6 +24,40 @@
<!-- <TableOfContents /> --> <!-- <TableOfContents /> -->
{#if data.projectDetails.links.length > 0}
<div class="link-button-container">
{#each data.projectDetails.links as l}
<a class="link-button blurred-background" href={l.link}>{@html l.text}</a>
{/each}
</div>
{/if}
<svelte:component this={data.content} /> <svelte:component this={data.content} />
</Content> </Content>
<style>
.link-button-container {
display: flex;
flex-direction: row;
flex-wrap: wrap;
gap: 8px;
margin-top: 12px;
}
.link-button {
color: var(--color-text);
padding: 4px 12px;
margin: 0;
border-top: var(--border-style) var(--border-dash-size) var(--color-highlight-alt);
border-bottom: var(--border-style) var(--border-dash-size) var(--color-highlight-alt);
border-radius: var(--border-radius);
transition: background-color var(--duration-animation) var(--anim-curve);
}
.link-button:hover {
text-decoration: none;
background-color: var(--color-background-highlight-alt);
}
</style>

View File

@@ -0,0 +1,7 @@
**AvH-Vertretungsplan** was an app I developed back in 2019 to view the substitution plan of my school more easily, since I disliked the disorganised design of the school's website. The substitution app allowed me to be more quickly informed about my courses, as it notified me about any cancellations and changes in my schedule. It also allowed me to view the canteen offers, even though I'd never eaten at the school's canteen.
The app was initially developed in Java and later converted into Kotlin as part of my Kotlin learning effort. The backend of the app, since the school website required a login to view the substitution plan, ran on a Raspberry Pi 3B using a Python script that scraped the website using Selenium and sent out notifications via Firebase. The Raspberry Pi crashed frequently and the script was not perfect, requiring me to frequently remote into the Pi using VNC, often while I was at school, to edit the script!
Since the app was written for native Android but a few of my classmates had iPhones, I had an iOS version in the works, which was developed entirely on a MacOS VM running on my laptop and debugged using an iPhone simulator in Xcode. The app achieved feature parity with the Android version at one point, but since I lacked funding to pay the $99-a-year fee Apple charges developers, it was never published and thus abandoned.
This app was genuinely one of my most fun projects, not only serving me as a handy tool, but also being a great playground for my programming practice, since it taught me to build UIs, use databases, and more. The app had been downloaded by 250 other students at my school, which I was and still am very proud of.

View File

@@ -0,0 +1,5 @@
**Qwark** was an app I used to track relevant information for my time at gymnasium. Initially, it was only meant to track my grades in exams and whatnot, but its capabilities grew to calculate my report card grades and my final grade once I graduated. It was also able to keep simple notes which could be checked off to mark them as done, and it also had a built-in counter I used during lessons to track how often I raised my hand and how often I verbally contributed to classes! A discipline I severely struggled in.
The app was named after Captain Qwark, the clumsy hero figure from the Ratchet & Clank series who never really gets his affairs in order. I suppose this referenced me personally more so than the app, since I was the one who needed help with tracking relevant information a task for which the app proved very helpful!
The app reached EOL when I graduated from gymnasium, since I had no use for it anymore, and I never made it available to anyone else either.

View File

@@ -0,0 +1,3 @@
In the pursuit of finding a simple app on the Play Store that would allow me to put any kind of text on my home screen, I failed, and all I could find were ad-ridden monstrosities, overfilled with features. To fulfil my own requirements, I developed **Text Basic**, which does exactly one thing: put a text on your home screen. Upon user request, the app has grown minimally since, now allowing for text customisation (text font, text size, background style, colours) and a rotation of texts to display.
Surprisingly, the app garnered quite a signficant user base of >2.000 people, many of whom were sending me bug reports, and some even contributing ideas. Many were also frustrated that the text widgets changed... not understanding how the app works. It was taken down from the Play Store at the same time as [WeserPlaner](/projects/apps/weserplaner).

View File

@@ -0,0 +1,5 @@
**WeserPlaner** is an app I developed to more easily view relevant information during my studies at the University of Bremen. It can download the user's timetable from the university's learning platform Stud.IP, and it can download the menus for all canteens managed by the Studierendenwerk Bremen, allowing the user to filter for dietary preferences as well as hiding items containing substances they are allergic against.
In developing this app, I took heavy inspiration from an earlier project of mine, [AvH-Vertretungsplan](/projects/apps/avhplan), which was an app I developed for a school I used to attend, in order to view the substitution plan as well as the canteen offers more easily. Quite similar!
I stopped work on the app in favour of other projects, notably because I had no significant plans for it. The app was taken down from the Google Play Store after I refused to comply with their new developer guidelines, requiring me to publish my home address (what the actual fuck Google?), and after the Studierendenwerk Bremen updated their page around the start of 2025, the app became nonfunctional.

View File

@@ -2,7 +2,7 @@
import ImageGallery from "$lib/lists/image-gallery.svelte"; import ImageGallery from "$lib/lists/image-gallery.svelte";
</script> </script>
Back in January, I was thinking to myself that I'd really like to learn to draw. It would have some practical benefits like potentially being able to draw concept art for my game, but ultimately I just liked the idea of drawing as a hobby. I doodled a few small things before deciding that I should challenge myself to draw something every single day for an entire month (4 weeks); [I documented the entire thing here](/blog/2026/0205), but spoiler alert: I think I succeeded in learning to draw and I am now able to sketch like I was never able to before! Back in January, I was thinking to myself that I'd really like to learn to draw. It would have some practical benefits like potentially being able to draw concept art for my game, but ultimately I just liked the idea of drawing as a hobby. I doodled a few small things before deciding that I should challenge myself to draw something every single day for an entire month (4 weeks); I documented the entire thing, but spoiler alert: I think I succeeded in learning to draw and I am now able to sketch things I was never able to before!
Here are some of my favourite drawings from around that time, in chronological order: Here are some of my favourite drawings from around that time, in chronological order:

View File

@@ -0,0 +1,3 @@
**Magician** is a clone of the card game *Wizard*. I've made it primarily to play with friends, but it's also a test for programming client-server multiplayer games. The clients are programmed in Godot, the server in Python, and they communicate via TCP/IP websockets. The game works with 3 to 6 players.
As the corresponding server is not currently online, the game is unplayable, but you can view the game below.

View File

@@ -0,0 +1,3 @@
Two friends of mine and I worked together on a multiplayer game where you can throw magical artifacts at one another. It was developed using the Godot Engine. The game featured multiple character classes utilising artifacts such as fire, ice, black/white holes, wind, and teleports, and also had a money collecting mechanic. Player profile saving and character customisation were available, and there was an array of maps available to play on. Up to four players were supported.
The project is currently on hold as of May 2025.

View File

@@ -0,0 +1,5 @@
**Swords & Stuff** (working title) was an RPG inspired by Dragon Quest IX. Traverse the world with a party of up to 4 characters, each with their individual equiment, skills, and vocations, and fight monsters to gain experience!
This game was my first shot at 2D Unity development, which had proven quite fun, but also a little cumbersome at times. Unfortunately, I will not continue the project in its current form, since even though I don't expect to earn any money from my games, let alone publish them on a commercial platform, Unity's TOS changes in mid-2023 made me reconsider my decision to use the platform and I hence abandoned the project. I used this opportunity to learn to use Godot, which I will use for my future projects.
A working, but very early-in-development version of the game is still up on this website. It features a test overworld in which you can move the cast of four characters: Player1, fraxiom64, proudrat, and Grampa Simpson. The enemies, trolldads, chase you and take you into a battle scene that has a functioning queue, but no damage and health mechanics. You can flee battles. Don't open the inventory you cannot escape it.

View File

@@ -0,0 +1,3 @@
**Totally Accurate Dating Simulator** is, as the name suggests, a series of particularly realistic dating simulator experiences. Dive into a world of romance as you meet your matches, curious and disappointing. Who will you meet? Will it be someone your type? That's subjective, and the computer will not even slightly attempt to match you with someone suitable. Prepare yourself for matches that are rarely described with "intriguing" and much more frequently with "funny." Discover which of the 28 endings will determine your fate, and lower your expectations. Significantly.
One of these days, I'll make a TADS 3 with 3D characters and an actual matchmaking mechanic. One day...

View File

@@ -1,7 +1,32 @@
<p class="lightyears-text">The world looks so different now. The world looks so different now. The world looks so different now.</p> <p class="lightyears-text">The world looks so different now. The world looks so different now. The world looks so different now.</p>
One of my favourite music artists, [Jaron](https://youtu.be/GXvqQ5-P82I), released his album LIGHTYEARS a little over a year ago. For his visuals, he uses a variety of symbols in place of Latin letters, and there's a converter on [his website](https://jaronsteele.com/) too. Only problem is that my browser can't seem to display most of the characters because the characters aren't included in most fonts. That's why I made a font! It allows you to type Latin characters from `A-Z` as well as numbers `0-9` and `!?` in the LIGHTYEARS style. Like this: ## Background
One of my favourite music artists, [Jaron](https://youtu.be/GXvqQ5-P82I), released his album LIGHTYEARS a little over a year ago. For his visuals, he uses a variety of symbols in place of Latin letters, and there's a converter on [his website](https://jaronsteele.com/) too. Only problem is that my browser can't seem to display most of the characters because the characters aren't included in most fonts.
That's why I made a font! It allows you to type Latin characters from `A-Z` as well as numbers `0-9` and `!?` in the LIGHTYEARS style. Like this:
<p class="lightyears-text">trans rights!</p> <p class="lightyears-text">trans rights!</p>
[Download the font here](https://files.natconf.dev/public/lightyears.woff2). It's in the web-optimised `woff2` format and has most characters stripped to minimise its file size it's less than 20 kilobytes in size! Uppercase and lowercase letters are the same. People can 'decrypt' text by copy-pasting it somewhere else! The font exclusively uses characters from the Noto font family. Many of the Noto varieties have been stitched together to recreate the whole LIGHTYEARS alphabet.
To create the font, I used [FontForge](https://fontforge.org). Finding this tool was both a blessing and a curse, as it was exactly what I needed, but it kept. crashing. all. the. time. I tried both the AppImage as well as the release on `dnf` and both had the same issues. I managed to make it work, but it took a lot of patience. Eventually I figured out that importing Noto Maths gave me a 3-8 second window before the editor crashed. The project file would forget the imported font, but if I had copied any glyphs it would keep those.
## Usage
The font is in the web-optimised `woff2` format and has most characters stripped to minimise its file size it's less than 20 kilobytes in size! Uppercase and lowercase letters are the same.
For use on your website, put the font into your resources/static/similar folder and then add this block of code to your CSS file:
<pre class="code-block">
@font-face &#123;
font-family: "LIGHTYEARS";
src: url("/fonts/lightyears.woff2");
font-weight: 400;
font-style: normal;
}
</pre>
Then you can change any element's font by setting `font-family: 'LIGHTYEARS', sans-serif;`. Because it's the Latin characters and Arabic numbers that have been changed, you can type text in regular English and people can 'decrypt' the messages by copy-pasting the text somewhere else!
You do **not** need Jaron's converter to type stylised text! The converter returns the actual symbols from other scripts, whereas this font only changes how letters look.

View File

@@ -0,0 +1,5 @@
**A New Beginning** is an EP I wrote back in 2018 in an effort to change up my production style. Originally, this EP was released as *A New Beginning (3-Track)*, featuring A New Beginning as *Nowy Początek* and *Farewell* in two different versions, one being an instrumental titled *Trzymajcie Się*, and the other one being a bootleg of Kelly Clarkson's *Behind These Hazel Eyes* called *Behind These Hazel Eyes (D4rkn355 'Farewell' Bootleg)*! For copyright reasons, the bootleg never made it onto streaming services.
This EP, to me, represents the start of a deviation in tone, production quality, and musical style from my previous works. While it was only a start, I am quite proud of the works I produced.
The EP is available for download on [my copyparty instance](https://files.natconf.dev/public/my_tracks/A%20New%20Beginning/).

View File

@@ -0,0 +1,9 @@
**Dreamworld** is my first album. I always wanted to write a cohesive piece of media, and **Dreamworld** was my first stab at this task. Originally, I had planned to write an album in the month of July 2020, but that fell flat entirely, instead starting out with the production of *Monophobia* a track name inspired by deadmau5' track of the same title and working on the album until September of the year thereafter.
I had started the track *Dreamworld* back in 2019, only adapting it to the project as I thought it would fit thematically. Coincidentally, *Flawed Romance* shares the same chord progression, which genuinely only happened because I accidentally wrote the same progression twice.
The cover for **Dreamworld** is an edited picture of the Wallanlagen in Bremen, featuring a tree that fell and broke a year later. As such, this scene does not exist in quite the same way it did back then anymore.
I own a vinyl record of this album, produced as a one-off by [beevinyl](https://beevinyl.com/).
The album is available for download on [my copyparty instance](https://files.natconf.dev/public/my_tracks/Dreamworld/).

View File

@@ -0,0 +1,3 @@
These two accounts house demos, work-in-progress versions, and old music tracks I wrote.
I used to experiment a lot! You'll find electronic house, progressive house, hardstyle, melodic stuff, dubstep, joke songs, and even a few remixes. Most of it is terrible, but I like looking back at it.

View File

@@ -1,368 +0,0 @@
export interface Project {
id: string;
isActive: boolean; // whether the project is currently active (true) or a past project (false)
banner: string;
icon: string;
date?: string;
title: string;
subtitle: string;
paragraphs: string[];
links: Link[];
status: ProjectStatus;
};
export enum ProjectStatus {
ACTIVE,
INACTIVE,
ABANDONED,
FINISHED,
EOL, // end of life
}
export interface Link {
text: string;
link: string;
}
export function getStatusText(project: Project): String {
switch (project.status) {
case ProjectStatus.ACTIVE:
return "active";
case ProjectStatus.INACTIVE:
return "inactive";
case ProjectStatus.ABANDONED:
return "abandoned";
case ProjectStatus.FINISHED:
return "finished";
case ProjectStatus.EOL:
return "end-of-life";
}
}
/**
* Returns static codes that can be used to reference same-name CSS classes
* without relying on display text.
*/
export function getStatusCode(project: Project): String {
switch (project.status) {
case ProjectStatus.ACTIVE:
return "act";
case ProjectStatus.INACTIVE:
return "ina";
case ProjectStatus.ABANDONED:
return "aba";
case ProjectStatus.FINISHED:
return "fin";
case ProjectStatus.EOL:
return "eol";
}
}
export const games: Project[] = [
{
id: "projectn5",
isActive: true,
banner: "/projects/projectn5/banner2.webp",
icon: "",
date: "September 2023 now",
title: "Homesick",
subtitle: "",
paragraphs: [
"I'm currently working on a game developed using Godot, entitled Homesick! It's aiming to be an action-adventure 3D jump & run heavily inspired by games such as <a href='https://en.wikipedia.org/wiki/Ratchet_%26_Clank'>Ratchet & Clank</a>.",
"I maintain a development log, feel free to check it out if you're curious! Or play some of the old builds available for download below.",
],
links: [
{
text: "View the <b>development log</b>",
link: "/projects/projectn5",
},
{
text: "Play an <b>old web build</b> (developed until 2025-05-16)",
link: "https://apps.natconf.dev/projectn5",
},
{
text: "Download the <b>old Windows builds</b>",
link: "https://files.natconf.dev/public/projectn5",
},
],
status: ProjectStatus.ACTIVE,
},
{
id: "magician",
isActive: false,
banner: "/projects/magician/banner.webp",
icon: "",
date: "July 2025",
title: "Magician",
subtitle: "Online Multiplayer Card Game",
paragraphs: [
"<b>Magician</b> is a clone of the card game <i>Wizard</i>. I've made it primarily to play with friends, but it's also a test for programming client-server multiplayer games. The clients are programmed in Godot, the server in Python, and they communicate via TCP/IP websockets. The game works with 3 to 6 players.",
"As the corresponding server is not currently online, the game is unplayable, but you can view the game below.",
],
links: [
{
text: "View the latest <b>Magician</b> build",
link: "https://apps.natconf.dev/magician",
},
],
status: ProjectStatus.ABANDONED,
},
{
id: "projektike",
isActive: false,
banner: "/projects/projektike/banner.webp",
icon: "",
date: "August 2024 May 2025",
title: "Projektike",
subtitle: "PvP Game",
paragraphs: [
"Two friends of mine and I worked together on a multiplayer game where you can throw magical artifacts at one another. It was developed using the Godot Engine. The game featured multiple character classes utilising artifacts such as fire, ice, black/white holes, wind, and teleports, and also had a money collecting mechanic. Player profile saving and character customisation were available, and there was an array of maps available to play on. Up to four players were supported.",
"The project is currently on hold.",
],
links: [
],
status: ProjectStatus.ABANDONED,
},
{
id: "swordsnstuff",
isActive: false,
banner: "/projects/swordsnstuff/banner.webp",
icon: "",
date: "August 2023",
title: "Swords & Stuff",
subtitle: "Unity 2D RPG",
paragraphs: [
"<b>Swords & Stuff</b> (working title) was an RPG inspired by Dragon Quest IX. Traverse the world with a party of up to 4 characters, each with their individual equiment, skills, and vocations, and fight monsters to gain experience!",
"This game was my first shot at 2D Unity development, which had proven quite fun, but also a little cumbersome at times. Unfortunately, I will not continue the project in its current form, since even though I don't expect to earn any money from my games, let alone publish them on a commercial platform, Unity's TOS changes in mid-2023 made me reconsider my decision to use the platform and I hence abandoned the project. I used this opportunity to learn to use Godot, which I will use for my future projects.",
"A working, but very early-in-development version of the game is still up on this website. It features a test overworld in which you can move the cast of four characters: Player1, fraxiom64, proudrat, and Grampa Simpson. The enemies, trolldads, chase you and take you into a battle scene that has a functioning queue, but no damage and health mechanics. You can flee battles. Don't open the inventory you cannot escape it.",
],
links: [
{
text: "Play <b>Swords & Stuff</b>",
link: "https://apps.natconf.dev/swordsnstuff",
},
],
status: ProjectStatus.ABANDONED,
},
{
id: "tads",
isActive: false,
banner: "/projects/tads/banner.webp",
icon: "/projects/tads/icon.webp",
date: "August 2023",
title: "Totally Accurate Dating Simulator",
subtitle: "HTML Text Adventure",
paragraphs: [
"<b>Totally Accurate Dating Simulator</b> is, as the name suggests, a series of particularly realistic dating simulator experiences. Dive into a world of romance as you meet your matches, curious and disappointing. Who will you meet? Will it be someone your type? That's subjective, and the computer will not even slightly attempt to match you with someone suitable. Prepare yourself for matches that are rarely described with \"intriguing\" and much more frequently with \"funny.\" Discover which of the 28 endings will determine your fate, and lower your expectations. Significantly.",
"One of these days, I'll make a TADS 3 with 3D characters and an actual matchmaking mechanic. One day...",
],
links: [
{
text: "Play <b>TADS 1</b>",
link: "https://apps.natconf.dev/tads/1",
},
{
text: "Play <b>TADS 2</b>",
link: "https://apps.natconf.dev/tads/2",
},
],
status: ProjectStatus.FINISHED,
},
];
export const hardware: Project[] = [
{
id: "daisyfm",
isActive: false,
banner: "/projects/daisyfm/banner.webp",
icon: "",
date: "July September 2024",
title: "Daisy",
subtitle: "Electro-Smith Daisy-based FM synth",
paragraphs: [
"One day, I was lying in bed, lacking motivation, telling a friend: \"I don't know what to do right now, I don't really have a project currently.\" His suggestion sent me down a two-month long road to create my own synthesiser.",
],
links: [
{
text: "Read more",
link: "/projects/daisyfm",
},
{
text: "Get the <b>PCB and STL files</b>",
link: "https://files.natconf.dev/public/daisyfm/",
},
{
text: "View the code files on <b>Codeberg</b>",
link: "https://codeberg.org/denizk0461/daisy-fm-synth",
},
],
status: ProjectStatus.FINISHED,
},
];
export const apps: Project[] = [
{
id: "weserplaner",
isActive: false,
banner: "/projects/weserplaner/banner.webp",
icon: "/projects/weserplaner/icon.webp",
date: "April 2023 January 2024",
title: "WeserPlaner",
subtitle: "University Timetable & Canteen Info App",
paragraphs: [
"<b>WeserPlaner</b> is an app I developed to more easily view relevant information during my studies at the University of Bremen. It can download the user's timetable from the university's learning platform Stud.IP, and it can download the menus for all canteens managed by the Studierendenwerk Bremen, allowing the user to filter for dietary preferences as well as hiding items containing substances they are allergic against.",
"In developing this app, I took heavy inspiration from an earlier project of mine, <b>AvH-Vertretungsplan</b>, which was an app I developed for a school I used to attend, in order to view the substitution plan as well as the canteen offers more easily. Quite similar!",
"I stopped work on the app in favour of other projects, notably because I had no significant plans for it. The app was taken down from the Google Play Store after I refused to comply with their new developer guidelines, requiring me to publish my home address (what the actual fuck Google?), and after the Studierendenwerk Bremen updated their page around the start of 2025, the app became nonfunctional.",
],
links: [
{
text: "View on <b>Codeberg</b>",
link: "https://codeberg.org/denizk0461/weserplaner/",
},
{
text: "Link to the <b>Google Play</b> store page (outdated)",
link: "https://play.google.com/store/apps/details?id=com.denizk0461.weserplaner",
},
],
status: ProjectStatus.EOL,
},
{
id: "textbasic",
isActive: false,
banner: "",
icon: "/projects/textbasic/icon.webp",
date: "May November 2023",
title: "Text Basic",
subtitle: "Extremely Basic Text Widget App",
paragraphs: [
"In the pursuit of finding a simple app on the Play Store that would allow me to put any kind of text on my home screen, I failed, and all I could find were ad-ridden monstrosities, overfilled with features. To fulfil my own requirements, I developed <b>Text Basic</b>, which does exactly one thing: put a text on your home screen. Upon user request, the app has grown minimally since, now allowing for text customisation (text font, text size, background style, colours) and a rotation of texts to display.",
"Surprisingly, the app garnered quite a signficant user base of >2.000 people, many of whom were sending me bug reports, and some even contributing ideas. Many were also frustrated that the text widgets changed... not understanding how the app works. It was taken down from the Play Store at the same time as <a href='#weserplaner'>WeserPlaner</a>.",
],
links: [
{
text: "View on <b>Codeberg</b>",
link: "https://codeberg.org/denizk0461/text-basic/",
},
{
text: "Link to the <b>Google Play</b> store page (outdated)",
link: "https://play.google.com/store/apps/details?id=com.denizk0461.textbasic",
},
],
status: ProjectStatus.EOL,
},
{
id: "qwark",
isActive: false,
banner: "",
icon: "/projects/qwark/icon.webp",
date: "June 2019 March 2020",
title: "Qwark Grade Log",
subtitle: "Grade Logging App",
paragraphs: [
"<b>Qwark</b> was an app I used to track relevant information for my time at gymnasium. Initially, it was only meant to track my grades in exams and whatnot, but its capabilities grew to calculate my report card grades and my final grade once I graduated. It was also able to keep simple notes which could be checked off to mark them as done, and it also had a built-in counter I used during lessons to track how often I raised my hand and how often I verbally contributed to classes! A discipline I severely struggled in.",
"The app was named after Captain Qwark, the clumsy hero figure from the Ratchet & Clank series who never really gets his affairs in order. I suppose this referenced me personally more so than the app, since I was the one who needed help with tracking relevant information a task for which the app proved very helpful!",
"The app reached EOL when I graduated from gymnasium, since I had no use for it anymore, and I never made it available to anyone else either.",
],
links: [
{
text: "View the Android app source code on <b>GitHub</b>",
link: "https://github.com/denizk0461/qwark",
},
],
status: ProjectStatus.EOL,
},
{
id: "avhplan",
isActive: false,
banner: "",
date: "April 2019 March 2020",
icon: "/projects/avhplan/icon.webp",
title: "AvH-Vertretungsplan",
subtitle: "Substitution Plan App",
paragraphs: [
"<b>AvH-Vertretungsplan</b> was an app I developed back in 2019 to view the substitution plan of my school more easily, since I disliked the disorganised design of the school's website. The substitution app allowed me to be more quickly informed about my courses, as it notified me about any cancellations and changes in my schedule. It also allowed me to view the canteen offers, even though I'd never eaten at the school's canteen.",
"The app was initially developed in Java and later converted into Kotlin as part of my Kotlin learning effort. The backend of the app, since the school website required a login to view the substitution plan, ran on a Raspberry Pi 3B using a Python script that scraped the website using Selenium and sent out notifications via Firebase. The Raspberry Pi crashed frequently and the script was not perfect, requiring me to frequently remote into the Pi using VNC, often while I was at school, to edit the script!",
"Since the app was written for native Android but a few of my classmates had iPhones, I had an iOS version in the works, which was developed entirely on a MacOS VM running on my laptop and debugged using an iPhone simulator in Xcode. The app achieved feature parity with the Android version at one point, but since I lacked funding to pay the $99-a-year fee Apple charges developers, it was never published and thus abandoned.",
"This app was genuinely one of my most fun projects, not only serving me as a handy tool, but also being a great playground for my programming practice, since it taught me to build UIs, use databases, and more. The app had been downloaded by 250 other students at my school, which I was and still am very proud of.",
],
links: [
{
text: "View the Android app source code on <b>GitHub</b>",
link: "https://github.com/denizk0461/avh-substitution-plan",
},
{
text: "View the iOS app source code on <b>GitHub</b>",
link: "https://github.com/denizk0461/avh-plan-ios",
},
],
status: ProjectStatus.EOL,
},
];
export const music: Project[] = [
{
id: "dreamworld",
isActive: false,
banner: "/projects/dreamworld/banner.webp",
icon: "/projects/dreamworld/icon.webp",
date: "July 2019 September 2021",
title: "Dreamworld",
subtitle: "My First Album",
paragraphs: [
"<b>Dreamworld</b> is my first album. I always wanted to write a cohesive piece of media, and <b>Dreamworld</b> was my first stab at this task. Originally, I had planned to write an album in the month of July 2020, but that fell flat entirely, instead starting out with the production of <i>Monophobia</i> a track name inspired by deadmau5' track of the same title and working on the album until September of the year thereafter.",
"I had started the track <i>Dreamworld</i> back in 2019, only adapting it to the project as I thought it would fit thematically. Coincidentally, <i>Flawed Romance</i> shares the same chord progression, which genuinely only happened because I accidentally wrote the same progression twice.",
"The cover for <b>Dreamworld</b> is an edited picture of the Wallanlagen in Bremen, featuring a tree that fell and broke a year later. As such, this scene does not exist in quite the same way it did back then anymore.",
"I own a vinyl record of this album, produced as a one-off by <a href='https://beevinyl.com/'>beevinyl</a>.",
],
links: [
{
text: "Listen & download on my <b>copyparty</b> instance",
link: "https://files.natconf.dev/public/my_tracks/Dreamworld/",
},
],
status: ProjectStatus.FINISHED,
},
{
id: "anewbeginning",
isActive: false,
banner: "",
icon: "/projects/anewbeginning/icon.webp",
date: "May August 2018",
title: "A New Beginning",
subtitle: "",
paragraphs: [
"<b>A New Beginning</b> is an EP I wrote back in 2018 in an effort to change up my production style. Originally, this EP was released as <i>A New Beginning (3-Track)</i>, featuring A New Beginning as <i>Nowy Początek</i> and <i>Farewell</i> in two different versions, one being an instrumental titled <i>Trzymajcie Się</i>, and the other one being a bootleg of Kelly Clarkson's <i>Behind These Hazel Eyes</i> called <i>Behind These Hazel Eyes (D4rkn355 'Farewell' Bootleg)</i>! For copyright reasons, the bootleg never made it onto streaming services.",
"This EP, to me, represents the start of a deviation in tone, production quality, and musical style from my previous works. While it was only a start, I am quite proud of the works I produced.",
],
links: [
{
text: "Listen & download on my <b>copyparty</b> instance",
link: "https://files.natconf.dev/public/my_tracks/A%20New%20Beginning/",
},
],
status: ProjectStatus.FINISHED,
},
{
id: "soundcloud",
isActive: false,
banner: "",
icon: "/projects/soundcloud/icon.webp",
title: "Soundcloud",
subtitle: "Demo Dump & Archive",
paragraphs: [
"These two accounts house demos, work-in-progress versions, and old music tracks I wrote.",
"I used to experiment a lot! You'll find electronic house, progressive house, hardstyle, melodic stuff, dubstep, joke songs, and even a few remixes. Most of it is terrible, but I like looking back at it.",
],
links: [
{
text: "Listen to the demo dump on <b>Soundcloud</b>",
link: "https://soundcloud.com/denizk0461",
},
{
text: "Listen to the archive on <b>Soundcloud</b>",
link: "https://soundcloud.com/djd4rkn355",
},
],
status: ProjectStatus.INACTIVE,
},
];

View File

@@ -1,6 +1,7 @@
export interface Project { export interface Project {
category: ProjectCategory; category: ProjectCategory;
id: string; id: string;
directLink?: string; // for linking somewhere directly instead of a project page
banner: string; banner: string;
bannerAlt: string; bannerAlt: string;
title: string; title: string;
@@ -9,8 +10,14 @@ export interface Project {
isOngoing: boolean; // whether the project is currently active (true) or a past project (false) isOngoing: boolean; // whether the project is currently active (true) or a past project (false)
date: string; date: string;
status: ProjectStatus; status: ProjectStatus;
links: Link[]; // may pass an empty array
}; };
export interface Link {
text: string;
link: string;
}
export enum ProjectCategory { export enum ProjectCategory {
DRAWINGS = "drawings", DRAWINGS = "drawings",
GAMES = "games", GAMES = "games",
@@ -48,6 +55,36 @@ export function getStatusCode(project: Project): String {
} }
export const projects: Project[] = [ export const projects: Project[] = [
// highlighted
{
category: ProjectCategory.GAMES,
id: "projectn5",
directLink: "/projects/projectn5",
banner: "/projects/projectn5/banner2.webp",
bannerAlt: "",
title: "Homesick",
subtitle: "",
description: "",
isOngoing: true,
date: "September 2023 now",
status: ProjectStatus.ACTIVE,
links: [
// {
// text: "development log",
// link: "/projects/projectn5",
// },
// {
// text: "old web build (2025-05-16)",
// link: "https://apps.natconf.dev/projectn5",
// },
// {
// text: "old Windows builds",
// link: "https://files.natconf.dev/public/projectn5",
// },
],
},
// 2026
{ {
category: ProjectCategory.MISC, category: ProjectCategory.MISC,
id: "lightyears-font", id: "lightyears-font",
@@ -59,59 +96,33 @@ export const projects: Project[] = [
isOngoing: false, isOngoing: false,
date: "March 2026", date: "March 2026",
status: ProjectStatus.FINISHED, status: ProjectStatus.FINISHED,
links: [
{
text: "font download",
link: "https://files.natconf.dev/public/lightyears.woff2",
}
],
}, },
{ {
category: ProjectCategory.DRAWINGS, category: ProjectCategory.DRAWINGS,
id: "firstmonth", id: "firstmonth",
banner: "", banner: "banner.webp",
bannerAlt: "", bannerAlt: "Several Faber-Castell Polychromos colour pencils lined up with markings next to them in the same colour on a sheet of paper.",
title: "My First Month Drawing", title: "My First Month Drawing",
subtitle: "self-imposed drawing challenge", subtitle: "self-imposed drawing challenge",
description: "", description: "",
isOngoing: false, isOngoing: false,
date: "February March 2026", date: "February March 2026",
status: ProjectStatus.FINISHED, status: ProjectStatus.FINISHED,
}, links: [
{ {
category: ProjectCategory.ELECTRONICS, text: "accompanying blog post",
id: "3ds-usb-c", link: "/blog/2026/0205",
banner: "", }
bannerAlt: "", ],
title: "3DS USB-C mod",
subtitle: "DIY charging port mod",
description: "",
isOngoing: false,
date: "October 2024",
status: ProjectStatus.FINISHED,
},
{
category: ProjectCategory.ELECTRONICS,
id: "deej0461",
banner: "",
bannerAlt: "",
title: "deej0461",
subtitle: "PC companion audio source controller",
description: "",
isOngoing: false,
date: "August 2024",
status: ProjectStatus.FINISHED,
}, },
// 2025
{
category: ProjectCategory.GAMES,
id: "projectn5",
banner: "/projects/projectn5/banner2.webp",
bannerAlt: "",
title: "Homesick",
subtitle: "",
description: "",
isOngoing: true,
date: "September 2023 now",
status: ProjectStatus.ACTIVE,
},
{ {
category: ProjectCategory.GAMES, category: ProjectCategory.GAMES,
id: "magician", id: "magician",
@@ -123,6 +134,12 @@ export const projects: Project[] = [
isOngoing: false, isOngoing: false,
date: "July 2025", date: "July 2025",
status: ProjectStatus.ABANDONED, status: ProjectStatus.ABANDONED,
links: [
{
text: "view game",
link: "https://apps.natconf.dev/magician",
},
],
}, },
{ {
category: ProjectCategory.GAMES, category: ProjectCategory.GAMES,
@@ -135,6 +152,106 @@ export const projects: Project[] = [
isOngoing: false, isOngoing: false,
date: "August 2024 May 2025", date: "August 2024 May 2025",
status: ProjectStatus.ABANDONED, status: ProjectStatus.ABANDONED,
links: [
],
},
// 2024
{
category: ProjectCategory.ELECTRONICS,
id: "3ds-usb-c",
banner: "",
bannerAlt: "",
title: "3DS USB-C mod",
subtitle: "DIY charging port mod",
description: "",
isOngoing: false,
date: "October 2024",
status: ProjectStatus.FINISHED,
links: [
],
},
{
category: ProjectCategory.ELECTRONICS,
id: "daisyfm",
banner: "banner.webp",
bannerAlt: "Close-up of Daisy, focussed on the effect knobs",
title: "Daisy FM Synth",
subtitle: "Electro-Smith Daisy-based FM synth",
description: "",
isOngoing: false,
date: "July September 2024",
status: ProjectStatus.FINISHED,
links: [
{
text: "PCB & STL files",
link: "https://files.natconf.dev/public/daisyfm/",
},
{
text: "source code",
link: "https://codeberg.org/denizk0461/daisy-fm-synth",
},
],
},
{
category: ProjectCategory.ELECTRONICS,
id: "deej0461",
banner: "",
bannerAlt: "",
title: "deej0461",
subtitle: "PC companion audio source controller",
description: "",
isOngoing: false,
date: "August 2024",
status: ProjectStatus.FINISHED,
links: [
],
},
{
category: ProjectCategory.APPS,
id: "weserplaner",
banner: "/projects/weserplaner/banner.webp",
bannerAlt: "",
title: "WeserPlaner",
subtitle: "University Timetable & Canteen Info App",
description: "",
isOngoing: false,
date: "April 2023 January 2024",
status: ProjectStatus.EOL,
links: [
{
text: "source code",
link: "https://codeberg.org/denizk0461/weserplaner/",
},
{
text: "link to the former <b>Google Play</b> store page",
link: "https://play.google.com/store/apps/details?id=com.denizk0461.weserplaner",
},
],
},
// 2023
{
category: ProjectCategory.APPS,
id: "textbasic",
banner: "",
bannerAlt: "",
title: "Text Basic",
subtitle: "Extremely Basic Text Widget App",
description: "",
isOngoing: false,
date: "May November 2023",
status: ProjectStatus.EOL,
links: [
{
text: "source code",
link: "https://codeberg.org/denizk0461/text-basic/",
},
{
text: "former Google Play store page",
link: "https://play.google.com/store/apps/details?id=com.denizk0461.textbasic",
},
],
}, },
{ {
category: ProjectCategory.GAMES, category: ProjectCategory.GAMES,
@@ -147,6 +264,12 @@ export const projects: Project[] = [
isOngoing: false, isOngoing: false,
date: "August 2023", date: "August 2023",
status: ProjectStatus.ABANDONED, status: ProjectStatus.ABANDONED,
links: [
{
text: "play game",
link: "https://apps.natconf.dev/swordsnstuff",
},
],
}, },
{ {
category: ProjectCategory.GAMES, category: ProjectCategory.GAMES,
@@ -159,51 +282,39 @@ export const projects: Project[] = [
isOngoing: false, isOngoing: false,
date: "August 2023", date: "August 2023",
status: ProjectStatus.FINISHED, status: ProjectStatus.FINISHED,
links: [
{
text: "play TADS 1",
link: "https://apps.natconf.dev/tads/1",
},
{
text: "play TADS 2",
link: "https://apps.natconf.dev/tads/2",
},
],
}, },
// 2021
{ {
category: ProjectCategory.ELECTRONICS, category: ProjectCategory.MUSIC,
id: "daisyfm", id: "dreamworld",
banner: "banner.webp", banner: "/projects/dreamworld/banner.webp",
bannerAlt: "Close-up of Daisy, focussed on the effect knobs", bannerAlt: "",
title: "Daisy FM Synth", title: "Dreamworld",
subtitle: "Electro-Smith Daisy-based FM synth", subtitle: "My First Album",
description: "", description: "",
isOngoing: false, isOngoing: false,
date: "July September 2024", date: "July 2019 September 2021",
status: ProjectStatus.FINISHED, status: ProjectStatus.FINISHED,
links: [
{
text: "listen & download",
link: "https://files.natconf.dev/public/my_tracks/Dreamworld/",
},
],
}, },
// 2020
{
category: ProjectCategory.APPS,
id: "weserplaner",
banner: "/projects/weserplaner/banner.webp",
bannerAlt: "",
title: "WeserPlaner",
subtitle: "University Timetable & Canteen Info App",
description: "",
isOngoing: false,
date: "April 2023 January 2024",
status: ProjectStatus.EOL,
},
{
category: ProjectCategory.APPS,
id: "textbasic",
banner: "",
bannerAlt: "",
title: "Text Basic",
subtitle: "Extremely Basic Text Widget App",
description: "",
isOngoing: false,
date: "May November 2023",
status: ProjectStatus.EOL,
},
{ {
category: ProjectCategory.APPS, category: ProjectCategory.APPS,
id: "qwark", id: "qwark",
@@ -215,6 +326,12 @@ export const projects: Project[] = [
isOngoing: false, isOngoing: false,
date: "June 2019 March 2020", date: "June 2019 March 2020",
status: ProjectStatus.EOL, status: ProjectStatus.EOL,
links: [
{
text: "android source code",
link: "https://github.com/denizk0461/qwark",
},
],
}, },
{ {
category: ProjectCategory.APPS, category: ProjectCategory.APPS,
@@ -227,24 +344,19 @@ export const projects: Project[] = [
isOngoing: false, isOngoing: false,
date: "April 2019 March 2020", date: "April 2019 March 2020",
status: ProjectStatus.EOL, status: ProjectStatus.EOL,
links: [
{
text: "android source code",
link: "https://github.com/denizk0461/avh-substitution-plan",
},
{
text: "iOS source code",
link: "https://github.com/denizk0461/avh-plan-ios",
},
],
}, },
// 2018
{
category: ProjectCategory.MUSIC,
id: "dreamworld",
banner: "/projects/dreamworld/banner.webp",
bannerAlt: "",
title: "Dreamworld",
subtitle: "My First Album",
description: "",
isOngoing: false,
date: "July 2019 September 2021",
status: ProjectStatus.FINISHED,
},
{ {
category: ProjectCategory.MUSIC, category: ProjectCategory.MUSIC,
id: "anewbeginning", id: "anewbeginning",
@@ -256,7 +368,15 @@ export const projects: Project[] = [
isOngoing: false, isOngoing: false,
date: "May August 2018", date: "May August 2018",
status: ProjectStatus.FINISHED, status: ProjectStatus.FINISHED,
links: [
{
text: "listen & download",
link: "https://files.natconf.dev/public/my_tracks/A%20New%20Beginning/",
},
],
}, },
// no specific date
{ {
category: ProjectCategory.MUSIC, category: ProjectCategory.MUSIC,
id: "soundcloud", id: "soundcloud",
@@ -268,5 +388,15 @@ export const projects: Project[] = [
isOngoing: false, isOngoing: false,
date: "", date: "",
status: ProjectStatus.INACTIVE, status: ProjectStatus.INACTIVE,
links: [
{
text: "visit demo dump",
link: "https://soundcloud.com/denizk0461",
},
{
text: "visit archive",
link: "https://soundcloud.com/djd4rkn355",
},
],
}, },
]; ];

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB