393 Commits
Author SHA1 Message Date
zeekay 4e69021ae1 fix: /healthz only — removed legacy health endpoints
Docker / test (push) Waiting to run
Docker / docker (push) Blocked by required conditions
2026-03-01 18:31:14 -07:00
zeekay e240b5df59 feat: add /healthz endpoint (platform health check standard)
Root-level /healthz reuses existing healthCheck handler.
Separate from /v1/base/health which remains under API prefix.
2026-03-01 18:04:25 -07:00
zeekay 1d637dee1c fix: default API prefix /v1/base (was /api) 2026-03-01 17:39:04 -07:00
zeekay 552057b5d9 feat: configurable API prefix via BASE_API_PREFIX env var
Default: /api (backward compat). Set BASE_API_PREFIX=/v1/base
for canonical /<version>/<service>/<path> pattern.
2026-03-01 17:36:55 -07:00
zeekay 82387543c9 fix: recognize built-in/superuser org as admin in JWT claims
Casdoor doesn't always include isAdmin in JWT claims. Check:
1. isAdmin claim (bool or string)
2. isGlobalAdmin claim
3. owner == 'built-in' or 'superuser' (IAM superuser org)
2026-03-02 16:54:45 -07:00
zeekay 98986b6495 feat: BASE_DISABLE_ADMIN_UI env var to hide /_/ entirely
When set, /_/ returns 404 JSON instead of serving the admin dashboard.
For production KMS/services that should never expose the admin panel.
2026-03-02 16:24:45 -07:00
zeekay bbb8d3da31 fix: ephemeral auth records only — no local user storage when IAM is active
IAM is the sole user store. Base creates ephemeral (unsaved) auth records
from JWT claims for rule evaluation. No writes to _superusers or users
collections. IAM admins (isAdmin=true) get _superusers collection context
for full access. Regular users get users collection context.

Zero local user records. Zero _superusers records. IAM is truth.
2026-03-02 15:46:10 -07:00
zeekay 2157de27f7 feat: IAM admin → Base superuser mapping, no local fallback
When an IAM JWT has isAdmin=true, the user is mapped to a _superusers
collection record in Base. This gives IAM admins full superuser access
to all collections — no separate _superusers auth needed.

Removed the local token fallback for _superusers. IAM is the sole
auth source in external-only mode. No hacks, no PB legacy.
2026-03-02 15:39:53 -07:00
zeekay dee0d76af8 fix: superuser token fallback in external-only auth mode + scrub PB references
- loadAuthToken now falls back to local validation for _superusers tokens
  when JWKS validation fails in external-only mode. Non-superuser local
  tokens are still rejected. Fixes seeding with IAM enabled.
- Scrub PocketBase references from docs, SDK, and UI config
2026-03-02 15:28:53 -07:00
zeekay 285e8cca10 Allow apps to override root route via BASE_SKIP_ROOT_REDIRECT 2026-03-02 15:35:53 -07:00
zeekay 6e44ac3159 Add IAM OIDC login for Base admin -- all auth through IAM
Implements OIDC authorization code flow with PKCE for the superuser
login page (/_/). When BASE_OIDC_ISSUER is set, the email/password
form is hidden and replaced with a single "Sign in" button that
redirects through the OIDC flow. The callback stores the auth token
in localStorage and redirects to the admin UI.

Routes:
  GET /_/auth/oidc/redirect  - start OIDC flow (state+PKCE cookies)
  GET /_/auth/oidc/callback  - exchange code, find/create superuser
  GET /_/api/oidc/config     - reports whether OIDC is enabled

Env vars: BASE_OIDC_ISSUER, BASE_OIDC_CLIENT_ID,
BASE_OIDC_CLIENT_SECRET, BASE_OIDC_AUTO_CREATE_SUPERUSER
2026-03-02 15:01:53 -07:00
zeekay 603f5c16e4 Remove hardcoded Hanzo Analytics and branding from admin UI 2026-03-02 14:17:21 -07:00
zeekay d02a70442d migrate: pocketbase/dbx → hanzoai/dbx v1.12.0
Drop-in replacement — same API, same package name (dbx).
75 Go files updated. Zero pocketbase references in imports.
2026-03-02 13:54:55 -07:00
zeekay 10bae7d7c7 fix: update test expectations for UUID-compatible ID field
ID field changed to max=36, pattern=^[a-z0-9\-]+$ to support UUIDs.
Tests in apis/collection_test.go and plugins/migratecmd expected
the old max=15, pattern=^[a-z0-9]+$.
2026-03-02 13:45:36 -07:00
zeekay eb0830f26d security: remove superuser fallback in external-only mode — IAM is the ONLY auth 2026-03-02 15:19:54 -07:00
zeekay b9ce86553a fix: return virtual auth record when IAM user Save fails
In IAM-only mode, the local Save() may fail due to collection rules
(createRule: null). Instead of returning nil (which makes the user
a guest), return the record with all JWT claims populated.

IAM is the user store — Base doesn't need to persist the record.
The record serves as auth context for the request only.
2026-03-02 15:10:48 -07:00
zeekay 9cb370fe1e refactor(auth): standardize OIDC/JWKS abstraction, remove IAM branding from core
Rename all IAM-specific identifiers to generic OIDC terminology:
- StoreKeyIAMJWKSURL → StoreKeyJWKSURL
- StoreKeyIAMOnly → StoreKeyExternalAuthOnly
- resolveIAMToken → resolveJWKSToken
- iamSub/iamOwner/iamEmail → authSub/authOwner/authEmail
- iamSubToRecordID → subToRecordID

Add externalAuthGuard() middleware to block built-in auth endpoints
(password, OTP, OAuth2, email-change, etc.) when external-only mode
is active. _superusers collection exempt for admin panel login.

Backward compat aliases preserved for StoreKeyIAM* constants.
2026-03-02 15:39:13 -07:00
zeekay 70db1463ce feat(auth): IAM-only mode, disable built-in auth when IAM configured
StoreKeyIAMOnly: when set, JWKS is tried first and built-in password/OTP
auth is disabled for non-superuser collections. Platform plugin sets this
automatically when IAM endpoint is configured.
2026-03-02 14:35:37 -07:00
zeekay acffe48227 debug: log IAM JWKS failure at WARN level (was DEBUG) 2026-03-01 22:22:58 -07:00
zeekay ae63272065 fix: JWKS ID padding, admin UI dist in git, X-Authorization alias
- Pad short IAM subs to 15 chars for Base record ID requirements
- Include ui/dist/ in git (un-ignored via !ui/dist/) so Go module
  consumers get embedded admin assets
- Add X-Authorization as auth header alias
- Add Makefile ui target, update release workflow
2026-03-01 19:09:33 -07:00
zeekay d8e7b87889 chore: update 2026-03-01 17:27:20 -07:00
zeekay f9d1b0af80 feat: accept UUID-length record IDs (max 36 chars, was 15) — IAM sub compatibility 2026-03-02 16:49:27 -07:00
zeekay 4e37e1e8cc auth: unify identity headers, add preferred_username JWT fallback
- resolveIAMToken: fallback sub → preferred_username → name (Casdoor compat)
- extractOrgID: X-Org-Id (was X-IAM-Org-Id)
- platformIdentityHeaders: remove X-Hanzo-* legacy headers
- Only X-User-Id, X-Org-Id, X-User-Email — no vendor prefix
2026-03-02 16:45:30 -07:00
zeekay fb0dce8533 fix: truncate IAM sub to 15 chars for Base record ID limit 2026-03-02 16:27:13 -07:00
zeekay 724c31293d feat: IAM JWKS fallback in loadAuthToken — Base accepts IAM JWTs natively 2026-03-02 14:40:08 -07:00
zeekay 33009aa6b9 fix: extractOrgID uses X-IAM-Org-Id not X-Org-ID 2026-03-02 00:28:00 -07:00
zeekay 157b7127ab security: fix critical and high findings from red team review
- C1: add orgId field to _tasks/_workflows, filter all queries by org
- C2: validate spaceID/orgID with regex before Temporal visibility queries
- H1: add sync.RWMutex to orgClients map (prevent concurrent map panic)
- H2: atomic FailTask with CASE expression (eliminate TOCTOU race)
- H4: extractCreator uses authenticated user ID, not raw headers
- Add orgId to collection schemas, store methods, and API filters
2026-03-02 01:02:45 -07:00
zeekay fcfaa37ce2 chore: strip all PocketBase cruft from codebase
- Delete 7 one-off migration utilities (cmd/fix*, cmd/token*)
- Rename env vars: PB_ID_TOKEN_LEEWAY → HZ_ID_TOKEN_LEEWAY,
  PB_FILES_DELETE_MAX_WORKERS → HZ_FILES_DELETE_MAX_WORKERS
- Rename temp file prefix: pb_buffer_file_ → hz_buffer_
- Rename test data dir: pb_base_app_test_data_dir → test_data_dir
- Strip all "PocketBase" from comments (→ "Base" or removed)
- Strip pb_data references in backup error messages
- Update @group PocketBase → @group Base in JSVM type docs
- Update filesystem blob/s3 package doc comments
- _hzf_ field IDs in test DB (already done prior commit)

Zero remaining PocketBase/pb_ references in production Go code.
Only legitimate deps remain: pocketbase/dbx (query builder),
pocketbase/tygoja (JS VM bindings).
2026-03-01 20:44:11 -07:00
zeekay 79555afb30 chore: strip _pbf_ PocketBase prefixes, unify to _hzf_
- Test fixture DB: rename all _pbf_* field IDs to _hzf_*
- collection_test.go: update hardcoded field IDs to match
- record_crud.go: __pb_create__ → __hzf_create__
- base_backup.go: old_pb_data_ → old_hz_data_
- Remove stale _hz_users_auth_ mapping from tokenreplace
2026-03-01 18:52:30 -07:00
zeekay 49d6f90dbb fix(tests): resolve all flaky CI test failures
- router: remove self-import cycle in rereadable_read_closer_test.go
- rate limit: bump sleep waits (800→1100ms, 1000→1200ms) to reliably
  cross 1-second window boundaries on slow CI
- verification: replace hardcoded expired JWT tokens with dynamically
  generated tokens via BeforeTestFunc + bytes.Buffer pattern
- password reset: same dynamic token generation fix
- collection update: fix system field IDs (_hzf_ → _pbf_) to match
  test database, so reserved name validation is reached
2026-03-01 18:37:12 -07:00
zeekay bb905e0226 feat(tasks): embed Temporal durable execution into base plugin
Adds native Temporal SDK integration to the tasks plugin:

- durable.go: DurableStore client (submit/cancel/signal/status workflows)
- workflows.go: AgentTaskWorkflow, PipelineWorkflow, FanOutWorkflow
- activities.go: ExecuteTaskActivity with heartbeat + pluggable executor
- worker.go: Embedded Temporal worker (polls task queue in-process)

SQLite remains authoritative state. Temporal provides crash-safe execution
that survives restarts. When durable is enabled:
- Task create → SQLite + Temporal workflow submission
- Task cancel → SQLite + Temporal workflow cancellation
- Task signal → forwarded to Temporal workflow

Multi-tenant via namespace-per-org (TASKS_NAMESPACE=org-acme).
Env config: TASKS_ENABLED, TASKS_ADDRESS, TASKS_NAMESPACE, TASKS_QUEUE.
Default cloud: tasks.hanzo.ai:7233. Falls back to SQLite-only if unreachable.
2026-03-01 17:12:06 -07:00
zeekay 3d88b99f8d feat(tasks): native SQLite-backed task execution plugin
Embeds a complete task queue and workflow scheduler into base using
the collection/record system backed by embedded SQLite.

Plugin creates _tasks and _workflows system collections on bootstrap
and runs a background scheduler that checks timeouts, advances
workflow state, and optionally auto-executes tasks via OnExecute callback.

API endpoints: create/get/list/update/claim/start/complete/fail/cancel/
progress/next (work-stealing) for tasks, plus create/get/list for
workflows with auto-chained pipeline and parallel (fan-out) support.

10 tests covering full lifecycle: CRUD, atomic claims, retry with
re-queue, dependency blocking, priority ordering, workflow advancement.
2026-03-02 16:58:15 -07:00
zeekay 4e847ebc4b feat(tasks): add durable task execution API (Hanzo Tasks integration)
New /api/tasks endpoints for durable workflow execution:
- POST /api/tasks — submit task
- GET /api/tasks — list tasks (filterable by state/queue)
- GET /api/tasks/{id} — get task details
- POST /api/tasks/{id}/cancel — cancel running task
- POST /api/tasks/{id}/signal — signal running task
- GET /api/tasks/{id}/query/{queryType} — query task state
- POST /api/tasks/workflows — submit workflow (pipeline/fan-out)
- GET /api/tasks/workflows — list workflows
- GET /api/tasks/workflows/{id} — get workflow details

Superuser auth required. Hanzo Tasks (Temporal) backend injected via OnServe hook.
No hard dependency on Temporal SDK — handlers return placeholder until backend connected.
2026-03-02 10:29:07 -07:00
zeekay 7448c6cea5 fix: add root redirect to /_/ admin UI 2026-03-02 01:43:39 -07:00
zeekay 6d1d67d362 fix: nuclear CSS override — white bg black text on primary button, kill ::before 2026-03-02 01:23:29 -07:00
zeekay fff0bca4f4 fix: CSP allows Google Fonts + analytics, fresh remixicon font, black text on CTA 2026-03-02 00:56:03 -07:00
zeekay 3fe483ac1b refactor: remove _hz_ prefix from collection IDs, add brand-neutral logo config
Remove all _hz_ prefixes from collection IDs, internal markers, and test
fixtures. The default users collection is now _users_auth_ instead of
_hz_users_auth_. Internal SQL parser tokens renamed from __hz_join__/__hz_discard__
to __join__/__discard__. Backup prefix changed from @auto_hz_backup_ to
@auto_backup_. Test database updated with correct collection IDs and indexes.
JWT tokens in test files regenerated with new collection IDs.

Add LogoURL field to MetaConfig so the admin UI logo is configurable via
app settings instead of hardcoded. FullPage.svelte and App.svelte sidebar
now read logo and app name from the settings store, falling back to
defaults when not configured.
2026-03-01 23:48:36 -07:00
zeekay ee7255323b fix: replace remaining pb references with base in ApiClient.js 2026-03-01 21:59:17 -07:00
zeekay cf0252a28e Merge remote-tracking branch 'upstream/master'
# Conflicts:
#	apis/record_auth_with_otp.go
#	core/base_backup.go
#	go.mod
#	go.sum
#	plugins/jsvm/internal/types/generated/types.d.ts
#	tools/router/rereadable_read_closer_test.go
#	ui/dist/assets/AuthMethodsDocs-C2aSYmNv.js
#	ui/dist/assets/AuthRefreshDocs-BapWJLRK.js
#	ui/dist/assets/AuthWithOAuth2Docs-Ck_pnbL8.js
#	ui/dist/assets/AuthWithOtpDocs-D8uWq_C5.js
#	ui/dist/assets/AuthWithPasswordDocs-BQyMhAeO.js
#	ui/dist/assets/BatchApiDocs-rvUuWLZE.js
#	ui/dist/assets/CodeEditor-DrMyw8z_.js
#	ui/dist/assets/CreateApiDocs-XWzcGuMB.js
#	ui/dist/assets/DeleteApiDocs-CScE0aw3.js
#	ui/dist/assets/EmailChangeDocs-CxOtrB4s.js
#	ui/dist/assets/FieldsQueryParam-BzNUQIb5.js
#	ui/dist/assets/FilterAutocompleteInput-Dm2G2coC.js
#	ui/dist/assets/Leaflet-DyumpnOc.js
#	ui/dist/assets/ListApiDocs-CdOzMZnr.js
#	ui/dist/assets/PageInstaller-vIXdffAJ.js
#	ui/dist/assets/PageOAuth2RedirectFailure-ClpyaW_B.js
#	ui/dist/assets/PageOAuth2RedirectSuccess-BLZml1eK.js
#	ui/dist/assets/PageRecordConfirmEmailChange-Cm3O2YD1.js
#	ui/dist/assets/PageRecordConfirmPasswordReset-D0XfuL45.js
#	ui/dist/assets/PageRecordConfirmVerification-CYyNYH_v.js
#	ui/dist/assets/PageSuperuserConfirmPasswordReset-BvlQ0_9t.js
#	ui/dist/assets/PageSuperuserRequestPasswordReset-gUPMclJZ.js
#	ui/dist/assets/PasswordResetDocs-DMF1vqE0.js
#	ui/dist/assets/RealtimeApiDocs-CNVij_C2.js
#	ui/dist/assets/UpdateApiDocs-CwQ3ZhFQ.js
#	ui/dist/assets/VerificationDocs-DUeWWjrS.js
#	ui/dist/assets/ViewApiDocs-gocWxbTE.js
#	ui/dist/assets/index-CWGqJiyp.js
#	ui/dist/index.html
2026-03-01 19:27:21 -07:00
Gani Georgiev 82fdc4f137 replace the custom ratelimiter strategy with a fixed window 2026-03-02 11:25:15 +02:00
Gani Georgiev fb2eeb7f0e [#7575] use memory+file buffer when rereading the request body (fix #7572) 2026-03-02 17:19:09 +02:00
Gani Georgiev 9feb83cdad applied lint typo fixes 2026-03-02 22:31:27 +02:00
zeekay 7195369ba2 fix: remove all hz_/pb_ prefixes, use clean names (public, data, migrations, hooks) 2026-03-02 14:24:33 -07:00
zeekay a4cb1bc7ea Fix bugs from CTO audit: presence race, IAM cache, KMS token caching, SDK fixes
- presence.go: Replace slice-index callback tracking with ID-based map
  to prevent stale index corruption on unsubscribe
- ws.go: Remove 7 unused WebSocket close code constants
- platform.go: Move config defaults before IAMClient creation, use
  cached p.iam.ValidateToken() instead of standalone function
- kms.go: Add KMS auth token caching with expiry-aware refresh
- collection.ts: Implement unsubscribe() (was silent no-op)
- index.ts: Remove duplicate ListResult type export
- use-query.ts: Fix missing deps bug by serializing full options as
  stable key via JSON.stringify, remove eslint-disable
2026-02-27 10:13:00 -08:00
zeekay 7f17d4b316 Add realtime DX platform: CRDT engine, WebSocket, SDKs, typegen, scheduler, multi-tenant
7-phase implementation of Convex-inspired realtime developer experience:

- crdt/: Go CRDT engine (GCounter, PNCounter, LWWRegister, ORSet, RGA text)
  with state-vector sync protocol and convergence-tested types (31 tests)
- apis/ws.go: Pure RFC 6455 WebSocket endpoint with JWT auth, CRDT sync,
  presence tracking, channel subscriptions
- apis/presence.go: Channel-based presence manager for collaborative awareness
- cmd/typegen/: CLI tool to generate TypeScript interfaces from Base schemas
  (4 tests, all 14 field types mapped)
- plugins/scheduler/: Scheduled functions with exactly-once semantics,
  retry with backoff, JSVM bindings (8 tests)
- plugins/platform/: Multi-tenant platform with IAM (hanzo.id) auth,
  KMS (kms.hanzo.ai) secrets, tenant isolation via collection prefixes,
  RBAC roles, API key management (7 tests)
- sdk/base-js/: @hanzoai/base TypeScript SDK with reactive queries,
  query deduplication, optimistic updates, state versioning, CRDT client
  (72 smoke tests passing)
- sdk/base-react/: @hanzoai/base-react React hooks (useQuery, useMutation,
  useAuth, useRealtime, useCRDT, usePresence) with useSyncExternalStore
2026-02-27 10:00:24 -08:00
zeekay 6759ac456c Rebrand PocketBase imports to Hanzo Base across all Go files
Replace github.com/pocketbase/pocketbase with github.com/hanzoai/base
in 106 Go source files. Keep pocketbase/dbx and pocketbase/tygoja as-is
(upstream dependencies). Add compiled binary to .gitignore. Include
realtime DX design document inspired by Convex patterns.
2026-02-27 09:43:39 -08:00
zeekay 4b229fae5b Merge remote-tracking branch 'upstream/master'
# Conflicts:
#	core/record_field_resolver_multi_match.go
#	ui/dist/assets/AuthMethodsDocs-ChShXLwE.js
#	ui/dist/assets/AuthMethodsDocs-Cqvl0T_l.js
#	ui/dist/assets/AuthMethodsDocs-DIqhS7qY.js
#	ui/dist/assets/AuthRefreshDocs-CHakkNnn.js
#	ui/dist/assets/AuthRefreshDocs-DLb1qree.js
#	ui/dist/assets/AuthRefreshDocs-DXgrlMdk.js
#	ui/dist/assets/AuthWithOAuth2Docs-Bl8VRxNv.js
#	ui/dist/assets/AuthWithOAuth2Docs-DVBOel22.js
#	ui/dist/assets/AuthWithOAuth2Docs-I213UiJ7.js
#	ui/dist/assets/AuthWithOtpDocs-B9tL6gIN.js
#	ui/dist/assets/AuthWithOtpDocs-C2PPm9-Z.js
#	ui/dist/assets/AuthWithOtpDocs-qEMoMG3D.js
#	ui/dist/assets/AuthWithPasswordDocs-B8JWDbPL.js
#	ui/dist/assets/AuthWithPasswordDocs-BTHeYJwE.js
#	ui/dist/assets/AuthWithPasswordDocs-D9rqgLpO.js
#	ui/dist/assets/BatchApiDocs-BV4PYYXn.js
#	ui/dist/assets/BatchApiDocs-DXa997am.js
#	ui/dist/assets/BatchApiDocs-Di2Qe2dV.js
#	ui/dist/assets/DeleteApiDocs-C3IINRwz.js
#	ui/dist/assets/DeleteApiDocs-LfmVp4Uf.js
#	ui/dist/assets/DeleteApiDocs-SU4XdGhJ.js
#	ui/dist/assets/EmailChangeDocs-COx1USU5.js
#	ui/dist/assets/EmailChangeDocs-D-qNHT_P.js
#	ui/dist/assets/EmailChangeDocs-DpfXIE_V.js
#	ui/dist/assets/FieldsQueryParam-BYe9ZK-G.js
#	ui/dist/assets/FieldsQueryParam-L8vpHeF4.js
#	ui/dist/assets/FieldsQueryParam-z0dGQ6uY.js
#	ui/dist/assets/ListApiDocs-BCTT-AOz.js
#	ui/dist/assets/ListApiDocs-C0_GwI7k.js
#	ui/dist/assets/ListApiDocs-T9_aO-pW.js
#	ui/dist/assets/PageInstaller-B22bivaN.js
#	ui/dist/assets/PageInstaller-C0BBhyBx.js
#	ui/dist/assets/PageInstaller-IYSwJhZW.js
#	ui/dist/assets/PageOAuth2RedirectFailure-BjbpqlFj.js
#	ui/dist/assets/PageOAuth2RedirectFailure-COyNF79R.js
#	ui/dist/assets/PageOAuth2RedirectFailure-DPmGG9zv.js
#	ui/dist/assets/PageOAuth2RedirectSuccess-6cMXLFAX.js
#	ui/dist/assets/PageOAuth2RedirectSuccess-CdkCarGH.js
#	ui/dist/assets/PageOAuth2RedirectSuccess-DSEIHeQL.js
#	ui/dist/assets/PageRecordConfirmEmailChange-BYW-6ASg.js
#	ui/dist/assets/PageRecordConfirmEmailChange-Bm1CIYvq.js
#	ui/dist/assets/PageRecordConfirmEmailChange-BpaqOT4u.js
#	ui/dist/assets/PageRecordConfirmPasswordReset--wx_u2lI.js
#	ui/dist/assets/PageRecordConfirmPasswordReset-CoeY2Z_C.js
#	ui/dist/assets/PageRecordConfirmPasswordReset-Ptya5bfe.js
#	ui/dist/assets/PageRecordConfirmVerification-6xjF3T0O.js
#	ui/dist/assets/PageRecordConfirmVerification-C1UTIIJh.js
#	ui/dist/assets/PageRecordConfirmVerification-C4LixXvA.js
#	ui/dist/assets/PageSuperuserConfirmPasswordReset-19z2IFg4.js
#	ui/dist/assets/PageSuperuserConfirmPasswordReset-DwNi0ugQ.js
#	ui/dist/assets/PageSuperuserConfirmPasswordReset-SMnDTRNi.js
#	ui/dist/assets/PageSuperuserRequestPasswordReset-BpDW217f.js
#	ui/dist/assets/PageSuperuserRequestPasswordReset-DK63qE6z.js
#	ui/dist/assets/PageSuperuserRequestPasswordReset-bG02qLIM.js
#	ui/dist/assets/PasswordResetDocs-CE67mLC0.js
#	ui/dist/assets/PasswordResetDocs-CHAK0vma.js
#	ui/dist/assets/PasswordResetDocs-Dap-N4rx.js
#	ui/dist/assets/RealtimeApiDocs-BooTSQCb.js
#	ui/dist/assets/RealtimeApiDocs-CoHmYVEx.js
#	ui/dist/assets/RealtimeApiDocs-D7ds3fHt.js
#	ui/dist/assets/VerificationDocs-B42AIoCQ.js
#	ui/dist/assets/VerificationDocs-BS7b11zH.js
#	ui/dist/assets/VerificationDocs-ZhkdFVIl.js
#	ui/dist/assets/ViewApiDocs-BXmRLHZ1.js
#	ui/dist/assets/ViewApiDocs-DM5JJQjh.js
#	ui/dist/assets/ViewApiDocs-DRpxcuJR.js
#	ui/public/fonts/source-sans-pro/source-sans-pro-v18-latin_cyrillic-700.woff2
#	ui/public/fonts/ubuntu-mono/ubuntu-mono-v17-cyrillic_latin-700.woff2
2026-02-22 01:17:16 -08:00
Gani Georgiev e6f2c6ade5 [#7525] made Bearer prefix case-insensitive 2026-02-14 11:19:13 +02:00
zeekay 86273e0e2c feat: rebrand to Hanzo Base with GeoPoint field support and token management 2026-02-13 22:12:10 -08:00
Gani Georgiev 770fea1f62 renamed outdated rate limit struct name and added reminder to reavulate the algorithm 2025-11-18 22:23:59 +02:00