This commit is contained in:
Andras Schmelczer 2026-07-12 21:34:59 +01:00
parent 82a241ddee
commit 070a03142f
17 changed files with 8 additions and 30 deletions

View file

@ -13,7 +13,7 @@ project: {}
---
January 2018, my first browser game. You're a dot; other dots stream in from the edges and chase you; you have to out-manouver them to escape while getting them to collide with each other. The game is simple but rather fun, at least for the first few minutes.
January 2018, my first browser game. You're a dot; other dots stream in from the edges and chase you; you have to out-manoeuvre them to escape while getting them to collide with each other. The game is simple but rather fun, at least for the first few minutes.
This project marks my first encounter with the `<canvas>` element acting as the catalyst for my later (and still going) obsession with graphics programming.

View file

@ -17,11 +17,11 @@ article:
scale: One container, multiple targets per host, four years of restored incidents
---
There's merit to keeping systems simpler the more critical they are. More precisesly, we must keep them easily understandable by building on solid foundations and only adding on top the most necessary extra logic.
There's merit to keeping systems simpler the more critical they are. More precisely, we must keep them easily understandable by building on solid foundations and only adding on top the most necessary extra logic.
A good example of this is my home server's backup. I ran various databases, even when I aim to mostly use sqlite, there are multiple postgres instances, redis, message queues, etc. Who doesn't like time machine like backups which allow granular file history? To achieve this, we need frequent backups, my setup uses an hourly cadence. However, we can't shut down the entire stack every hour to back it up. So the only solution is to backup everything live.
I could've gone down the rabbit hole of using each database's dedicated backup mechansim, however, that would've been everyhing but simple. So instead I rely on the DB's crash recovery mechanism being solid.
I could've gone down the rabbit hole of using each database's dedicated backup mechanism, however, that would've been everything but simple. So instead I rely on the DB's crash recovery mechanism being solid.
With the above context, I can now reveal that the backup container is just a short shell script that takes a btrfs snapshot (all container volumes are mounted from a btrfs subvolume) and then feeding into borg which handles incrementality and deduplication. The backup script supports configuring borg to run against multiple remote backup servers, gracefully handle failures, and to maintain a healthcheck status in case human intervention is needed.

View file

@ -9,7 +9,6 @@ thumbnail:
article:
tags: ['simulation', 'systems']
stack: ['Unity', 'C#', 'REST API', 'Blender']
outcome: Visible consequences for an otherwise abstract PLC challenge
project:
title: City Simulation
---

View file

@ -16,11 +16,9 @@ article:
tags: ['games', 'web', 'systems']
stack: ['TypeScript', 'Node.js', 'WebSockets', 'WebGL', 'SDF-2D']
scale: Game servers ticking at 200 Hz, each serving 1632 clients at 25 updates a second, browser and mobile
outcome: A multiplayer browser game that proved SDF-2D survived a real game loop
media:
- type: image
src: ./_assets/decla-red.jpg
alt: The decla.red browser game interface showing a space scene with team controls and planets.
caption: Two teams, small planets, real gravity. The renderer underneath is the SDF-2D library from my thesis.
project:
title: decla.red

View file

@ -14,7 +14,6 @@ links:
article:
tags: ['web', 'tools']
stack: ['jQuery', 'vanilla HTML/CSS', 'Node/Express', 'JSON', 'localStorage']
outcome: A free practice app real students still find when they search for past érettségi physics papers
project:
title: Fizika
technologies: ['jQuery', 'HTML/CSS', 'Node/Express', 'JSON', 'localStorage']

View file

@ -16,11 +16,9 @@ article:
tags: ['graphics', 'simulation', 'web']
stack: ['TypeScript', 'WebGPU', 'WGSL', 'Compute shaders', 'Vite', 'Tweakpane']
scale: One HTML file, 10 WGSL shaders, 6 vibe presets, up to 1.5M agents, 60 FPS target on consumer hardware
outcome: A browser drawing toy where user strokes seed an agent simulation that overwrites them
media:
- type: image
src: ./_assets/fleeting-garden.jpg
alt: Close-up of intertwining cyan, violet, and yellow agent trails radiating into a kaleidoscopic central knot.
caption: A snapshot from one session. What you see is the trail texture; the agents that drew it are already gone.
project:
title: Fleeting Garden

View file

@ -22,11 +22,9 @@ article:
'Atkinson dither',
]
scale: One panel, one household, ~64 refreshes a day at peak
outcome: A wall-mounted photo frame that pulls from self-hosted Immich, gated on home presence, with no cloud dependencies
media:
- type: image
src: ./_assets/frame.jpg
alt: The frame on the wall showing a 6-colour Atkinson-dithered landscape scene, with "2 years ago" and a location label painted into the bottom corners.
caption: The bottom corners carry the photo's age and EXIF location. Painted as text on top, so the dither can't smear them.
project:
title: Frame

View file

@ -19,11 +19,9 @@ article:
tags: ['ai', 'systems', 'tools']
stack: ['Python', 'decorators', 'FastAPI', 'survey design']
scale: 33 deployment habits surveyed, 6 proposed additions, framework evaluated by working data scientists and engineers
outcome: A pip-installable framework, an MSc thesis, and one strong opinion about API surface area
media:
- type: image
src: ./_assets/great-ai.png
alt: Example Python code using GreatAI decorators and prediction helpers.
caption: A working GreatAI service is about ten lines on top of a plain prediction function.
project:
title: GreatAI

View file

@ -14,11 +14,9 @@ article:
tags: ['systems', 'web', 'tools']
stack: ['Python', 'Angular', 'TypeScript', 'FastAPI', 'SQLite']
scale: Multi-device goal and task state shared between clients and a server
outcome: A goal tracker still in use, and a lesson about when clever sync isn't worth it
media:
- type: image
src: ./_assets/towers.jpg
alt: Screenshot of a life tracking web interface represented with tower-like visual structures.
caption: Towers of finished tasks, one column per goal. Done blocks fall into place with a small gravity animation.
project:
title: Life Towers

View file

@ -9,7 +9,6 @@ thumbnail:
article:
tags: ['systems', 'tools']
stack: ['Python', 'NumPy', 'FFT', 'Raspberry Pi', 'MOSFETs', 'vanilla web']
outcome: The first non-trivial project I started and finished
project:
title: Lights Synchronized to Music
---

View file

@ -11,15 +11,12 @@ article:
tags: ['simulation', 'systems', 'tools']
stack: ['Python', 'Flask', 'NumPy', 'HTML canvas', 'JavaFX']
scale: One remote sim server, many monitoring clients, separate JavaFX graph editor
outcome: A believable PLC simulation usable by non-specialists during a live cybersecurity challenge
media:
- type: image
src: ./_assets/process-simulator.jpg
alt: Screenshot of the cooling system simulator with pipes, pumps, coolers, and temperature values.
caption: Flow ran first as a graph traversal, then heat solved as a matrix equation.
- type: image
src: ./_assets/process-simulator-input.jpg
alt: Screenshot of the JavaFX graph editor used to define simulator input.
caption: The JavaFX editor produced JSON that the simulator ate as input.
project:
title: Cooling System Simulation

View file

@ -26,11 +26,9 @@ article:
'Gemini',
]
scale: ~25M historical properties, ~2.5M postcodes, ~150 numeric features per row, all in RAM on a single VM
outcome: A single-binary UK property-intelligence service with sub-100ms hexagon aggregations under filter
media:
- type: image
src: ./_assets/perfect-postcode.jpg
alt: A Perfect Postcode dashboard view of Manchester with five active filters (property type, price, public-transport time to Manchester city centre, crime, noise) and a hex heatmap of 1,247 matching properties.
caption: A normal user pan triggers a hexagon aggregation under filter. The hot path holds itself to three integer compares per row.
project:
title: Perfect Postcode

View file

@ -9,7 +9,6 @@ thumbnail:
article:
tags: ['games', 'systems']
stack: ['C', 'SDL 1.2', 'Voxel terrain']
outcome: A playable course project, and the moment programming clicked
project:
title: Platform Game
---

View file

@ -22,11 +22,9 @@ article:
tags: ['systems', 'tools', 'web']
stack: ['Rust', 'WebAssembly', 'Python', 'pyo3', 'wasm-bindgen']
scale: One Rust core, three published packages (crates.io, npm, PyPI), driving an Obsidian sync plugin
outcome: A small Rust library that auto-resolves prose conflicts, with WASM and Python bindings
media:
- type: image
src: ./_assets/reconcile.png
alt: The reconcile-text logo, a stylised merge arrow, with the tagline "Conflict-free 3-way text merging".
caption: reconcile-text weaves conflicting edits together instead of asking a human to choose.
project:
title: reconcile-text

View file

@ -26,11 +26,9 @@ article:
'Dynamic shader generation',
]
scale: Browser library, mobile-targeted, real-time on consumer GPUs, both WebGL1 and WebGL2 paths
outcome: An NPM package and BSc thesis; the renderer behind the decla.red multiplayer game
media:
- type: image
src: ./_assets/sdf2d.jpg
alt: Browser demo page showing SDF-2D scenes rendered with soft lighting effects.
caption: SDF-2D shipped as a TypeScript library, not a one-shot demo. That distinction shaped most of the design.
project:
title: SDF-2D

View file

@ -27,7 +27,6 @@ article:
'reconcile-text',
]
scale: One Rust server, one TypeScript sync engine, three published consumers (Obsidian plugin, CLI, fuzz/deterministic test harnesses)
outcome: A self-hosted Obsidian sync I trust enough to use as my primary vault transport
project:
title: VaultLink
selected: true

View file

@ -19,12 +19,14 @@ const personJsonLd = buildPersonJsonLd();
<Base jsonLd={personJsonLd}>
<section class="home-intro">
<p class="eyebrow">Engineering notes</p>
<h1>
<span class="home-intro-name">Andras Schmelczer</span> sharing cool projects and lessons learned
<span class="home-intro-name">Andras Schmelczer</span> sharing cool projects and lessons
learned
</h1>
<p>
I enjoy learning by building exciting things that sometimes even turn out to be useful. This page is dedicated to the projects I actually finished. To learn more about me, check out the <a href="/about/">About page</a>.
I enjoy learning by building exciting things that sometimes even turn out to be
useful. This page is dedicated to the projects I actually finished. To learn more
about me, check out the <a href="/about/">About page</a>.
</p>
</section>