DeepSeek Harness Remote
DeepSeek Harness Remote 可将手机或另一台电脑与你运行 DeepSeek Harness 的电脑安全连接,随时随地继续你的工作,方便随时查看进度并继续工作。
AI 翻译
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Track daily office entry/out times and see your monthly worked-time balance at a glance.
Install dependencies:
npm install
Create your local env file:
cp .env.example .env
Set DATABASE_URL to your Postgres connection string (e.g. from a free Neon or Supabase database), and set SESSION_SECRET to a random string.
Generate a strong SESSION_SECRET with:
openssl rand -base64 32
To enable Continue with Google, also set GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET
(see Google sign-in below). Without them the app works normally with
email/password only.
Create the database schema:
npm run db:push
Start the dev server:
npm run dev
The app runs at http://localhost:3001.
ios/),
and iPhone/iPad via Add to Home Screenhttp://localhost:3001/api/auth/google/callbackhttps://<your-vercel-domain>/api/auth/google/callbackGOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET (locally in
.env, and in the Vercel project's environment variables).Signing in with Google creates an account on first use. If a password account already exists with the same email, the Google account is linked to it.
"Forgot password?" sends the reset link over SMTP. Set SMTP_HOST, SMTP_PORT, SMTP_USER,
SMTP_PASS (and optionally MAIL_FROM), plus APP_URL so links always point at your real
domain. With Gmail, enable 2-Step Verification and use an
App Password as SMTP_PASS.
Without SMTP settings, local development prints the reset link in the dev server's terminal, and production tells users that email reset isn't available yet.
Reminders are Web Push notifications, so they reach you even when the app is closed.
npx web-push generate-vapid-keys and set VAPID_PUBLIC_KEY,
VAPID_PRIVATE_KEY, and VAPID_SUBJECT (an https URL or mailto:, not localhost).CRON_SECRET to a long random string.GET /api/cron/reminders with Authorization: Bearer $CRON_SECRET every
few minutes. .github/workflows/reminders.yml does this every 5 minutes; add the repository
secrets APP_URL and CRON_SECRET to enable it. (Vercel's free plan only allows daily crons.)On iPhone, notifications only work after adding the app to the Home Screen. While the app is open, the "time to leave" reminder also fires on time from the page itself.
https://officetimetracker.vercel.app/download/android always redirects to the APK attached to
the latest GitHub release. The app launches with ?source=app, which hides the site's
"Get the mobile app" links inside it. public/.well-known/assetlinks.json holds the signing
key's fingerprint so Android shows it without a browser bar.navigator.standalone), and push reminders work on iOS 16.4+.ios/ (iOS 17+). See Native iOS app.To publish a new Android version, rebuild it (see the separate office-time-tracker-android
project) and attach it to a new release:
gh release create v1.0.2 OfficeTimeTracker.apk --title "Android app 1.0.2" --notes "…"
ios/ holds a native SwiftUI app with Today (one-tap clock in/out, extra hours), Monthly, Yearly
and Settings screens. It talks to the JSON API under /api/mobile/* (src/app/api/mobile),
which runs the same rules as the website through src/lib/attendance-service.ts and
src/lib/account-service.ts. The app signs in with a bearer token (src/lib/mobile-api.ts)
instead of the session cookie. That token is revoked the same way, by a password change or
"Log out of all devices".
Reminders are local notifications scheduled on the phone each time the app loads, using the same rules and timings as the push reminders. Real push would need APNs and a paid developer account. Password changes and data export open the website.
Google sign-in reuses the website's OAuth flow, so it needs no extra Google Cloud setup. The app
opens /api/auth/google?app_challenge=… in a browser sheet. The callback sends a five-minute
code back to the app through its officetimetracker:// URL scheme, and the app trades it at
POST /api/mobile/auth/google for its token. The code only redeems with the PKCE verifier the app
kept, and no app token or code is ever accepted as a website session cookie.
iPhones don't install apps from a downloaded file the way Android installs an APK. Every app has to be signed for your Apple ID, so there are two free ways to install it.
Without Xcode: the .ipa file and Sideloadly. The iOS GitHub Actions workflow builds an
unsigned OfficeTimeTracker.ipa and keeps it as the run's OfficeTimeTracker-ipa artifact
(gh run download <run-id> -n OfficeTimeTracker-ipa).
.ipa into Sideloadly, enter your Apple ID and press Start. Sideloadly signs the app
with your Apple ID and installs it.With Xcode:
Install Xcode from the App Store, then brew install xcodegen.
Generate and open the project:
cd ios && xcodegen && open OfficeTimeTracker.xcodeproj
In Xcode, open Settings → Accounts and add your Apple ID. Then select the target, go to Signing & Capabilities, and pick your Personal Team. If Xcode says the bundle ID is taken, change it to anything unique.
Connect the iPhone and enable Developer Mode on it (Settings → Privacy & Security). Choose it as the run destination and press Run. The first time, trust the developer profile on the phone under Settings → General → VPN & Device Management.
With a free Apple ID the app stops opening after 7 days. Install it again the same way (Sideloadly
or Run in Xcode). Your data lives on the server, so nothing is lost. The app uses the live site by default. To use a dev
server, set API_BASE_URL in ios/project.yml (for example http://localhost:3001 in the
simulator) and run xcodegen again.
The /api/mobile routes must be deployed before the app can sign in against the live site.
npm test # unit tests (Vitest)
npm run typecheck # TypeScript
The tests cover the time and balance rules (half days, leave, days off, time zones, overnight
shifts), monthly/yearly summaries, reminder timing, CSV export, and input validation. CI runs both
on every push (.github/workflows/ci.yml).
| Command | Description |
|---|---|
npm run dev | Start the development server |
npm run build | Build for production |
npm run start | Run the production build |
npm run lint | Run linting |
npm test | Run the unit tests |
npm run typecheck | Type-check the project |
npm run db:push | Push the Prisma schema to the database |
npm run db:studio | Open Prisma Studio to browse data |
Deployed on Vercel with a Neon Postgres database at https://officetimetracker.vercel.app.
DATABASE_URL, SESSION_SECRET, GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET, the VAPID_* keys,
CRON_SECRET, APP_URL, and the SMTP_* settings are set as environment variables on the Vercel
project.
The Vercel build (vercel.json) runs prisma db push before next build, so schema changes reach the
production database on each deploy. It refuses destructive changes, so those need a manual npm run db:push.
Vercel skips a build when nothing outside ios/ and android/ changed since the branch's last
deployment (VERCEL_GIT_PREVIOUS_SHA), so pushing several commits at once still deploys the website
changes among them even when the newest commit only touches an app.