diff --git a/src/content/work/avoid-early-web-game.md b/src/content/work/avoid-early-web-game.md index 727097c..37b1460 100644 --- a/src/content/work/avoid-early-web-game.md +++ b/src/content/work/avoid-early-web-game.md @@ -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 `` element acting as the catalyst for my later (and still going) obsession with graphics programming. diff --git a/src/content/work/backup-container-btrfs-borg.md b/src/content/work/backup-container-btrfs-borg.md index bb8150a..015101a 100644 --- a/src/content/work/backup-container-btrfs-borg.md +++ b/src/content/work/backup-container-btrfs-borg.md @@ -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. diff --git a/src/content/work/city-simulation-unity-traffic.md b/src/content/work/city-simulation-unity-traffic.md index 7a773a9..69c4b52 100644 --- a/src/content/work/city-simulation-unity-traffic.md +++ b/src/content/work/city-simulation-unity-traffic.md @@ -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 --- diff --git a/src/content/work/declared-shared-simulation-code.md b/src/content/work/declared-shared-simulation-code.md index 79bfd29..51d15ea 100644 --- a/src/content/work/declared-shared-simulation-code.md +++ b/src/content/work/declared-shared-simulation-code.md @@ -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 16–32 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 diff --git a/src/content/work/fizika-erettsegi-practice-app.md b/src/content/work/fizika-erettsegi-practice-app.md index b2ee9b5..3148376 100644 --- a/src/content/work/fizika-erettsegi-practice-app.md +++ b/src/content/work/fizika-erettsegi-practice-app.md @@ -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'] diff --git a/src/content/work/fleeting-garden-webgpu-drawing.md b/src/content/work/fleeting-garden-webgpu-drawing.md index f12002d..069884c 100644 --- a/src/content/work/fleeting-garden-webgpu-drawing.md +++ b/src/content/work/fleeting-garden-webgpu-drawing.md @@ -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 diff --git a/src/content/work/frame-eink-photo-display.md b/src/content/work/frame-eink-photo-display.md index 456eccd..02b5fcd 100644 --- a/src/content/work/frame-eink-photo-display.md +++ b/src/content/work/frame-eink-photo-display.md @@ -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 diff --git a/src/content/work/greatai-ai-deployment-api.md b/src/content/work/greatai-ai-deployment-api.md index 6131a3c..30ef051 100644 --- a/src/content/work/greatai-ai-deployment-api.md +++ b/src/content/work/greatai-ai-deployment-api.md @@ -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 diff --git a/src/content/work/life-towers-immutable-tries.md b/src/content/work/life-towers-immutable-tries.md index 67e9232..98bfc43 100644 --- a/src/content/work/life-towers-immutable-tries.md +++ b/src/content/work/life-towers-immutable-tries.md @@ -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 diff --git a/src/content/work/lights-synchronized-to-music.md b/src/content/work/lights-synchronized-to-music.md index d37fe7b..0dd3d30 100644 --- a/src/content/work/lights-synchronized-to-music.md +++ b/src/content/work/lights-synchronized-to-music.md @@ -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 --- diff --git a/src/content/work/nuclear-cooling-simulation.md b/src/content/work/nuclear-cooling-simulation.md index cf3adc9..2407480 100644 --- a/src/content/work/nuclear-cooling-simulation.md +++ b/src/content/work/nuclear-cooling-simulation.md @@ -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 diff --git a/src/content/work/perfect-postcode-rust-property-server.md b/src/content/work/perfect-postcode-rust-property-server.md index 45ca7a8..cda0dca 100644 --- a/src/content/work/perfect-postcode-rust-property-server.md +++ b/src/content/work/perfect-postcode-rust-property-server.md @@ -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 diff --git a/src/content/work/platform-game-c-sdl.md b/src/content/work/platform-game-c-sdl.md index 5e0fc3f..8bfce22 100644 --- a/src/content/work/platform-game-c-sdl.md +++ b/src/content/work/platform-game-c-sdl.md @@ -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 --- diff --git a/src/content/work/reconcile-text-3-way-merge.md b/src/content/work/reconcile-text-3-way-merge.md index db632a7..bd7b5b8 100644 --- a/src/content/work/reconcile-text-3-way-merge.md +++ b/src/content/work/reconcile-text-3-way-merge.md @@ -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 diff --git a/src/content/work/sdf-2d-ray-tracing.md b/src/content/work/sdf-2d-ray-tracing.md index b74d0db..0b6ee54 100644 --- a/src/content/work/sdf-2d-ray-tracing.md +++ b/src/content/work/sdf-2d-ray-tracing.md @@ -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 diff --git a/src/content/work/vault-link-obsidian-sync.md b/src/content/work/vault-link-obsidian-sync.md index bf9554d..32a5743 100644 --- a/src/content/work/vault-link-obsidian-sync.md +++ b/src/content/work/vault-link-obsidian-sync.md @@ -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 diff --git a/src/pages/index.astro b/src/pages/index.astro index a6be5be..9d8256f 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -19,12 +19,14 @@ const personJsonLd = buildPersonJsonLd();
-

Engineering notes

- Andras Schmelczer sharing cool projects and lessons learned + Andras Schmelczer sharing cool projects and lessons + learned

- 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 About page. + 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 About page.