Siirry sisältöön

Projektit

Valitut työt

Projektit

Projektini. Työpöytänäkymässä ne näkyvät interaktiivisena aurinkokuntana — tässä luettavana listana.

  • HRM

    live

    Full-stack HR-järjestelmä

    HR-järjestelmä, jossa tylsät osat on tehty kunnolla. Jokainen muutos kirjataan lokiin, johon voi vain lisätä, ja jokainen merkintä allekirjoitetaan edellistä vasten. Jos joku sorkkii historiaa, admin-päätepiste käy ketjun läpi ja kertoo, missä merkinnässä se katkesi. Tietokantoja on kaksi, koska henkilödata ja auditointidata haluavat eri asioita. Nopeusrajoitus pyörii Postgresissa, joten erillistä Redisiä ei tarvitse pitää hengissä.

    • 2910 testiä
    • 92,2 % kattavuus
    • Auditloki paljastaa peukaloinnin

    Integraatiot

    • Google OAuth
    • GitHub OAuth
    • Sentry
    • OpenTelemetry
    • Next.js
    • React
    • TypeScript
    • PostgreSQL
    • MongoDB
    • Prisma
    • MUI
    • Jest
    • Playwright
    • Docker
    • GitHub Actions
    • Zod
    • NextAuth
    • next-intl
    • ReactFlow
    • Pino
    • pg-boss
    • Anthropic API
    • Stryker
    • OpenTelemetry
    • Sentry
    • Vercel
  • Platform

    live

    Yhteisöalusta HRM:n päällä

    World of Warcraft -killan yhteisösivusto, joka pyörii osoitteessa vuohiliitto.com. HRM on mukana git-alimoduulina, joten tilit, oikeudet ja auditointi tulivat valmiina ja loput rakennettiin päälle. Jäsenet keräävät XP:tä ja tasoja, juttelevat välilehtichatissa oikeine kuiskauksineen ja kokoavat Mythic+ -tiimejä hakemalla hahmojen tiedot Raider.IO:sta. Uusi jäsen saa opastetun kierroksen, ei seinällistä nappeja.

    • Oikeita käyttäjiä
    • 1388 testiä
    • HRM alimoduulina

    Integraatiot

    • Raider.IO API
    • Google OAuth
    • GitHub OAuth
    • GitHub API
    • Turborepo
    • Next.js
    • React
    • TypeScript
    • PostgreSQL
    • Prisma
    • NextAuth
    • MUI
    • Playwright
    • Jest
    • next-intl
    • Zod
    • framer-motion
    • Vercel
  • Portfolio

    wip

    Tämä sivusto

    Sivusto, jota luet juuri nyt. Täysin staattinen, mikään palvelin ei tee mitään ovelaa. Projektisivu on aurinkokunta, jota voi pyöritellä, etusivu on hiukkaskenttä, joka järjestäytyy jatkuvasti uusiksi, ja yhteyssivulla on terminaali, johon voi kirjoittaa. Animaatiokokeilut asuvat täällä, jotta tuotantosovellusten ei tarvitse kantaa niitä.

    • Astro
    • Three.js
    • GSAP
    • TypeScript
    • Tailwind CSS
    • postprocessing
    • FastAPI
    • pgvector
    • fastembed
    • lingua
    • asyncpg
    • Tailscale Funnel
    • Docker
    • GitHub Actions
    • CodeQL
    • Vitest
    • Playwright
    • pytest
    • Sentry
  • ReadLog

    live

    Pidä kirjaa lukemistasi kirjoista

    Lukupäiväkirja. Hae kirja, kerro luitko sen paperilla, e-kirjana vai kuuntelitko, anna arvosana, valmis. Haku kysyy Open Librarya ja Google Booksia yhtä aikaa ja yhdistää vastaukset, koska kummallakaan ei ole kaikkea. Julkinen syöte näyttää, mitä muut ovat saaneet luettua viime aikoina, ilman nimiä.

    • 90 testiä
    • Hakee kahdesta kirja-API:sta kerralla

    Integraatiot

    • Open Library
    • Google Books
    • Google OAuth
    • Next.js
    • React
    • TypeScript
    • Prisma
    • PostgreSQL
    • NextAuth
    • MUI
    • Jest
    • Neon
    • Vercel
  • ReadLog .NET

    live

    ReadLog uusiksi .NETillä

    Sama lukupäiväkirja kirjoitettuna alusta asti uudelleen ASP.NET Corella, jotta selviäisi mitä porttaus oikeasti maksaa. Razor Pages Reactin tilalla, EF Core ja SQLite Prisman ja Postgresin tilalla. Pyörii Azuren ilmaistasolla, eli sovellus nukahtaa kahdenkymmenen minuutin päästä ja ensimmäinen käynti on hidas. Repoon on kirjattu jokainen kohta, jossa .NETin tapa ja Next.jsin tapa olivat eri mieltä.

    • Sama sovellus, toinen pino
    • Azuren ilmaistaso
    • Muistiinpanot joka valinnasta

    Integraatiot

    • Open Library
    • Google Books
    • Google OAuth
    • .NET 8
    • ASP.NET Core
    • Razor Pages
    • EF Core
    • SQLite
    • ASP.NET Identity
    • Bootstrap 5
    • xUnit
    • Docker
    • GitHub Actions
    • Azure App Service
  • AudiobookMaker

    wip

    Tekee kirjoista äänikirjoja

    Työpöytäsovellus, joka lukee PDF-, EPUB- tai Word-tiedoston ääneen ja tallentaa sen äänikirjaksi. Skannatut kirjat ajetaan ensin OCR:n läpi. Ääntä varten on neljä moottoria sen mukaan, haluatko ilmaisen, offline-version vai äänen, joka on kloonattu lyhyestä puhenäytteestä. Suomi on se vaikea osa, joten se siivotaan yhdeksässätoista vaiheessa ennen kuin sanaakaan lausutaan: suomen puhesynteesi sotkee numerot ja lyhenteet hyvin ennustettavilla tavoilla. Jaetaan Windows-asennuspakettina, jossa kaikki on mukana.

    • 3000+ testiä
    • Yhdeksäntoista siivousvaihetta suomelle
    • Ääninäyttelee Spacepotatiksen tarinan

    Integraatiot

    • Microsoft Edge-TTS
    • Python
    • PyMuPDF
    • ebooklib
    • ocrmypdf
    • Tesseract
    • num2words
    • edge-tts
    • Piper
    • Chatterbox
    • VoxCPM2
    • PyTorch
    • CustomTkinter
    • pydub
    • pygame
    • ffmpeg
    • PyInstaller
    • Inno Setup
    • GitHub Actions
    • Qwen VoiceDesign
    • pytest
  • Spacepotatis

    live

    Selainräiskintä: perunasi vastaan galaksi

    Selainpeli, jossa suojakuplassa istuva peruna ampuu ötököitä. Peli käynnistyy kuin vanha terminaali, avautuu 3D-aurinkokunnaksi, jota voi pyöritellä, ja pudottaa sitten ylhäältä kuvattuun taisteluun. Kaikki musiikki tulee strudel-patterns-reposta ja kaikki puhe AudiobookMakerista, kertojana Grandmom. Toukokuussa pelaajalta katosi tallennus, koska huijauksenesto tarkisti, etteivät luvut kasva liian nopeasti, mutta ei koskaan sitä, olivatko ne kutistuneet. Siitä tapauksesta on kirjoitettu runbook.

    • ~1170 testiä
    • Oma musiikki ja puhe
    • Häiriöstä on runbook

    Integraatiot

    • Google OAuth
    • Next.js
    • React
    • TypeScript
    • Phaser 4
    • Three.js
    • GSAP
    • PostgreSQL
    • Kysely
    • NextAuth
    • Tailwind CSS
    • Zod
    • Neon
    • Vercel
    • Vitest
  • Strudel Patterns

    live

    Algoritmista musiikkia koodina

    Musiikkia Strudelilla, jossa kokonainen kappale on yksi JavaScript-lauseke, jota muokataan sen soidessa. Rummut, basso, syntikkakerrokset ja efektit ovat erillisiä palasia, joita voi pinota uusiksi kappaleiksi. Yhdeksän on kirjattu ylös, ja osa niistä päätyi Spacepotatiksen ääniraidaksi ja tämän etusivun musiikiksi. Jokainen sessio kirjataan git-historian rinnalle, joten kappaleen synnyn voi jäljittää.

    • Yhdeksän valmista kappaletta
    • Soi Spacepotatiksessa ja tällä sivustolla
    • Strudel
    • JavaScript
    • Web Audio API
    • Claude Code
  • claude-continue

    wip

    Pitää Claude Coden käynnissä putkeen

    Claude Code toimii viiden tunnin ikkunoissa. Tämä odottaa, että ikkuna vaihtuu, ja käynnistää seuraavan, joten aikaa ei valu hukkaan sillä välin kun nukut. Pythonia ilman ainuttakaan riippuvuutta, pyörii valvomatta launchd:n tai Task Schedulerin kautta, ja tarkistaa ennen kuin kirjoittaa mitään, ettei istunto ole kesken ajatuksen. README myöntää suoraan, että näin työskentely kasvattaa kasaa koodia, jota kukaan ei ole vielä katselmoinut.

    • Ei riippuvuuksia
    • macOS, Windows, WSL, Linux
    • Pyörii valvomatta
    • Python
    • Tkinter
    • ccusage
    • PyInstaller
    • launchd
    • Task Scheduler
    • tmux
    • GitHub Actions
  • PasswordManager

    wip

    Nollatietoinen salasananhallinta Rustilla

    Kaikki salaus asuu yhdessä Rust-cratessa. CLI, selainversio, synkronointipalvelin ja Chrome-laajennus käyttävät samaa cratea käännettynä joko natiivisti tai WebAssemblyksi, joten mokattavaa on vain yhdessä paikassa. Palvelin näkee pelkkää salatekstiä. Lukituksen avaaminen kestää tahallaan noin 430 millisekuntia, koska avaimen johtaminen on viritetty reilusti kirjaston oletuksia kireämmälle. README listaa myös viisi asiaa, joilta se ei suojaa, mikä tuntui hyödyllisemmältä kuin teeskentely.

    • Yksi salauscrate, neljä sovellusta
    • Palvelin näkee vain salatekstiä
    • Avaus ~430 ms, tarkoituksella

    Integraatiot

    • Google OAuth
    • Tailscale Funnel
    • Cloudflare Tunnel
    • Rust
    • WebAssembly
    • Tokio
    • SQLite
    • Argon2id
    • XChaCha20-Poly1305
    • wasm-bindgen
    • Chrome Extension (MV3)
    • JavaScript
    • GitHub Actions
    • axum
    • zeroize
  • claude-agents

    live

    Halvemmat mallit tylsiin töihin

    Neljätoista Claude Code -subagenttia, joista jokainen on kiinnitetty halvimpaan malliin, joka homman osaa. Lukeminen ja raportointi menee Haikulle, mekaaniset muokkaukset Sonnetille, ja vain suunnittelutyö saa kalliin mallin. Jokainen agentti selvittää itse, mitä repo käyttää, joten sama setti kattaa JavaScriptin, C#:n ja Pythonin ilman konfigurointia. Kaksi agenteista on olemassa siksi, että eräs katselmointityönkulku kulutti vaivihkaa 3,8 miljoonaa tokenia väärällä hinnalla.

    • 14 malliin kiinnitettyä agenttia
    • Sekä malli että päättelyteho kiinnitetty
    • MIT-lisenssi
    • Claude Code
    • Claude Haiku
    • Claude Sonnet
    • Claude Opus
    • Bash
    • Markdown
  • Feedback Intelligence

    live

    Lukee asiakaspalautetta keksimättä omiaan

    Ottaa sotkuisen vapaan tekstipalautteen ja tekee siitä jotain, jonka pohjalta esihenkilö voi toimia. Kiinnostavinta on, miten vähän siitä on AI:ta: malli siistii ihmisten kirjoitukset ja etsii kasasta teemat, loput on tavallista koodia. Hälytykset ovat avainsanahakuja. Sentimentti on peruslaskentoa. Suomenkielinen malli pyörii kotikoneella, joten hostaus ei maksa mitään. Jokainen päätös siitä, mihin AI päästettiin, on kirjattu ylös, myös ne neljä kierrosta, joilla sitä väännettiin takaisin pois.

    • AI tasan kahdessa paikassa
    • Suomi edellä, pyörii paikallisesti
    • Hostaus ei maksa mitään

    Integraatiot

    • Tailscale Funnel
    • .NET 8
    • C#
    • SQLite
    • Ollama
    • Poro 2 8B
    • Microsoft.Extensions.AI
    • xUnit
    • Docker
    • Node.js
    • Azure Static Web Apps
    • Azure Functions
    • GitHub Actions
    • CodeQL