Plan: Transitioning to Forward Deployed Engineer / AI Engineer
一份分阶段路线图,供后端工程师转向 FDE 与 AI Engineer 角色——解读头衔混乱、应用型 LLM 技术栈与面试循环。
AI 翻译
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Study app that turns your course material into a city you light up.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Keep your lights on. A study app: your degree is a city, a semester is a district, a module is a building, a teaching unit is a floor. A light goes on when you pass the 5-question check for a unit (4 right, 80 %).
Unofficial student project, not affiliated with HSLU. Files stay on the device (IndexedDB). Progress stays in localStorage unless you turn on optional sync. Nothing is tracked.
index.html, privacy/, terms/, imprint/, connector/ public pages (landing, legal, ILIAS connector page)
app/
index.html, styles.css, manifest.webmanifest, sw.js the app shell and its service worker
app.js screens, routing, city drawing, sync, wiring (being split up step by step)
js/storage.js IndexedDB access: every write resolves only after the browser confirmed it
js/imports.js when a file counts as "added" or "imported" (failed writes never count)
js/quiz-core.js chunking with headings and pages, definition questions, quality rules, question bank, 5-question and 80 % rules
js/backup.js progress backup, full backup, checked restore, merge rules
vendor/, fonts/, icons
functions/api/ Cloudflare Pages Functions: sync, sign-in, optional AI questions
quiz.js the /api/quiz endpoint (limits, auth)
_quizlib.mjs the AI quiz pipeline: analyse, write, check, replace (pure logic, tested in Node)
db/schema.sql D1 schema for sync accounts
ilias-extension/ the browser extension that reads ILIAS (thin bridge)
tests/unit/ Node tests, no dependencies
tests/e2e/ browser tests (Playwright for Python)
docs/ setup notes
The app has no build step. app.js is loaded as an ES module (<script type="module">) and imports the files in app/js/. New files in app/js/ must also be listed in SHELL in app/sw.js, and VERSION there must be raised when the shell changes.
npx serve .
Then open http://localhost:3000/app/ (the port is printed). Opening the files directly from disk does not work: modules and file storage need http.
The app is available in English, German, Spanish and French. The language is picked from the browser on the first visit and can be changed in Settings (or on the welcome screen); the choice is kept in localStorage['booklyn:lang'].
English text in app/app.js is the source and also the dictionary key. Wrap every visible string with _t('...') (plurals: _pl(n, 'one', 'many'), placeholders: _tf('{n} files', {n: 3})), then add the German, Spanish and French versions to app/js/i18n-dict.js. tests/unit/i18n.test.mjs checks that every key exists in all languages and keeps its placeholders. Demo content and the legal pages stay in English.
node --test tests/unit/*.test.mjs # fast, no installs
pip install playwright && playwright install chromium
python3 tests/e2e/batch1.py # starts its own local server
python3 tests/e2e/batch2.py
What they cover: failed imports and retries without duplicates, import confirmation only after a successful write, complete chunking (no truncated text), cache refresh when files are added or removed, the 5-question and 80 % rule, wrong answers coming back first, full backup and restore (merge and replace), damaged and hostile backups.
/api/quiz. The server first analyses the material (subject, concepts with exact quotes, relations, objectives; it stops with a reason if the text is unreadable or too thin), then writes candidate questions, then checks each one with fixed rules (4 distinct options, no "all of the above", answer not in the question, no length giveaway, supporting quote must really occur in the material, answer words must be supported) and a second strict AI review. Failed ones are replaced once. Nothing unchecked is returned. The answer shows the explanation, the supporting quote and the source (file and page).AI_DAILY_CAP), each request makes 3 to 5 model calls. The model is AI_MODEL (default Llama 3.1 8B on Workers AI).The scan knows which ILIAS course every file comes from. The module is taken from the course: automatically when the course name contains the module code (e.g. I.BA_CONWB.H2601 and module CONWB), otherwise Booklyn asks once and remembers (iliasCourseMap). The week comes from the folder or file name; if there is none the file is marked "Check this". Ready files are collapsed in the Port: open the list to review or correct each file's module and week, or import directly.
.json): one JSON object with semesters, modules, lights, notes, deadlines, coins, city and decorations. No files..ndjson): one JSON object per line: header, progress, question sets, then every imported file (base64) with its module and unit, and an end line. Reading goes line by line, so large backups do not need one giant string.end line). Nothing on the device changes until that passes. Then you choose:
Booklyn works without any backend. For sync accounts and AI questions see docs/accounts-setup.md: a D1 database bound as DB (run db/schema.sql), optional Resend variables for email sign-in, and an optional Workers AI binding for /api/quiz. Deploy by pushing to main; Cloudflare Pages builds functions/ automatically.
Admins are declared only in Cloudflare Pages → Settings → Environment variables (Production), never in the app:
ADMIN_EMAILS: comma-separated email addresses (case-insensitive). Does not match sync-code accounts.ADMIN_UIDS: comma-separated account ids, for accounts created with a sync code.After redeploying, sign in with that account: Settings → "Admin tools" lets you switch on unlimited coins, set an exact balance or add coins. The server tells the app who is an admin through /api/me; nothing in the browser can grant it. On the public site ?dev=1 does nothing; it only works on localhost.
Connected to the GitHub repository: every push to main deploys. Manual option: npx wrangler pages deploy . --project-name booklyn after wrangler login.
[...] placeholders in the legal pages and .well-known/security.txt.MIGRATIONS in app.js for every schema change. The new how field (quiz or self-check) is additive and needs no migration.