Lexiverse
Lexiverse - AI contextual reading engine for English learners. Your next article is your next review.
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗DrillMap is a self-serve LSAT study-planning app. It turns a student's 7Sage analytics into a targeted Monday–Sunday drilling plan. Each new weekly schedule uses approved analytics and reported progress; a saved week stays fixed.
The schedule is generated by deterministic rules, not an LLM. Claude Vision is used only to extract structured data from a student-uploaded 7Sage screenshot; the student reviews that extraction before it becomes the current analytics snapshot.
The app stores its records in Postgres. See Postgres setup and tests for the local startup command, migrations, and database tests.
The core student workflow is implemented:
Billing is intentionally deferred. The tracked next feature is Issue #13: Stripe subscriptions, a seven-day trial, and the 7Sage referral discount.
The original LSAT Rulebook and Engine Blueprint remain useful background references for the scheduling model:
adaptive-weekly-schedule-v2 policy saves reason sentences when it
creates a schedule. Past weeks keep their planned work, capacities, and wording.Uploaded analytics images are used in memory for extraction and are not stored by the application.
Install Node.js 20.9 or later with npm. Local database setup needs either Docker with Compose or an existing Postgres 17 installation.
The Stage 1 pause on local data writes ended on October 8, 2026 after the separation, real-site, and local validation checks passed under the owner's evidence exception for unavailable old credentials. See issue #86 and the validation evidence (issue #86). The no-promotion rule remains in force. This does not approve launch.
The steps below describe setup for a new copy of the repository. Local work uses Postgres on your Mac with test data only. A loopback address accepts connections from this computer only. Never keep real-site credentials in local files. A credential is a secret that gives access, such as a password or an API key.
Install the app dependencies from the repository folder:
npm install
Start local Postgres and apply the migrations. Follow Postgres setup and tests. It covers the Docker container and an existing Postgres 17 install.
Migrations create the database tables. The migration command reads
DATABASE_URL from the terminal environment, so use the explicit loopback
value shown in that guide. It does not load .env.local.
Copy .env.example to .env.local for this new local setup:
cp .env.example .env.local
Keep DATABASE_URL at a loopback address. This connection string tells the
app where to find the local database. Generate a new local Auth.js secret
with the command in .env.example. Auth.js uses this secret to protect
sign-in sessions. Put it in AUTH_SECRET.
For Google sign-in, create a separate Google client for local work. Set its
authorized origin to http://localhost:3000 and its only authorized redirect
to http://localhost:3000/api/auth/callback/google. The redirect is where
Google sends the browser after sign-in. Put this local client's ID and secret
in AUTH_GOOGLE_ID and AUTH_GOOGLE_SECRET.
Leave ANTHROPIC_API_KEY unset, including in your terminal environment. Keep
SCREENSHOT_EXTRACTOR=fake. The fake extractor returns fixed rows for any
uploaded screenshot and never calls Anthropic. Set it to fake-failure to see
the "Couldn't read that screenshot" message: it hands the real model output
checks a bad reply, which also writes one model_reply_refused entry in the
security log. Without this setting, the app
calls Anthropic when a key is set and shows that message when no key is set.
Never set SCREENSHOT_EXTRACTOR on the real site. Admins can also use Sample
analytics snapshots for their student side. An Admin reviews and approves
each Sample analytics snapshot like an uploaded snapshot.
For a real scan, use the testing key. It is the Anthropic key
drillmap-testing in the drillmap-copy workspace, which has a $5 monthly
spend limit. The copy site uses it as its ANTHROPIC_API_KEY. On your Mac,
keep it in .env.local as ANTHROPIC_TEST_API_KEY. The app never reads that
name, so local runs stay free. Pass it to a scan only on purpose. The owner
shares the key through a password manager. Production keeps its own key.
npm run dev # start the development server at http://localhost:3000
npm run dev:local # apply migrations, then start at http://localhost:3000 with the fake screenshot reader
npm test # run the scheduling-engine test suite
npm run lint # run ESLint
npm run build # create a production build
npm run start # run a production build
Delete every student from the local database:
npm run reset:dev-data -- --yes
The reset removes all students and their Analytics snapshots, Weekly schedules,
and Activity check-ins in one transaction. Accounts stay, so each
person signs in and goes through onboarding again. Without --yes, it stops
and names what it would delete. It refuses NODE_ENV=production before connecting.
The reset, make-admin, and db:migrate commands read
postgres:// and postgresql:// strings only. They allow database hosts
localhost, 127.0.0.1, and ::1. They check every host in the address and
in the host and hostaddr query settings, even when the address has no host.
They refuse remote hosts, other protocols, and missing or unreadable connection
strings before connecting. No flag or environment setting bypasses this check.
The guard also allows exact copy-site hosts committed in scripts/copyDatabaseHosts.json. That list is empty until the owner verifies the copy's hosts. Add only full, lowercase host names for the copy, with no ports or credentials. Never add the real site's host, a wildcard, or a provider-wide suffix.
The guard refuses Postgres service settings because they can load connection settings from a separate file. See the Postgres connection documentation.
The v2 schedule specification records the current rules.
Leave RESEND_API_KEY and EMAIL_FROM unset. Without them, the app uses
the fake email sender: it writes each email to the terminal log and sends
nothing. Email links use SITE_URL, or http://localhost:3000 when it is
unset. On Vercel, each place sets its own RESEND_API_KEY, EMAIL_FROM, and
SITE_URL. Without a key, a Vercel deployment logs the failed send instead.
Leave CSP_MODE unset. Every page then sends its Content Security Policy
(the CSP: the rules for which scripts and styles may run) as
Content-Security-Policy-Report-Only, so the browser reports a blocked
source in its console and still loads it. Set CSP_MODE=enforce to send it as
Content-Security-Policy, so the browser blocks the source. Locally, restart
the app after a change. On Vercel it is a server-only setting for each place,
and a change takes effect at the next deployment, with no code change.
Start the app from the repository folder:
npm run dev:local
This command applies the database migrations with the values in .env.local,
then starts the app on localhost with the fake screenshot reader. Google
sign-in works only at http://localhost:3000, not at 127.0.0.1. Use
npm run dev when you set SCREENSHOT_EXTRACTOR yourself.
Open http://localhost:3000. The local database starts empty. Sign up with
Google to create your Account. This needs a local Google client in .env.local.
Without one, use the verify helper's minted session cookies
(.agents/skills/verify/SKILL.md). Do not copy real students' records into it.
Sign in once with Google locally. Then, in
another terminal, make that local Account an Admin. make-admin refuses an
Account that has not signed in with Google. It reads
DATABASE_URL from the terminal environment, so pass the local value explicitly:
DATABASE_URL=postgresql://postgres:[email protected]:5432/drillmap npm run make-admin -- [email protected]
Replace [email protected] with the email of the Google
Account you used locally. Sign out and back in to see the Admin controls.