Portfoolio — projektid & teenused

Karl-Eerik
Park

Tarkvaraarenduse õpilane

Ehitan vajadustele vastavaid tarkvaralahendusi — e-poode, kodulehti ja ettevõtte haldustarkvara. Konsultatsioon tasuta.

[email protected] github.com/parkkarl

Enne kui edasi kerid

Kui tehniliselt ma sulle oma projektidest räägin?

Sama töö, kaks juttu. Vali see, mis sulle sobib — ja kogu ülejäänud leht kirjutab end selle järgi ümber. Kui mõtled ümber, saad siia igal ajal tagasi tulla.

Mõlemad näited kirjeldavad sama KalaRadari funktsiooni.

01 — Teenused

Mida ma sinu jaoks teha saan

Neli asja, mida kõige sagedamini tellitakse. Hinnad on lähtekohad — täpse numbri ütlen esimese vestluse järel, mis on tasuta.

Koduleht

Hindalates 500 €

Ettevõtte avalik leht: kujundus, tekstid, mobiilivaade, oma domeen ja server. Sisu muutmine jääb sinu kätte — iga väikese paranduse jaoks ei pea minu poole pöörduma.

E-pood

Hindalates 1500 €

Kataloog, ostukorv ja pangalink — Swedbank, SEB ja teised Maksekeskuse kaudu. Tellimused, kampaaniad ja laoseis ühes haldusvaates. Goldstocki e-pood on ehitatud täpselt nii.

Ettevõtte haldustarkvara

Hindalates 2000 €

Sisemine süsteem, mis on tehtud sinu töövoo järgi, mitte vastupidi: tööaja arvestus, tellimused, eelarve, aruanded. Näide on siinsamas lehel — aitrack.

Olemasoleva süsteemi parandamine

Hind55 €/h

Tarkvara on olemas, aga tegija on kadunud või muudatused seisavad. Loen koodi läbi, ütlen ausalt, mis seisus see on, ja parandan — väikeste kontrollitud sammudega.

Ei leia siit oma muret? Kirjuta ikkagi. Enamik töid algab sellest, et keegi kirjeldab probleemi, mitte valmis lahendust.

02 — Kuidas töö käib

Viis sammu esimesest kirjast valmis tööni

1

Vestlus

Räägime läbi, mida on päriselt vaja ja mis eelarve piires. Umbes pool tundi, Tartus kohapeal või Zoomis. Tasuta.

2

Pakkumine

Saad kirjalikult: mis valmib, mis ajaks ja mis see maksab. Alles siis otsustad, kas jätkame.

3

Ehitus

Näitan tööd vahepeal, mitte alles lõpus. Muudatusi saab öelda siis, kui need on veel odavad.

4

Üleandmine

Töö läheb üles ja hakkab tööle. Näitan haldusvaate selgeks, et saaksid ise sisu, hindu ja pilte muuta.

5

Pärast üleandmist

Vead parandan ära. Edasine hooldus ja uued soovid kokkuleppel — sina otsustad, kas ja kui palju.

03 — Kokkuvõte

Ehitan päris tooteid, mis jõuavad kasutajateni

0+ KalaRadari klienti

Tarkvaraarenduse õpilane Viljandi Kutseõppekeskuses. Kavandan arhitektuuri, valin igale probleemile mõistlikuima tehnoloogia ja viin selle ideest töötava, juurutatud tooteni. AI-agentide juhtimine on siin kiirendi — arhitektuur, otsused ja kvaliteedikontroll jäävad minu teha.

Sel moel olen iseseisvalt avaldanud KalaRadari ning ehitanud töölauarakendusi ja Linuxi tööriistu. Nende jaoks võtsin kasutusele Rusti ja C#-i. Tehnoloogia pole minu jaoks takistus; mina vastutan selle eest, mida ehitatakse, kas see töötab ja et see jõuaks kasutajateni.

04 — Oskused

Millega ma töötan

AI-tööriistad

Claude Code (igapäevane töövahend), OpenAI Codex, Antigravity; agentide ja multi-agent töövoogude juhtimine.

AI-töövõtted

Spetsifikatsioonide sõnastamine, ülesannete tükeldamine, AI-väljundi kontroll ja testimine, oma skillide loomine AI-tööriistadele.

Tooteni viimine

Docker & Docker Compose, oma domeen ja DNS, Stripe-maksed, E2E-testid (Playwright), seire (Prometheus, pino).

Põhioskused

Toote loomine ideest kasutajateni, probleemide algpõhjuseni kaevamine, uute tehnoloogiate kiire omandamine, vastutus inimeste ees, kes seda iga päev kasutavad. Linux, Git ja terminal igapäevatööriistadena.

Tehnoloogiad

TypeScript, React, Node.js, PostgreSQL, Redis, Rust + Tauri, Unity (C#), Python, GNOME Shell, kerneli HID-BPF.

05 — Põhiprojekt

KalaRadar

SaaS · TypeScript · React · PostgreSQL · kalaradar.ee ↗

Kalastusrakendus, mis ütleb kalastajale, millal ja kus kala võtab: prognoos, ilm, kaardid ja püügipäevik ühes äpis. Prognoosi taga on minu enda ehitatud algoritm, mis on välja töötatud koostöös teadlastega ja arvestab ilmastikutegureid koos nende muutumisega ajas. Viisin toote iseseisvalt ideest kasutajateni ja hoian seda iga päev töös — saadaval Eestis, Soomes, Rootsis ja Norras.

  • 1000+ klienti — igapäevased kasutajad, laekuvad maksed ja vastutus, mida ei saa kellelegi edasi anda.
  • Minu roll: toote visioon, AI-agentide juhtimine, kontroll E2E-testidega, juurutus, klienditugi ja haldus.

Võimalused

  • Interaktiivne kaart tuule- ja ilmakihtidega (Leaflet)
  • Püügiprognoos: ise ehitatud algoritm — õhurõhk, tuul, temperatuur ja niiskus koos nende muutumisega ajas, lisaks kuufaasid ja päikeseajad → 0–10 skoor
  • Püügipäevik fotodega, sõpradega jagamine
  • Sotsiaalvoog postituste ja piltidega
  • Push-teavitused ja automaatsed PDF-arved
  • Stripe-tellimused: kuu/aasta, prooviperiood, kupongid
  • PWA — installitav, töötab ka offline
  • 6 keelt (et, en, fi, sv, no, ru)
  • Pildikonverter: JPEG/HEIC → AVIF (~50% väiksem), R2/S3 hoidla

Turvalisus & vastavus

  • Turvamudel ehitatud OWASP Top 10 järgi
  • GDPR: andmete eksport (art. 15) ja konto kustutamine (art. 17) otse äpist
  • Asukohaandmed krüpteeritud AES-256-GCM
  • Nõusolekute haldus + eestikeelne privaatsuspoliitika (GDPR & E-ITS)
  • Automaatne andmete aegumine: retention-tööd, passiivsete kontode puhastus
  • Auditilogi kriitilistele tegevustele (retry-järjekorraga)
  • JWT + bcrypt, Google OAuth; sessioonipiirangud seadmete kaupa
  • Rate limiting login'ile, API-le ja fotodele
  • Helmet: HSTS, CSP, turvapäised
  • Stripe webhook'ide allkirjakontroll
  • Ühekordsete e-mailide blokeering, sisendi valideerimine
  • Logid parooli/tokeni-redaktsiooniga (pino)

Töökindlus & infra

  • Docker Compose: Bun API, nginx, PostgreSQL 15, Redis 7
  • 67 versioneeritud andmebaasimigratsiooni — skeem on muutunud töötava toote all, ilma andmekaotuse ja seisakuta
  • Cron-tööd: ilm, skoorid, teavitused, tellimuste elutsükkel
  • Prometheus-mõõdikud (p50/p95/p99) + kriitiliste vigade alarmid
  • Playwright E2E testid + CI igal muudatusel
  • Eraldi staging-keskkond, deploy health-check'idega
  • Graceful shutdown, non-root konteinerid

Kelle käes on sinu andmed

  • Kus sa kalal käid, on sinu asi — asukohad on hoiul lukus kujul, neid ei näe ka mina
  • Saad igal hetkel oma andmed endale alla laadida või konto koos kõigega kustutada — otse äpist, ilma minult küsimata
  • Maksed käivad Stripe'i kaudu; kaardinumbrit ma ei näe ega hoia
  • Äpp valvab ennast ise: kui midagi katki läheb, saan teate enne kui sa jõuad seda märgata
  • Enne kui uuendus kasutajani jõuab, mängib arvuti selle läbi nagu päris kasutaja — ja kui midagi on katki, ei lasta uuendust välja

06 — Kliendiprojekt

Goldstock

SvelteKit 5 · Svelte 5 · Tailwind 4 · TypeScript · goldstock.ee ↗

Goldstock OÜ (aiad, väravad, metalltööd) vajas veebilehte ja e-poodi. Viisin selle disainist juurutuseni — avalik sait, täismahus e-pood pangalingi-maksega ning peidetud haldusvaade, kus klient muudab ise sisu, hindu ja kataloogi — ilma minu poole pöördumata ja ilma iga muudatuse eest maksmata. Leht on valmis ja üleval aadressil goldstock.ee; kasutuselevõtt ootab kliendipoolse kolimise lõppu.

  • Klienditöö algusest lõpuni — kliendi bränd, kliendi tooted, töötav e-pood pangalingiga.
  • Minu roll: disain, arendus, makseintegratsioon, turve ja juurutus oma serverisse.

E-pood & maksed

  • Kataloog: 2-tasemeline kategooriapuu, tuhanded tooted (hind, laoseis, soodushind, tarne, kood)
  • Ostukorv + checkout arve- ja tarneandmetega
  • Maksekeskus / MakeCommerce pangalink — Swedbank, SEB jt; EE/LV/LT/FI, makseleht kliendi keeles
  • Server arvutab hinna kataloogist ise — kliendi saadetud hindu ei usaldata
  • Kampaaniad ja soodushinnad
  • Tellimuse staatused: pending → makstud; hinnapakkumise vedu → quote_requested
  • Makseteavituse webhook: MAC-allkirja kontroll, idempotentne
  • Tellimuse viitenumber + e-posti kinnitus (nodemailer)

Klient muudab sisu ise

  • Peidetud admin-rada + dashboard, serveripoolne login
  • scrypt-parooliräsi, allkirjastatud HTTP-only küpsis, stateless HMAC-sessioon
  • Brute-force rate-limiting IP kaupa
  • E-posti 2FA uue seadme / 30 päeva järel (valmis, ootab SMTP-d)
  • WYSIWYG: avaleht, tooted, kategooriad, kampaaniad, tellimused
  • Staged muudatused — kõik kogutakse brauseris, salvestub alles „Rakenda muudatused"
  • „Näita muudatusi" diff-paneel + lisatud/muudetud/eemaldatud loendurid
  • Pildi-üleslaadimine, granulaarne salvestus (ei saada kogu kataloogi iga muudatusega)
  • Live-eelvaade admin-paneelis

Tehnoloogia & infra

  • SvelteKit 5 + Svelte 5 runes, Tailwind 4, TypeScript
  • adapter-node → eraldiseisev SSR Node-server
  • Sisuhoidla: üks tõeallikas saidile + adminile, JSON-failid, aatomiline kirjutus + mutex
  • mtime-põhine cache — mitme protsessi vahel koherentne
  • CSRF-kaitse, turvapäised; prodis fail-closed
  • Vitest ühiktestid + Playwright E2E (admin)
  • 3 keelt (ET/EN/RU)
  • Podman-konteiner Hetzneri serveris, Cloudflare ees

07 — Kliendiprojekt

Tundekoda

Next.js 16 · React 19 · TypeScript · tundekoda.parkproduction.ee ↗

Tundekoda (psühholoogid Tartus ja Tallinnas) kasutas WordPressi ja Elementori peal tehtud lehte. Ehitasin selle asemele oma lahenduse: kujundus on vanalt lehelt üks-ühele üle võetud ja kõik aadressid jäid samaks, nii et Google'i positsioonid ei kao. Sisu muudab klient otse lehe peal — topeltklõps tekstil või pildil, ilma eraldi halduspaneelita. Praegu on leht eelvaatena üleval aadressil tundekoda.parkproduction.ee.

  • WordPress → oma kood: sama välimus, samad aadressid, ilma pluginate ja andmebaasita.
  • Minu roll: vana lehe sisu ja kujunduse ülevõtmine, arendus, lehepealne muutmine, turve ja juurutus oma serverisse.
tundekoda.parkproduction.ee avaleht

Leht

  • Kogu vana lehe sisu üle toodud: 7 inimest, 11 teenust, hinnakiri, 13 blogipostitust, KKK ja 40 tagasisidet
  • Eesti ja inglise keel; aadressid samad mis vanal lehel
  • Kontaktivorm saadab kirja e-postiga — sisu ei salvestata kuhugi
  • Pildid muutuvad üleslaadimisel ise webp-ks ja mitmesse suurusesse
  • Igal lehel oma otsingumootori pealkiri, kirjeldus ja aadress; sitemap
  • Blogipostituse saab jätta avaldamata — see avaneb ainult otselingiga

Klient muudab otse lehel

  • Sisseloginud haldaja näeb lehte nagu külastaja, all on muutmisriba
  • Topeltklõps tekstil — muudad kohe; pikemal tekstil ka paks kiri, kaldkiri ja link
  • Topeltklõps pildil — vahetad pildi
  • Teenuseid, inimesi, hinnaridu ja KKK-d saab liigutada, kopeerida ja kustutada
  • Hinnakirjas on hind ja kestus keelte vahel ühised — muudad ühes, muutub kõigis
  • Tekstimuudatused kogutakse kokku ja lähevad üles nupuga „Salvesta"

Tehnoloogia & infra

  • Next.js 16 (App Router), React 19, TypeScript
  • Ilma CMS-i ja andmebaasita: kogu sisu ühes JSON-failis
  • Aatomiline, järjestatud kirjutus; eelmine versioon jääb .bak-faili
  • Rich text puhastatakse serveris (sanitize-html); välja tüübi otsustab server
  • Login: scrypt-räsi, 5 katset / 15 min IP kohta, 12 h sessioon
  • sharp: webp, max 2400 px + väiksemad suurused
  • Docker Hetzneri serveris, Cloudflare Tunnel ees; öine varundus

08 — Tööaja tarkvara

aitrack

Python · Klient-server · SQLite · tööaja arvestus & arveldus

Tööaja arvestus, mis ei nõua ühtegi käsitsi sisestust. Tööriist loeb iga tund minu Claude Code’i, Codexi, Pi ja OpenCode’i sessioone, valib neist soovitud projektid ning kirjutab iga tunni kohta ühe lühikese eestikeelse kokkuvõtte. Alguses ehitasin selle endale, sest praktikapäeviku täitmine ununes; sellest kasvas klient-server-rakendus, mis töötab aadressil aitrack.parkproduction.ee ja mida saab kasutada terve meeskonna peale.

  • Ettevõttele: tööaeg töötaja kaupa — igaüks näeb ainult oma logi, juhil on ülevaade ja valmis alus arveldamiseks.
  • Token-kulu optimeerimine — mudelipõhine kuluvaade näitab, kuhu tokenid lähevad, et AI-tööd odavamaks timmida.

Mida see teeb

  • Loeb Claude Code, Codex, Pi, OpenCode sessioonid
  • Tunnikokkuvõte 4 väljas (objekt / tulemus / takistus)
  • Väljund: lokaalne CSV või Google Sheets
  • Work-session'id minutitäpse heartbeat'iga
  • Mudelipõhine token-kulu vaade optimeerimiseks
  • Veebipõhine tegevus- ja auditivaade + admin
  • Praktikapäevik ning eksport arveldamiseks
  • Pi-laiendus: promptid ja tool-call'id

Turvalisus & privaatsus

  • Paroolid: PBKDF2-HMAC-SHA256, 260k iteratsiooni
  • Sessioonid SHA-256 räsina, HttpOnly küpsis
  • Token-auth (API/CLI) + ühekordsed installikoodid
  • Projekti-allowlist ainult kasutaja enda terminalist
  • Rate-limit + IP-ban probe'idele (/.env, /.git)
  • security_events audit: loginid, admin, bannid
  • Promptid vaikimisi vaid metadata, mitte tekst
  • Eksport redigeerib saladused; failid 0o600

Töökindlus & infra

  • Python 3.9+, ainult standardteek (0 sõltuvust)
  • SQLite (WAL), 3NF skeem ~17 tabelit
  • Idempotentne UTC-tunni võti; DST-kindel
  • Lukk (O_EXCL) + atomaarne kirjutus
  • Järelejõudmine 48h; systemd / launchd / Task Sch.
  • Watchdog: stale / stuck tuvastus
  • Retention-cleanup + sleep-gap-teadlik eksport
  • Kliendi sunduuendus; Docker; 128 automaattesti, mis käivad enne iga väljalaset

Miks see usaldusväärne on

  • Vestluste sisu ei salvestata — kirja läheb ainult see, millal ja kui kaua tööd tehti
  • Igaüks näeb ainult oma logi; ülevaade on selle käes, kes tööd tellib
  • Tund jääb kirja täpselt üks kord, ka siis kui arvuti vahepeal magama läks või võrk ära kadus
  • Kui arvuti oli päev otsa kinni, korjab tööriist ise puuduva tagantjärele üles
  • Töötab ilma ühegi võõra lisakomponendita — vähem osi, vähem asju, mis katki minna saavad

09 — Võistlusprojekt

Kestvuskell

Kotlin · Jetpack Compose · Wear OS · Galaxy Watch 4

Kestvusratsutamises ei võida kiireim. Rajal on kiirusel nii alam- kui ka ülempiir: liiga aeglaselt sõites ei jõua lubatud aja sisse; liiga kiiresti sõites võib järgneda diskvalifitseerimine või ei pruugi hobune veterinaarkontrolli läbida. Ja oluline number ei ole hetkekiirus, vaid keskmine — see, mis seisab ekraanil finišijoone ületamise hetkel. Peast seda traavis ei arvuta keegi: spordikellad näitavad hetkekiirust, Samsungi treeningrežiim mõõdab distantsi sammudest ja hobuse seljas valetab. Nii sai Galaxy Watch 4 oma tempoäpi — üks ekraan, üks suur number ja üks värv, mis vastavad ainult ühele küsimusele: kiirendada või aeglustada?

  • Esimene võistlus selle äpiga tõi võidu koju.
  • Tingimused: 18 km, üks ring, 8–16 km/h, keskmine ei tohi ületada 16,0. Kell jälgib tempot, ratsanik juhib hobust.
Kellaekraan enne starti: stardiaeg 13:30, 2:19 stardini, GPS 9/14 satelliiti, START-nupp
Enne starti — 9 satelliiti, täpsus 6 m. Autostart käib seinakella järgi.
Roheline rõngas, keskmine kiirus 15,3 km/h, hetketempo 16,1 km/h, jäänud 9,8 km
Roheline — keskmine 15,3. Sweet spot, hoia seda.
Punane rõngas, keskmine kiirus 16,4 km/h, hetketempo 17,8 km/h, jäänud 12,0 km
Punane — keskmine 16,4, üle piiri. Aeglusta.
Viimane kilomeeter: keskmine 15,5 km/h ja varaseim lubatud finišiaeg EI ENNE 14:37:30
Viimane kilomeeter — jäänud distantsi asemel varaseim lubatud finišiaeg.

Ekraanipildid on renderdatud äpi enda paigutusnumbrite järgi (396×396 px, samad fondid ja värvid) — renderdaja on repos kaasas.

Otsused, mis tulevad sadulast

  • Rõngas värvub ainult keskmise järgi — hetkekiirus 18 km/h ei ole viga, keskmine 16,1 on
  • Iga tsoonivahetus vibreerib (roheline 1 lühike, kollane 2, punane 1 pikk) — sadulas ekraani ei vaata
  • Lõpetamiseks tuleb sõrme 5 sekundit ekraanil hoida; puudutusest ei piisa, sest traavis läheb käsivars kergesti kogemata vastu ekraani
  • Autostart täpselt 13:30:00 seinakella järgi; tühistamine ainult aknas 13:30–13:45

Mida päris rada õpetas

  • GPS ülehindab metsas distantsi 2–5% → kalibratsioonitegur treeningsõidust samal rajal
  • Asukohapunktid täpsusega üle 15 m jäetakse kõrvale, alla 1,5 m liikumist ei loeta
  • Watch 4 ei tuvasta ilma telefonita ajavööndit ja kukub GMT peale — äpp arvutab UTC + nihke pealt
  • Satelliitide arvu fused provider ei anna — see tuleb eraldi GnssStatus.Callback-ist

Tehnoloogia

  • Kotlin + Jetpack Compose for Wear OS
  • Esiplaani teenus pideva GPS-iga; Play Services fused provider
  • Distants arvutatakse toorest asukohast ise, oma filtritega
  • Kõik numbrid ühes failis (RideConfig.kt) — distants, kiirusepiirid, värvitsoonid
  • Kellal kontrollitud: Galaxy Watch 4 (SM-R860), Wear OS / Android 13

10 — Olemasolevad süsteemid

Sul on juba süsteem, mis vajab parandamist

Kõik ei alga nullist. Sagedasem olukord on see, et süsteem on juba olemas, aga tegija on kadunud, kood on aastatega kasvanud ja iga muudatus tundub riskantne. Just seda tööd olen praktikal iga päev teinud: 82 commit'i viies eri tootmissüsteemis, kõik läbi töövoo issue → haru → pull request → review → merge. Võõra koodibaasi läbilugemine enne muutmist on omaette oskus.

Kutsekooli õppeinfosüsteem

PHP · MySQL · avatud lähtekood · 38 commit'i

Veebirakendus kutsekoolide IT-erialade sisseastumiskatsete ning iseseisvate tööde esitamiseks ja hindamiseks. Minu töö ulatub liidese parandustest õpiväljundite visualiseerimiseni.

Ettevõtte eelarve- ja haldustarkvara

PHP · Docker · CI · 26 commit'i

Puhastusteenuste ettevõtte sisemine eelarve- ja haldussüsteem — suur, aastaid kasvanud koodibaas. Iga muudatus mõjutab kellegi igapäevatööd, seega peab parandus olema kitsas ja kontrollitud.

Piletivalideerija (Android)

Kotlin · Android · Bitbucket Pipelines · 8 commit'i

Androidi äpp, millega kontrollitakse pileteid kohapeal. Kasutaja töötab mürarikkas keskkonnas ja kiirustab, seega on oluline, et aktiivne keel oleks ekraanil kohe näha.

Töötervishoiu süsteem

PHP · Docker · 8 commit'i

Töötervishoiu ja -ohutuse sertifikaatide haldus. Üks minu parandustest puudutas aegunud sertifikaatide eemaldamist — valdkonda, kus vale tingimus võib kustutada andmeid, mida ei tohi kustutada.

Õpetaja brauserilaiendus

JavaScript · brauserilaiendus · 2 commit'i

Laiendus riiklikule õppeplatvormile, mis automatiseerib õpetaja korduvaid samme ja sünkroonib andmed õppeinfosüsteemi. Üks minu panus oli revert — tagasivõtt on ka otsus.

11 — Projektid

Mida olen ehitanud

VibeIDE

Tauri 2 · Rust · React

Tavalised IDE-d on ehitatud käsitsi koodi kirjutamise ümber — AI-agentidega töötades on vaja hoopis mitut terminali kõrvuti ja ülevaadet, mida agendid parasjagu muudavad. Ehitasin endale töölaua-IDE just selle töövoo jaoks: paralleelsed terminalid agentidele, projektiteadlik failipuu, Giti olek reaalajas. Rustis — keel, mille võtsin kasutusele just selle projekti jaoks.

Mapping

Svelte 5 · Google Maps · DJI WPML

Kinnisvara 3D-mudelite (fotogramm-meetria) jaoks tuli drooni lennuplaane DJI äpis käsitsi klõpsida — aeglane ja vigaderohke. See tööriist joonistab lennutsoonid ja takistused kaardile, genereerib nadir/oblique võrgustikud + orbiidid ning ekspordib valmis missiooni DJI .kmz formaadis otse drooni.

FCF — Fish Calendar & Forecast

Expo / React Native · Fastify

KalaRadar töötab Eestis. FCF on sama idee üleilmne versioon: mobiilne kalastusäpp (iOS + Android), mis töötab ka levita. See ühendab offline-first püügipäeviku, liikide kalendri, ilma ja söögiisu-skoori iga maailma nurga jaoks.

KalaRadar Admin

Kotlin · Android · Hilt

Toote haldus (kasutajad, tagasiside, sisu) käis enne ainult arvutist. Native Android äpp teeb sama telefonist — saan KalaRadarit hallata kõikjal, kus parasjagu olen.

VirtualFishing

Unity 6 · C# · OpenXR · Meta Quest 3

VR-kalastusmäng, kus miski ei ole ette animeeritud: kala jõud liigub mööda nööri ujukini, nöör tuleb rullilt, mitte õnge otsast, ja jookseb läbi ridva enda rõngaste. Ligi kolmkümmend rulli on modelleeritud ning nende pooli, kaare ja nöörirulliku asukoht mõõdetakse mudeli geomeetriast — seega töötab sama loogika igal rullil. Ehitatud AI abiga ilma varasema Unity- või mängudearenduse kogemuseta.

GroundForce

Unity 6.4 · OpenXR · Quest 2/3 · PCVR

VR-lahingumäng suures mahus — 30 vs 30 mängijat. Arenduses. Kogu stseen ehitatakse koodist, mitte käsitsi redaktoris: üks funktsioon ehitab mängija, käed, mugavusseaded ja relvad, nii et sama asja ei hoita kahes kohas. Testin peakomplektiga — iga testiring annab nimekirja vigadest, mille põhjused peituvad tavaliselt hoopis mujal kui sümptomid.

Koduserver

Linux · Self-hosted · Pi-hole · NFS

Ehitasin koju oma füüsilise serveri — KalaRadari staging-keskkonna ning muude rakenduste ja veebilehtede hostimiseks. Pi-hole blokeerib reklaamid kogu koduvõrgus DNS-tasemel ning ~20 TB salvestusruumiga failiserver hoiab andmed minu enda käes (NFS-jagatud), mitte kellegi teise pilves. Riistvara ja andmed täielikult minu kontrolli all.

12 — Tööriistad

Tööriistad, mida ehitan endale

Iga tööriist lahendab mu enda mure — osa on avalikud GitHubis, osa (veel) ainult oma masinas.

claude-skill-sos ↗

Claude Code skill

Kui AI-agent jääb silumisel ringiratast käima, on vaja värsket pilku. See skill töötab ringidena: üks koordineeriv peaagent saadab korraga appi mitu uurimisagenti. Nende parandusettepanekutest valitakse parim ning vajadusel järgneb uus ring.

ELAN Stylus Boost

HID-BPF (kernel) · GNOME Shell

HP sülearvuti pliiatsi sisendsagedus oli Linuxis ~20 Hz (Windowsis ~133) — joonistamiseks kasutuskõlbmatu. Uurisin välja algpõhjuse (I2C-siini küllastus) ja kirjutasin kerneli HID-BPF programmi: ~20 Hz → ~73 Hz. Lüliti ülapaneelil.

cpu-gpu-daemon ↗

Python · GNOME Shell · systemd · Intel xe

CPU, GPU, RAM, temperatuur ja ketas GNOME top-baris. Täielikult kohandatav — klõps avab seaded (värskendussagedus, näidud, ketta tee, sildid). Raske /proc/*/fdinfo lugemine käib systemd-daemonis, et Shell ei hakiks; GPU% tsüklite deltast (idle 68% → ~2%). Avatud lähtekoodiga (MIT), Intel Arc xe.

pic-to-text ↗

C# · .NET 8 · Windows OCR

Ekraanil olev tekst, mida ei saa valida — pilt, PDF, videokaader. Shift+Win+D, tõmba kast ümber teksti ja see on lõikelaual. Tuvastus käib Windowsi enda OCR-iga seadmes endas — ekraanipilti ei saadeta kuhugi. Avatud lähtekoodiga.

Märkmik

GNOME Shell · GJS

Kalender, todo ja kiirmärkmed olid laiali eri äppides. Nüüd on kõik ühe klõpsuga ülapaneelist avanevas külgpaneelis: kalender, sündmused, prioriteetidega todo ja märkmed.

clipboard-history

Python · GTK4 · D-Bus

GNOME-l polnud korralikku lõikelaua ajalugu — tahad näha, mida kleebid, enne kui kleebid. Super+V avab valija live-eelvaatega (tekst või pilt), Enter kleebib otse eelmisse aknasse.

Drawboard

Tauri 2 · Svelte 5

Kiire kohalik tahvel ideede visandamiseks — ilma veebiteenuse, konto ja internetita. Joonistuslõuend, elemendikihid ja lehepuu. Arenduses.

gnome-screenshot-clipboard ↗

GNOME Shell · Wayland

Waylandil ei jõua ekraanipilt automaatselt lõikelauale, mistõttu ei saa seda kohe vestlusesse kleepida. See laiendus saadab iga ekraanipildi otse lõikelauale.

hp-omnibook-mute-leds ↗

Bash · ALSA · systemd

HP sülearvuti vaigistus-LED-id Linuxis ei töötanud — kunagi ei teadnud, kas mikrofon on päriselt kinni. HDA COEF/GPIO parandus systemd-teenusena sünkroniseerib LED-id tegeliku olekuga.

snake-screensaver ↗

Python · GNOME

OLED-ekraan vajab kaitset, aga tühi must ekraan on igav. Madu mängib ennast ise ja hoiab pikslid liikumises; idle-daemon käivitab selle automaatselt.

Linux-tweakid

Bash · sysfs · ydotool

Väikesed igapäevamured: läptop läheb süles kuumaks (CPU võimsuslüliti 60/100%), kasutu Copilot-klahv (remap terminali tab'iks), CPU temperatuur silme ees. Kõik klahvi kaugusel.

13 — Haridus & kontakt

Võta ühendust

[email protected]

+372 5347 4429

github.com/parkkarl — 36 repositooriumi: igapäevane töö, mitte üks näidisprojekt

Viljandi Kutseõppekeskus

Tarkvaraarendus · 2026 – praegu

Asukoht

Tartu — kohtume kohapeal või Zoomis. Töötan üle Eesti.

Keeled

Eesti keel (emakeel) · Inglise keel (hea; töötan AI-tööriistadega inglise keeles)