wrongmove/crawler/frontend
Viktor Barzin a8b7eace48
Add passkey (WebAuthn) authentication with self-registration
Enable users to sign up and sign in using passkeys (biometrics/security
keys) without needing a manually-created Authentik account. The existing
SSO login remains as an alternative.

Backend:
- Add WebAuthn registration/authentication endpoints via py-webauthn
- Issue HS256 JWTs for passkey users, with Redis-backed challenge storage
- Dual JWT verification in auth middleware (issuer-based routing: passkey
  HS256 vs Authentik RS256)
- PasskeyCredential model + migration making user.password nullable
- UserRepository with full CRUD for users and credentials

Frontend:
- AuthUser type abstraction unifying OIDC and passkey users
- Passkey service using @simplewebauthn/browser for WebAuthn ceremonies
- LoginModal redesigned with Sign In / Sign Up tabs
- Type migration from oidc-client-ts User to AuthUser across all services
  and components
2026-02-07 00:34:47 +00:00
..
public add minimal working version where we fetch data and visualize it corectly 2025-06-15 12:48:52 +00:00
src Add passkey (WebAuthn) authentication with self-registration 2026-02-07 00:34:47 +00:00
.dockerignore make the app buildable for prod 2025-06-16 22:43:46 +00:00
.env.sample rename frontend directory to frontend 2025-06-14 15:43:14 +00:00
.gitignore rename frontend directory to frontend 2025-06-14 15:43:14 +00:00
Caddyfile.dev Add frontend and Caddy to Docker Compose dev environment 2026-02-06 23:45:29 +00:00
components.json install shadcdn and move login dialog to a separate component 2025-06-15 13:49:34 +00:00
Dockerfile disable login button whilst logging in 2025-06-17 19:15:18 +00:00
eslint.config.js rename frontend directory to frontend 2025-06-14 15:43:14 +00:00
index.html setup map component to render correctly and visualize all listings in scrollable components 2025-06-15 21:06:10 +00:00
nginx.conf make the app buildable for prod 2025-06-16 22:43:46 +00:00
package-lock.json Add passkey (WebAuthn) authentication with self-registration 2026-02-07 00:34:47 +00:00
package.json Add passkey (WebAuthn) authentication with self-registration 2026-02-07 00:34:47 +00:00
README.md rename frontend directory to frontend 2025-06-14 15:43:14 +00:00
start.sh fail start script if caddy is not installed 2025-06-14 15:52:27 +00:00
tsconfig.app.json make the app buildable for prod 2025-06-16 22:43:46 +00:00
tsconfig.app.tsbuildinfo Add services layer, tests, streaming UI, and cleanup legacy code 2026-02-06 20:55:10 +00:00
tsconfig.json rename frontend directory to frontend 2025-06-14 15:43:14 +00:00
tsconfig.node.json make the app buildable for prod 2025-06-16 22:43:46 +00:00
tsconfig.node.tsbuildinfo show spinner while running backgroun task 2025-06-23 19:45:53 +00:00
vite.config.ts Use localhost as dev origin instead of devvm.viktorbarzin.lan 2026-02-06 23:44:50 +00:00

React + TypeScript + Vite

This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.

Currently, two official plugins are available:

Expanding the ESLint configuration

If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:

export default tseslint.config({
  extends: [
    // Remove ...tseslint.configs.recommended and replace with this
    ...tseslint.configs.recommendedTypeChecked,
    // Alternatively, use this for stricter rules
    ...tseslint.configs.strictTypeChecked,
    // Optionally, add this for stylistic rules
    ...tseslint.configs.stylisticTypeChecked,
  ],
  languageOptions: {
    // other options...
    parserOptions: {
      project: ['./tsconfig.node.json', './tsconfig.app.json'],
      tsconfigRootDir: import.meta.dirname,
    },
  },
})

You can also install eslint-plugin-react-x and eslint-plugin-react-dom for React-specific lint rules:

// eslint.config.js
import reactX from 'eslint-plugin-react-x'
import reactDom from 'eslint-plugin-react-dom'

export default tseslint.config({
  plugins: {
    // Add the react-x and react-dom plugins
    'react-x': reactX,
    'react-dom': reactDom,
  },
  rules: {
    // other rules...
    // Enable its recommended typescript rules
    ...reactX.configs['recommended-typescript'].rules,
    ...reactDom.configs.recommended.rules,
  },
})