尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗A tool for tracking Old School RuneScape Grand Exchange prices and computing values with formulas. Users sign in with Google; their scopes, globals, tags and settings are stored on the server, so they follow them across devices. A scope can be shared read-only by link.
The screenshots below are all of one scope: an Oathplate armour profit calculator.
The Scopes tab is a work area: a Data panel for finding items, the code editor, and a sidebar with the scope's UI and values. Panels resize by dragging the splitters between them and collapse to a rail (Ctrl+B / Ctrl+Alt+B), and the UI section is dragged by its header to dock it full width above the editor or in the sidebar. Ctrl+K opens a command palette.
A scope's code can build its own UI: forms, stat tiles and tables that update as prices and inputs change.
Each scope is JavaScript with built-in functions for looking up items and their live prices. The editor highlights variables, and item lookups take their item tag's colour. With the caret on a variable, its occurrences are marked and a bar at the bottom steps through them (F7 / Shift+F7) or jumps to its declaration (F12).
The AI chat drawer can answer questions about items and prices, or change a scope. It reads the scope, test-runs its edit, and changes nothing until you click Apply.
More in docs/.
cp .env.example .env # local-development defaults; DEV_LOGIN=true lets you sign in without Google
docker compose up --build
Open http://localhost:3000. Data lives in the ge-tracker-data volume.
That runs the code baked into the image, so a change needs a rebuild. For development, add
docker-compose.dev.yml, which mounts server/ and public/ from the working folder:
docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d --build
A server change then restarts the server within a second (tools/dev-server.mjs), and a browser
refresh picks up a public/ change. Rebuild only after changing package.json or the Dockerfile.
Needs Node 20 or later.
cp .env.example .env
npm install
npm run dev # restarts on changes; reads .env
Data goes in storage/ (git-ignored).
Point your domain's DNS at the server and open ports 80 and 443.
In .env, set:
DOMAIN and ACME_EMAIL (for the Let's Encrypt certificate)SESSION_SECRET to a long random string: node -e "console.log(require('crypto').randomBytes(48).toString('base64url'))"GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET (below)AI_KEY_SECRET to another long random string, so users can connect their own Anthropic API
key to use Claude (it encrypts the stored keys). Leave it empty to turn Claude off.Start the app and Traefik:
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d --build
The production override sets NODE_ENV=production (which turns the dev sign-in off) and
BASE_URL=https://$DOMAIN.
In Google Cloud Console, create an OAuth client ID of type Web application and add these Authorized redirect URIs:
http://localhost:3000/auth/google/callback (development)https://<your DOMAIN>/auth/google/callback (production)Copy the client ID and secret into .env. The OAuth consent screen needs the email and
profile scopes.
server/
index.js start: run migrations, then listen
app.js Express: security headers, sessions, routes, static files
config.js settings from the environment (.env.example documents them)
db/ Knex + SQLite (better-sqlite3); migrations/ holds the schema
auth/ Google sign-in (Passport) and the SQLite session store
routes/ URL -> middleware -> controller
controllers/ HTTP in and out
managers/ the work: reading and writing the database, icons, sharing
middleware/ sign-in check, API header check, validation, errors
validation/ zod schemas for request bodies
public/ the browser app (Vue 3 from a CDN, no build step)
test/ vitest + supertest; test/browser runs the browser store against a real server
tools/ scripts that rebuild public/data/ from the OSRS wiki
/icons/<name> downloads each item icon from the OSRS wiki once and serves it from
the data volume afterwards.AI_KEY_SECRET, and picks a
model in the chat drawer. The drawer sends the conversation to /api/ai/chat, which adds the
system prompt and streams the reply back in one shape for both providers
(server/ai/anthropicChat.js, server/ai/geminiChat.js). Conversations can switch provider
midway: server/ai/transcript.js converts them. Rate limits (common on Gemini's free tier) are
waited out and retried automatically. The system prompt
is built at start-up from the formula files' header comments and functions.js's docs
(server/ai/systemPrompt.js), so document new scope functions there. The model's tools (item
search, reading and test-running code, proposing edits) run in the browser
(public/js/ai/agentTools.js; the server declares them in server/ai/tools.js). An edit only
happens when the user clicks Apply. Chats are saved per user.The server applies pending migrations on start. To add one:
npm run migrate:make -- add_something # creates server/db/migrations/<timestamp>_add_something.js
npm run migrate # apply now (the server also does this on start)
npm run migrate:rollback
Migrations are ES modules exporting up(knex) and down(knex).
npm test