ARIS-in-AI-Offer
중·영 이중언어 AI 채용 면접 요약(ML·LLM·Diffusion·Agent) 한 파일 HTML 제공, 이력서→DB 변환 포함
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Tipohiz is a sleek and customizable typing test platform designed to enhance your typing skills. Our user-friendly interface offers a variety of test modes to challenge typists of all levels. Whether you're a beginner looking to boost your typing speed or a seasoned typist aiming to break your personal record, Tipohiz offers the tools and features you need to succeed. Start your typing journey with Tipohiz today and watch your skills soar!
Note
- This project is built using Nextjs
- Inspired by MonkeyType
default | punctuation | numbers)userConfig defaults to 30s (Constants.TimeSec)category: words is a real mode — the run ends on the last matching word, or Space past it. Countdown is hidden; a 3/10 counter (data-testid="words-progress") appears after the first keystrokemodules/TextFiles/)/results from the keystroke log (lib/stats/calculate.ts): net WPM, raw WPM, accuracy, consistency, character breakdown, per-second chart. Time mode still exits when useTimer hits the 1s bound. There is no live WPM/accuracy HUD on the home test — only per-character coloringuserConfigcomponents/expo/theme.constant.ts). Hover/focus paints the class on <html> before click. Persisted as next-themes localStorage key theme, not userConfig.theme/login, /register, Google / GitHub / Twitter) via Better Auth + MongoDB — typing works without signing inlocalStorage (Zustand persist key userConfig). Guest results in tipohiz.results (cap 50); signed-in users POST /api/resultslib/i18n/translations.ts is not wired into settings/header yet)Package manager is [email protected] (package.json packageManager field). Enable Corepack or install that version. There is no install-all / install-win script. bin/install.sh is legacy and broken (pnpm ci is unimplemented); bin/install.cmd is unused. Use pnpm install. Node.js 24+ locally; CI uses Node 24.
This is Next.js 16.4. next dev / next build use Turbopack by default. Request interception lives in proxy.ts (not middleware.ts). Lint is eslint . (pnpm lint) — there is no next lint. Read AGENTS.md and node_modules/next/dist/docs/ before App Router changes.
pnpm install # postinstall runs prisma generate
cp .env.example .env # required only for auth / MongoDB
pnpm prisma:push # optional; legacy Prisma models only. Better Auth creates its own collections
pnpm dev # http://localhost:3000
pnpm 10 skips dependency lifecycle scripts unless they are in pnpm-workspace.yaml allowBuilds (prisma, @prisma/client, husky, sharp, esbuild). If prisma generate is skipped after install, that file is why.
Typing tests run with no env vars. Auth needs:
| Variable | Required for |
|---|---|
MONGODB_URI | Better Auth MongoDB adapter |
BETTER_AUTH_SECRET | Session signing |
BETTER_AUTH_URL | Public origin used for OAuth callbacks. A trailing slash is stripped |
BETTER_AUTH_TRUSTED_ORIGINS | Extra comma-separated origins. BETTER_AUTH_URL and VERCEL_URL are included as well |
BETTER_AUTH_API_KEY | Optional Better Auth dashboard key. Auth still runs when it is unset |
GOOGLE_CLIENT_ID / SECRET | Google OAuth |
GITHUB_CLIENT_ID / SECRET | GitHub OAuth |
TWITTER_CLIENT_ID / SECRET | Twitter/X OAuth |
proxy.ts redirects a signed-in visitor away from /login and /register. It does not gate the typing test. Anonymous use is expected.
Auth routes: GET|POST /api/auth/[...all]. Credentials login min password length 8. Register (lib/validation/auth.schema.ts): name ≥3, email, password ≥8 with upper / lower / digit. The “special character” regex is /^A-Za-z0-9/ — it matches a literal prefix, not a special char; if register fails unexpectedly, look there first. Credential failures always return Invalid email or password. Duplicate sign-up uses a generic “unable to create an account” copy, and some duplicate codes return { success: true } so the response shape does not confirm the email is registered (lib/auth/error-messages.ts). Auth rate limits are stored in MongoDB, not in process memory. The first auth use ensures a unique index on rateLimit.key. If MongoDB is unreachable, that check logs the error and the app keeps running. dash() from @better-auth/infra powers the dashboard and reads BETTER_AUTH_API_KEY. A missing key does not stop the app.
Prisma client is generated to prisma/generated/prisma (output in prisma/schema.prisma). That tree is committed — do not hand-edit it. pnpm build runs prisma generate && next build.
Docker (Dockerfile + docker-compose.yaml) is npm-based and does not inject env or MongoDB — not the recommended local path. See CONTRIBUTING.md.
CI (.github/workflows/ci.yml) runs on PRs to preview: typecheck → lint → unit → production build → Playwright Chromium. It does not call pnpm test; steps are separate. pnpm version comes from package.json packageManager (pnpm/action-setup@v4 with no version: — an explicit version breaks on the Corepack integrity hash). Auth/Mongo env in CI and Playwright are placeholders; e2e stubs **/api/auth/**.
| Script | What |
|---|---|
pnpm test:unit | Vitest (vitest.config.ts, jsdom). No env. Files **/*.{test,spec}.{ts,tsx} except e2e/. |
pnpm test:e2e | Playwright Chromium (e2e/). First run: pnpm exec playwright install chromium. |
pnpm test | unit then e2e |
Match CI locally:
pnpm exec tsc --noEmit
pnpm lint
pnpm test:unit
pnpm build
CI=true pnpm test:e2e
CI=true makes Playwright run pnpm start against the production build. Without a prior pnpm build, that path fails. Dev-mode e2e (pnpm test:e2e with no CI) hits pnpm dev on 127.0.0.1:3000 and can stall on Next 16 cross-origin HMR.
e2e/smoke.spec.ts — happy-path selected 15s test → /results. That is not the default duration (30s).e2e/words-mode.spec.ts — words 10, last-word finish, hidden countdown, 3/10 counter.e2e/known-failures.spec.ts — three test.fail P0s (timer restart, countdown at 0, mistype scoring). Those failures count as passes. Green CI does not mean those bugs are gone.Husky pre-commit: pnpm ts-check, pnpm lint, npx prettier --write ., then git add .. CI does not run Prettier.
Use the link below: https://tipohiz.vercel.app/
For contributers, you merged PRs do not immediately go live. Instead, they are deployed on a preview link first and if it looks okay, they are pushed to main. Preview Link: https://tipohiz-preview.vercel.app/
If you encounter a bug or have a feature request, create an issue, create a discussion thread
Refer to CONTRIBUTING.md.
Before contributing to this repository, please read the code of conduct.
TipoHiZ is licensed under the GNU GENERAL PUBLIC LICENSE - see the LICENSE file for details.
To report a security vulnerability, please refer to SECURITY.md.
This project needs a ⭐️ from you. Don't forget to leave a star ⭐️
Join our discord
Thanks a lot for spending your time helping TipoHiz grow. Thanks a lot! Keep on code-jamming 🍻
Logo Credit - Puneet Upadhyay Designs - Kwaw Kumi Miezah