diff --git a/src/lib/db/schema.ts b/src/lib/db/schema.ts index 10445bc..f5a902f 100755 --- a/src/lib/db/schema.ts +++ b/src/lib/db/schema.ts @@ -71,3 +71,15 @@ export const publications = personalWebsiteSchema.table('publications', { createdAt: timestamp('created_at').defaultNow(), updatedAt: timestamp('updated_at').defaultNow() }); + +// Legacy ^ +// New + +export const blogArticles = personalWebsiteSchema.table('blog_articles', { + id: serial('id').primaryKey(), + title: varchar('title', { length: 256 }), + slug: varchar('slug', { length: 256 }), + content: varchar('content', { length: 8192 }), + createdAt: timestamp('created_at').defaultNow(), + updatedAt: timestamp('updated_at').defaultNow() +}) \ No newline at end of file diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 2a56bb2..6b1e466 100755 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,108 +1,58 @@ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-2026 - ???
+???
+2021 - 2026
+BSc. Computer Science (Software Engineering)
+The Hague University of Applied Sciences
+2026
+internship at 3webapps
+2023
+internship at h5mag
+2021 - 2023
+junior IT specialist at Finance Plus
+2020 - current
+300+ IT problems solved in Netherlands
+vash esports
+automated osu! matchmaking/tournament platform
+ +eudi-auth for 3webapps
++ plugin for WooCommerce/Magento2 that adds authentication with the European Digital + Identity (EUDI) wallet +
+realtime collaboration for h5mag
++ socket.io server for h5mag (magazine web editor) that broadcasts user actions to other + editors, similar to writing a Google Doc together +
+infra
+server, project deployments and dev config as code with setup script
+animaldex
+world map with pets & other animals around the neighborhood 😼
+ + +catch em all
+table of all 1025 pokemon across 38 games with checkboxes for catching them all
+ + +spotify osu! map finder
+small tool for finding osu! maps using a spotify url of a song or playlist
+ + +beerio kart
+webserver in go with a double-elim bracket for a one-time mario kart tournament
+ + ++ a lot more planned (soon™)
+{article.createdAt?.toDateString()}
++ {selected.animalName ?? selected.species} +
++ {selected.species}{selected.breed ? ` · ${selected.breed}` : ''} +
+{loginError}
+ {/if} + +{item.animalName ?? item.species}
++ {item.species}{item.breed ? ` · ${item.breed}` : ''} +
++ 🤖 AI: {item.aiBreedSuggestion} ({Math.round( + (item.aiBreedConfidence ?? 0) * 100 + )}%) +
+ {/if} ++ {new Date(item.submittedAt).toLocaleDateString('nl-NL', { + day: 'numeric', + month: 'short', + year: 'numeric', + hour: '2-digit', + minute: '2-digit' + })} + {#if item.reporterName}· by {item.reporterName}{/if} +
++ 📍 {item.sightingLat.toFixed(5)}, {item.sightingLng.toFixed(5)} +
+📍 Location required
+{locationError}
++ Go to Settings → Site permissions → Location and allow this site. +
+Max 10 photos · JPEG, PNG, WebP, HEIC
++ 🤖 AI thinks this is a {aiSuggestion.breed} + ({Math.round(aiSuggestion.confidence * 100)}% confident) +
+Drag the pin to fine-tune (max 30 km from you).
+ {/if} ++ All submissions are reviewed before appearing on the map. +
++ Below are all {data.pokemon.length} Pokemon across {data.games.length} games. Play through all generations + and catch all catchable pokemon in each. Use the "Set rules" button to pick which games you want to + complete. +
++ Log in to save your progress. +
+{/if} + +{caughtCount}/{total} entries caught ({percentage} %)
+ +| Pokemon | + {#each visibleGames as game (game.id)} ++ {game.name} + | + {/each} +
|---|---|
|
+
+
+ |
+ {#each visibleGames as game (game.id)}
+ {@const entry = entryMap.get(pokemon.id)?.get(game.id)}
+ {@const reason = tooltip(entry, game)}
+ + {#if entry && reason === null} + toggleCaught(entry.id, e.currentTarget.checked)} + /> + {:else} + + + + {/if} + | + {/each} +