Turbolarp

Notes

not yet reviewed by publik

Turbolarp interface

How to install Turbolarp

Every step written out, for people who have never opened a terminal. Pick the setup you have.

NitroAI

Turn any lecture, PDF, or video into study notes, flashcards, quizzes, and a study chat — free, and private by default.

How it works

NitroAI is a small desktop shell around a local web app. When you open it, the app starts a tiny local server on your machine, shows it in a window, keeps it alive, and shuts it down when you quit. That local server is what does the things a plain web page can't — extracting YouTube transcripts with yt-dlp and managing the local AI runtime — so you never install those tools by hand.

Three ways to run the AI

You pick one on first launch (and can switch any time in Settings):

  • publik API (default in the packaged builds) — NitroAI sets itself up on first launch, after you accept a short disclosure. Every request is priced per use at 50% of the model's published list price; audio transcription, podcast voices and embeddings are passed through at cost. Most people spend under $2 a month. Every new computer starts with free starter usage; right after setup the app shows what it costs and why, with a button to link the computer and pick a plan (you can also do that later from Settings). Your prompts go through publik's servers to a shared model account; publik does not keep them after the reply and never trains on them. The install's key lives in ~/Library/Application Support/publik/apps/nitroai.json (mac) / %LOCALAPPDATA%\publik\apps\nitroai.json (Windows), readable only by you, and never leaves the app's local server. Builds without a publik app token (forks, npm run app without PUBLIK_APP_TOKEN) simply don't offer this option.
  • Fully local — when you choose this, NitroAI automatically downloads and starts a local AI runtime (Ollama) and pulls a small, capable model (~2 GB, one time). Everything then runs on your device: no key, no cloud, no cost. Provisioning only ever happens if you pick local — cloud users never download a model.
  • Use my own key — paste an OpenAI (sk-…), Anthropic (sk-ant-…) or publik (pk_…) key for the highest-quality notes, quizzes, chat, and podcast voices. The key is stored only on this computer and used only to call your provider directly. A key you enter yourself is never overwritten by the publik setup.

Your notes and generated content live only on your machine (in the app's local database); you can export everything from Settings at any time.

For developers

Requires Node ≥ 20.19 (Node 21.x is not supported — use 20.19+ or 22 LTS).

git clone https://github.com/Blueturboguy07/NitroAI.git
cd NitroAI
npm install

npm run dev      # Vite dev server (hot reload) — includes the YouTube helper
npm run serve    # build once, then serve the app + helpers at http://localhost:4180
npm run app      # build, then launch the full desktop shell (Electron)

Build installers locally:

npm run dist:mac   # → release/NitroAI-mac-<arch>.dmg
npm run dist:win   # → release/NitroAI-Setup-Windows.exe

Or let CI do it: push a tag (git tag v0.1.0 && git push --tags) and the release workflow builds macOS + Windows installers and attaches them to a GitHub Release.

Other scripts: npm test (Vitest), npm run typecheck.

Project layout

src/            React app (UI + all generation/engine/ingest logic, TypeScript)
  lib/engine/   provider abstraction: publik API, OpenAI, Anthropic, and local Ollama
  lib/ingest/   text / url / youtube / pdf / docx / audio → normalized text
  lib/generation/  notes, flashcards, quiz, podcast, chat
server/         the local server the desktop shell runs
  httpServer.mjs  serves the built app + /api/youtube-extract + /api/local/* + /api/publik/*
  publik.mjs      publik API credential (mint after consent, stored 0600, key never in the renderer)
  publikProxy.mjs streaming proxy to publik API — the renderer's only door to it
  ytdlp.mjs       yt-dlp download + caption/audio extraction
  ollama.mjs      Ollama install / serve / model-pull lifecycle
electron/       the desktop shell (starts the server, opens the window)

Signing your own builds

By default the release workflow produces ad-hoc-signed builds — valid, but not notarized, so users get a one-time OS warning. If you have signing certificates, add them as GitHub repo secrets (Settings → Secrets and variables → Actions) and every tagged build is automatically signed and notarized — installers then open with no warning at all. No code changes needed; the build detects the secrets.

macOS (needs a paid Apple Developer account and a Developer ID Application certificate):

SecretWhat it is
CSC_LINKYour Developer ID Application cert, exported from Keychain as a .p12, then base64-encoded: base64 -i cert.p12 | pbcopy
CSC_KEY_PASSWORDThe password you set when exporting the .p12
APPLE_IDYour Apple ID email
APPLE_APP_SPECIFIC_PASSWORDAn app-specific password for that Apple ID (not your login password)
APPLE_TEAM_IDYour 10-character Team ID (Apple Developer → Membership)

Windows (optional — needs an Authenticode code-signing certificate):

SecretWhat it is
WIN_CSC_LINKYour code-signing cert as a base64-encoded .pfx
WIN_CSC_KEY_PASSWORDThe .pfx password

publik API (optional — makes publik the default engine in your build):

SecretWhat it is
PUBLIK_APP_TOKENThe pat_… app token publik issues for this app. Baked into the build (extraMetadata.publik.appToken); without it the build offers only Local and your own key. It identifies the build, not the user, and publik rate-limits what it can mint.

Then cut a release: git tag v0.1.3 && git push --tags. That's it — nothing else to configure.

Tech

React 19 · Vite · Tailwind · Electron shell · publik API (default) · Ollama (local) · OpenAI / Anthropic (your own key) · KaTeX · FSRS spaced repetition. No backend of its own, no telemetry, no account required.

License

AGPL-3.0-or-later. Fork it, ship it, improve it — just keep it open.