Plan: Transitioning to Forward Deployed Engineer / AI Engineer
A phase-based roadmap for backend engineers moving into FDE and AI Engineer roles — decoding the title chaos, the applied LLM stack, and the interview loop.
Turn the videos you already watch into Anki flashcards. Word-by-word subtitles, one-click mining, twelve languages, and everything runs on your own machine.
EducationPython · JavaScriptGitHub @thecopybookhare-cmdOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Local Migaku-style flashcard miner — learn languages from video. Word-by-word subtitles, one-click Anki cards, 100% offline.
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗Local, Migaku-style flashcard miner — learn languages from the videos you love.
Watch anything with word-by-word interactive subtitles, click a word, and get an Anki card with the audio of the sentence, a video frame, the sentence + neural translation, and the word's lemma, part of speech, dictionary senses and frequency. Everything runs 100% locally — no accounts, no paid APIs.
One click on an unknown word → dictionary → a card with the sentence audio, the video frame and the translation, ready for Anki.
▶️ Watch the 3-minute walkthrough — every feature, narrated.
Front carries the sentence, a short animated clip of the moment (not a frozen frame) and the sentence audio. Back adds the word and sentence in your language, plus where it came from and how common the word is.
.srt / YouTube subtitles..txt or .epub and it
becomes a reading session with the same clickable words, the same popup and
the same i+1 highlighting — a LingQ-style reader that sends cards to Anki
with the sentence read aloud by Piper. Pages remember where you left off,
sentence mode puts one sentence in front of you with its audio, and
turning the page can mark whatever you didn't touch as known — off by
default, always telling you how many, always undoable..ifo) or Yomitan (.zip) file and its definitions show up in
the same popup, Migaku-style.| Your library | Words panel |
|---|---|
Import a .txt or .epub and it becomes a reading session: same colours, same
popup, same cards — with the sentence read aloud by a neural voice instead of
cut from a soundtrack.
Sentence mode puts one sentence in front of you, and reads it out loud.
Everyone installs their own copy — nothing to host. You don't need Python
or ffmpeg beforehand: the installer brings uv (which provides Python) and
static-ffmpeg covers ffmpeg if it's missing.
Heads up: installing means pasting one line into a terminal. That's the only technical step — after it, LinguaMiner is a normal app you open from Launchpad or the Start menu. Never used a terminal? See the step-by-step guide.
macOS / Linux:
curl -LsSf https://raw.githubusercontent.com/thecopybookhare-cmd/lingua-miner/main/bootstrap.sh | bash
Windows — no terminal: download LinguaMiner-Setup.cmd and double-click it. Windows will ask once whether to run it (More info → Run anyway). Prefer PowerShell? This does the same:
irm https://raw.githubusercontent.com/thecopybookhare-cmd/lingua-miner/main/bootstrap.ps1 | iex
Clones the repo into ~/LinguaMiner and installs everything. (Prefer to
clone yourself? Use the manual steps below.)
macOS / Linux
./install.sh # installs everything; on macOS also creates LinguaMiner.app
./run.sh # or open LinguaMiner.app (Mac)
Windows (PowerShell, inside the project folder)
powershell -ExecutionPolicy Bypass -File install.ps1
.\run.bat
The installer creates the venv (Python 3.12) and downloads the translator,
dictionary and spaCy model. The Whisper model (~3 GB) downloads itself the
first time you transcribe. App data lives in your OS's standard folder
(Application Support on Mac, AppData\Roaming on Windows,
~/.local/share on Linux).
No installer and no Python on your machine — one command, then open http://localhost:8977:
docker run -d --name linguaminer --restart unless-stopped \
-p 127.0.0.1:8977:8977 \
-v linguaminer-data:/data \
--add-host=host.docker.internal:host-gateway \
ghcr.io/thecopybookhare-cmd/lingua-miner:latest
Or docker compose up -d with the compose.yaml in this repo.
Built for both Intel/AMD and ARM (Apple Silicon, Raspberry Pi).
linguaminer-data volume, so updating the image never touches it. The
Whisper model (≈3 GB) downloads into it the first time you transcribe.127.0.0.1: in the port. Inside Docker, anyone who can reach
that port has full control of the app.host.docker.internal. With Docker Desktop (Mac, Windows) that should be all.
On Linux, AnkiConnect only listens on localhost, which the container can't
reach: in Anki → Tools → Add-ons → AnkiConnect → Config, set
"webBindAddress": "172.17.0.1" (Docker's bridge). Don't use 0.0.0.0 —
that opens your collection to your whole network. If Anki can't be reached,
cards queue up and send themselves once it can.-v ~/Videos:/videos:ro, or open them
from the browser.docker pull ghcr.io/thecopybookhare-cmd/lingua-miner:latest,
then remove and recreate the container. The in-app updater doesn't apply here.2055492159 (AnkiConnect)If Anki is closed, cards queue up and send themselves when it opens.
Open ⚙️ Settings → Check for updates. It tells you what's new and updates in place.
If you installed before 5 September 2026, do this once. Versions up to 1.33.1 shipped a broken update check: the installer clones with
--depth 1, and in a shallow clone the command that counts new commits fails instead of returning zero — so the app told you that you were up to date when you weren't. Fixing it required shipping a new version, which the broken checker couldn't fetch. In your LinguaMiner folder (~/LinguaMinerif you used the one-line installer):git fetch --unshallow origin main git pull --ff-only origin mainAfter that the in-app updater works on its own. See v1.33.2.
→ Full walkthrough with clips of every feature
On first launch a Getting started card walks you through these same three steps and shows what is still downloading. The interface follows your system language (English, Spanish or Catalan) — change it under ⚙️ any time.
small for a quick test) — or use the video's
own subtitles if available.Reading instead of watching? Open a book takes a .txt or .epub and
steps 3 and 4 are identical — see
the reader section of the walkthrough.
Shortcuts (Migaku map): A/← previous sentence · D/→ next ·
S/↓ replay · Q mine word under cursor · ⇧Q open card editor ·
1-5 word status · W hide subs · E dual subtitles · K condensed
playback · G subtitle browser · P auto-pause · F fullscreen ·
space play/pause · ⏎ send card · Esc close. All remappable in ⚙️.
| Problem | Fix |
|---|---|
| Blank white window on launch | The app now tells you what failed instead of showing an empty window. If you still get one, you are on an old version — update, and check desktop.log in your app data folder |
| "Anki closed" badge | Open Anki with AnkiConnect installed; the queue sends itself |
| Video won't play | .mkv files are remuxed to mp4 automatically on import |
| Empty translations | Run ./install.sh again (downloads the translator) |
| Slow transcription | Pick the small model in the selector. A 50-min episode takes a few minutes before the progress bar moves — press Transcribe once and let it run |
New to all this? The step-by-step install guide covers the same ground with no assumed terminal experience.
Hit a bug? ⚙️ → Report a problem builds a report with your version, your system and the last lines of the log, then opens GitHub with it already written. Nothing is sent on its own — you read it, edit it, and decide. If the app won't even open, its error screen has the same button.
FastAPI + SQLite + vanilla JS (no build step). Pieces: faster-whisper with projecte-aina/faster-whisper-large-v3-ca-3catparla, softcatala/translate-cat-spa and OPUS-MT CTranslate2 models per language, Apertium bilingual dictionaries, spaCy, wordfreq, yt-dlp, Piper TTS, AnkiConnect.
Language profiles live in app/languages.py — adding a
language is mostly adding one entry there.
uv sync # exact versions from uv.lock, dev tools included
uv run ruff check app/ tests/ # lint
uv run pytest tests/ # tests
Dependencies are pinned in uv.lock, and the installers, the updater, Docker
and CI all install exactly those versions. To move them forward, run
uv lock --upgrade (or uv lock --upgrade-package yt-dlp) and let CI and the
install test run. The weekly YouTube check also tries the newest yt-dlp, so
you hear about a breaking release before it reaches the lock.
See CONTRIBUTING.md. CI runs lint + tests on Linux/macOS/Windows on every push, and a separate workflow runs the real installers on all three every week.
Code under the MIT license © 2026 thecopybookhare.
⚠️ Personal and educational use only. The tool plays third-party content for language study; respect copyright and each platform's terms. Don't redistribute downloaded content.