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 tausta­workeria ja 23 LLM-tool-toimintoa yhdessä järjestelmässä — chat, kalenteri­haku, tehtävänluonti, sparri, sääntö­haku ja kontakti­briefit kaikki samassa rajapinnassa

  • 02

    Työaika­analytiikka 20+ kortilla: kuorma-indeksi, fokus­blokit, fragmentaatio, 7×24-heatmapit, 9-muuttujan korrelaatio­matriisi ja tavan­muutosten 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 kehys­brief pe 16, palautumis­väli-ehdotus korrelaatio­matriisin perusteella

Lähtötilanne

Järjestöjohtajan tieto­kuorma on moninainen: kaksi kalenteria, kolme sähköposti­väylää, kymmeniä aktiivisia sidosryhmiä, päätöksiä joiden perustelut pitää muistaa kuukausien päähän, viranomaisviestejä jotka vaativat reagointia tuntien sisällä, terveys- ja palautumis­dataa jota kukaan ei oikeasti ehdi lukea, ja kattava työaika­analytiikka 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 mallin­koulutukseen, ja yksi­kään ei yhdistä kalenteria + sähköpostia + terveyttä + toteutunutta työaikaa samaan analyysi­malliin. 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 toiminnallisuus­aluetta yhteen koherenttiin kokonaisuuteen.

Ydinominaisuudet

  • Keskustelu­rajapinta — teksti ja ääni (Whisper STT → LLM → Chatterbox TTS). Tool calling 23 työkalulla: kalenteri­haku, tehtävä­luonti, päätös­merkintä, sparrailu, sääntö­haku, kontakti­briefit. Muistit vektori­hakuna (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 posti­laatikkoon. 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, fokus­blokit, fragmentaatio, chronotype, heatmapit viikon 7×24 ja palaveri­tiheys DOW×hour. Korrelaatio­matriisi 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 tavan­muutoksia 14 pv vs. 14 pv -vertailulla.
  • Decision Journal — päätökset kontekstista, perusteluista, hylätyistä vaihtoehdoista ja arviointi­pä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 korrelaatio­matriisin dataa lähteenä.
  • Reaaliaikainen hälytys — hel.fi viranomais­viestit 2 min välein, järjestökenttä (akava.fi, ytn.fi, juko.fi) 5 min välein. Erilliset bannerit, hiljaiset tunnit huomioidaan eri tavoin kriittisyys­tason 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.
  • Kehitys­backlog — 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. Kalenteri­haku, sääntö­haku, brief, sparri, tehtävä­luonti, päätös­merkintä, kontakti­briefi — 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 tuotanto­kä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-ennalta­ehkäisy. Kuorma-indeksi, palautumis­väli-ehdotukset ja tavan­muutosten 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 kaikki­tietä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 referenssi­malli. Lokaali LLM + Microsoft Graph + tool calling + audit-loki + Tailscale on toistettavissa muille tieto­työläisille joilla on samanlaisia privacy- ja käyttö­tarpeita.

Projekti on myös johtamis­filosofian kirjoittamis­prosessi: mitä tarkoittaa että “LLM ehdottaa, ihminen päättää”, miten tieto­työläisen kuormaa pitäisi mitata konkreettisesti, ja miten privacy-first voi olla suunnittelu­periaate eikä jälkikäteinen kompromissi.