Projektit — 2025 — jatkuu
Pinsku — henkilökohtainen AI-assistentti ja -ERP
Lokaali tekoäly, joka yhdistää kalenterin, sähköpostit, terveysdatan ja työajan analytiikan — data ei poistu omalta laitteelta
Henkilökohtainen tietotyökuorma hallintaan yhdellä työkalulla — chat, tehtävät, kalenteri, terveys, työaika ja strateginen sparrailu — täysin lokaalisti ilman pilveä.
Aikajakso
2025 — jatkuu
Tekninen pino
- Node.js 24 + Express + SSE
- better-sqlite3 + sqlite-vec (embedding-haku)
- Ollama (qwen + gemma3:31b)
- Whisper (STT) + Chatterbox (TTS)
- bge-m3 embeddings (1024-dim)
- Microsoft Graph (kalenteri, mail, tehtävät)
- Oura Ring + Garmin + ActivityWatch
- Tailscale (pelkkä privaatti verkko)
- PWA + push-ilmoitukset + offline
- systemd user services + NDJSON audit-loki
- 01
19 aikataulutettua taustaworkeria ja 23 LLM-tool-toimintoa yhdessä järjestelmässä — chat, kalenterihaku, tehtävänluonti, sparri, sääntöhaku ja kontaktibriefit kaikki samassa rajapinnassa
- 02
Työaikaanalytiikka 20+ kortilla: kuorma-indeksi, fokusblokit, fragmentaatio, 7×24-heatmapit, 9-muuttujan korrelaatiomatriisi ja tavanmuutosten automaattinen tunnistus 14 pv vs. edelliset 14 pv -vertailulla
- 03
Outbound-gate: LLM ehdottaa — ihminen päättää. Ei autonomista lähetystä, jokainen viesti hyväksytään erikseen, whitelist-säännöt auto-hyväksynnälle
- 04
Kaikki data lokaalisti: Ollama omalla GPU:lla, SQLite kotikoneella, Tailscale-verkko laitteiden välillä — ei OpenAI-kutsuja, ei pilveä, ei analytiikkaa
- 05
Puheohjaus päästä päähän: Whisper kuuntelee, LLM päättelee, Chatterbox puhuu vastauksen — kaikki lokaalissa LAN:issa alle sekunnin latenssilla
- 06
Burnout-ennaltaehkäisy dataan perustuen: shutdown-rituaali klo 17, viikon kehysbrief pe 16, palautumisväli-ehdotus korrelaatiomatriisin perusteella
Lähtötilanne
Järjestöjohtajan tietokuorma on moninainen: kaksi kalenteria, kolme sähköpostiväylää, kymmeniä aktiivisia sidosryhmiä, päätöksiä joiden perustelut pitää muistaa kuukausien päähän, viranomaisviestejä jotka vaativat reagointia tuntien sisällä, terveys- ja palautumisdataa jota kukaan ei oikeasti ehdi lukea, ja kattava työaikaanalytiikka jonka voisi tehdä mutta jota mikään olemassa oleva työkalu ei tee ymmärrettävästi.
Kaupalliset ratkaisut (Notion, ChatGPT, Microsoft Copilot, Motion, Reclaim) tekevät osan tästä — mutta kaikki lähettävät dataa pilveen, osa jopa mallinkoulutukseen, ja yksikään ei yhdistä kalenteria + sähköpostia + terveyttä + toteutunutta työaikaa samaan analyysimalliin. Privacy-kompromissi oli kestämätön, ja fragmentaatio söi enemmän aikaa kuin yksittäinen työkalu pystyi säästämään.
Tehty ratkaisu
Rakensin Pinsku-nimisen paikallisen AI-assistentin, joka elää Tailscale-verkossa omalla Ubuntu-palvelimella ja vastaa selaimeen PWA-sovelluksena (työpöytä, iPhone, iPad). Järjestelmä yhdistää 10 isoa toiminnallisuusaluetta yhteen koherenttiin kokonaisuuteen.
Ydinominaisuudet
- Keskustelurajapinta — teksti ja ääni (Whisper STT → LLM → Chatterbox TTS). Tool calling 23 työkalulla: kalenterihaku, tehtäväluonti, päätösmerkintä, sparrailu, sääntöhaku, kontaktibriefit. Muistit vektorihakuna (sqlite-vec + bge-m3).
- Tehtävänhallinta — sähköpostista tehtäväksi yhdellä klikillä, LLM ehdottaa otsikon, prioriteetin ja eräpäivän. Deadline-puskuri: ulkoinen DL miinus arkipäiviä, koska delegoitu työ tarvitsee aikaa organisaatiossa.
- Kalenteri ja sähköposti — Microsoft Graph kahteen kalenteriin ja kolmeen postilaatikkoon. Post-meeting capture: päättyneistä kokouksista pyydetään puhuttu tiivistys, LLM rakenteistaa päätöksiksi ja tehtäviksi.
- Terveys- ja työhyvinvointidata — Oura Ring (OAuth2), Garmin Connect, ActivityWatch (Mac), pmset (kannen avaus/sulku). Päivittäinen ja viikoittainen LLM-analyysi korreloi ruutuaikaa, palautumista, unta ja HRV:tä.
- Työaika-analytiikka (tärkein uusi moduuli) — 20+ korttia: kuorma-indeksi 0–100, viikonlopun lepo, fokusblokit, fragmentaatio, chronotype, heatmapit viikon 7×24 ja palaveritiheys DOW×hour. Korrelaatiomatriisi 9 muuttujaa (ruutuaika, palaverit, fokus, iltatyö, uni, valmius, HRV, askeleet, app-vaihtelu). Tunnistaa merkitsemättömät palaverit (Teams/Zoom-sessiot joita ei ole kalenterissa) ja ehdottaa tavanmuutoksia 14 pv vs. 14 pv -vertailulla.
- Decision Journal — päätökset kontekstista, perusteluista, hylätyistä vaihtoehdoista ja arviointipäivämääristä. Cron-workeri palauttaa päätökset tarkasteluun 3/6/12 kk päästä.
- Sparri (Devil’s Advocate) — käyttäjä esittää ajatuksen, Pinsku argumentoi vastaan käyttäen käyttäjän oman historian päätöksiä ja korrelaatiomatriisin dataa lähteenä.
- Reaaliaikainen hälytys — hel.fi viranomaisviestit 2 min välein, järjestökenttä (akava.fi, ytn.fi, juko.fi) 5 min välein. Erilliset bannerit, hiljaiset tunnit huomioidaan eri tavoin kriittisyystason mukaan.
- Outbound-gate — LLM ei koskaan lähetä itse. Kaikki lähtevät menevät
propose_*-tooleilla jonoon, käyttäjä hyväksyy manuaalisesti. Whitelist-säännöt sallivat tiettyjen toistuvien toimintojen auto-hyväksynnän. - Kehitysbacklog — UI:ssa dev_backlog-näkymä, cron-workeri lukee avoimia itemejä ja ajaa LLM:llä toteutuksen omaan git-branchiin → käyttäjä mergei UI:sta.
Arkkitehtuurin kannalta
- Lokaali ensin. Ollama (qwen-fast chatiin, gemma3:31b heavy-analyysiin), SQLite, bge-m3 embedding — kaikki samalla koneella. Microsoft Graph -tokenit lokaalissa .env:ssä, eivät koskaan pilveen.
- Tailscale-yksityinen verkko. Ei julkista internet-osoitetta, ei reverse proxyä. Puhelin, Mac ja palvelin puhuvat suoraan Tailscale-nodejen välisellä yhteydellä.
- PWA + push. Selaimessa asennettava sovellus offline-kyvyllä, push-ilmoitukset Web Push Protocolilla (VAPID) — ei FCM:ää, ei Applen pilveä välikätenä.
- 23 tool-toimintoa yhden LLM-rajapinnan takana. Kalenterihaku, sääntöhaku, brief, sparri, tehtäväluonti, päätösmerkintä, kontaktibriefi — kaikki tool callingilla. Malli päättää milloin mitäkin kutsuu, käyttäjä näkee lokista.
- 19 aikataulutettua workeria systemd user servicenä — aamubrief 8:00, post-meeting 15 min, shutdown-rituaali 17:00 (skippaa la–su), viikkobrief pe 16:00, hel.fi-watch 2 min, ja 14 muuta.
- Audit-loki NDJSON-muodossa jq-suodattimilla — jokainen LLM-kutsu, tool call, lähetetty viesti ja päätös on jäljitettävissä.
- Privacy-maski screenshoteja varten —
?privacy=1-URL-parametri sumentaa lähettäjät, aiheet ja sisällöt, hover paljastaa omalle käyttäjälle. Ulkopuolisille voidaan näyttää rakenne ilman sisältöä.
Lopputulos
Pinsku on pyörinyt tuotantokäytössä (yhdellä käyttäjällä, minulla itselläni) vuodesta 2025 ja kasvaa edelleen. Se on muuttanut tapaa jolla johdan omaa työpäivääni:
- Tieto yhdessä paikassa. Sähköposti, kalenteri, tehtävät, päätökset, sääntöhaut, terveys ja työaika löytyvät yhdestä PWA:sta — eikä data koskaan lähde koneelta.
- Proaktiivinen burnout-ennaltaehkäisy. Kuorma-indeksi, palautumisväli-ehdotukset ja tavanmuutosten tunnistus näyttää hiljaiset trendit ennen kuin ne muuttuvat oireiksi. Data-perusteinen, ei “nuku enemmän” -neuvo.
- LLM käytännön tool-käytössä. 23 toolin tool calling -arkkitehtuuri näyttää että LLM ei ole kaikkitietävä oraakkeli vaan tehokas välittäjä käyttäjän ja oikean datan välillä. Vastaukset grounded, ei hallusinaatioita.
- Outbound-gate ihmisen päätöksenä. LLM ei koskaan lähetä itse — tämä on design-valinta joka tekee järjestelmästä turvallisen käyttää korkean kontekstin työssä (päätökset, sidosryhmät, viranomaiskontaktit).
- Arkkitehtuurin referenssimalli. Lokaali LLM + Microsoft Graph + tool calling + audit-loki + Tailscale on toistettavissa muille tietotyöläisille joilla on samanlaisia privacy- ja käyttötarpeita.
Projekti on myös johtamisfilosofian kirjoittamisprosessi: mitä tarkoittaa että “LLM ehdottaa, ihminen päättää”, miten tietotyöläisen kuormaa pitäisi mitata konkreettisesti, ja miten privacy-first voi olla suunnitteluperiaate eikä jälkikäteinen kompromissi.