Projektit
Valitut työt
Projektit
Projektini. Työpöytänäkymässä ne näkyvät interaktiivisena aurinkokuntana — tässä luettavana listana.
-
HRM
liveFull-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
liveYhteisö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
wipTä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
livePidä 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
liveReadLog 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
wipTekee 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
liveSelainrä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
liveAlgoritmista 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
wipPitää 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
wipNollatietoinen 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
liveHalvemmat 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
liveLukee 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