@hilbras/omnihilbras 2.0.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -14
- package/app/.next-cli-build/BUILD_ID +1 -1
- package/app/.next-cli-build/app-path-routes-manifest.json +18 -18
- package/app/.next-cli-build/build-manifest.json +3 -3
- package/app/.next-cli-build/prerender-manifest.json +17 -17
- package/app/.next-cli-build/react-loadable-manifest.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/basic-chat/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/[toolId]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/cli-tools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/combos/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/console-log/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/endpoint/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js +12 -12
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/[kind]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js +2 -2
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/combo/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/media-providers/web/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/mitm/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/profile/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/[id]/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/new/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/providers/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/proxy-pools/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/pxpipe/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/quota/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/skills/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/token-saver/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/translator/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/(dashboard)/dashboard/usage/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_global-error/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_global-error.html +1 -1
- package/app/.next-cli-build/server/app/_global-error.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/app/.next-cli-build/server/app/_not-found/page.js +1 -1
- package/app/.next-cli-build/server/app/_not-found/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/_not-found.html +1 -1
- package/app/.next-cli-build/server/app/_not-found.rsc +3 -3
- package/app/.next-cli-build/server/app/_not-found.segments/_full.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/_not-found.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/api/auth/login/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/logout/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/logout/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/callback/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/start/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/oidc/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/reset-password/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/reset-password/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/saml/acs/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/saml/acs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/saml/metadata/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/saml/metadata/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/saml/start/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/saml/start/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/saml/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/saml/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/auth/status/route.js +1 -1
- package/app/.next-cli-build/server/app/api/auth/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/all-statuses/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/alias/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/antigravity-mitm/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/claude-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cline-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/codewhale-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/codewhale-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/codex-profiles/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/codex-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/copilot-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-registry/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-mcp-tools/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/cowork-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/crush-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/crush-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/deepseek-tui-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/devin-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/droid-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/forge-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/forge-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/grok-build-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/grok-build-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/hermes-profiles/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/hermes-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/jcode-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/kilo-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/omp-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/omp-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/openclaw-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/opencode-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/pi-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/pi-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/smelt-settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/cli-tools/smelt-settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/combos/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/combos/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/combos/presets/route.js +1 -1
- package/app/.next-cli-build/server/app/api/combos/presets/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/combos/route.js +1 -1
- package/app/.next-cli-build/server/app/api/combos/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/headroom/extras/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/headroom/proxy/[...path]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/headroom/proxy/[...path]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/headroom/restart/route.js +1 -1
- package/app/.next-cli-build/server/app/api/headroom/restart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/headroom/start/route.js +1 -1
- package/app/.next-cli-build/server/app/api/headroom/start/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/headroom/status/route.js +1 -1
- package/app/.next-cli-build/server/app/api/headroom/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/headroom/stop/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/health/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/init/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/keys/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/keys/route.js +1 -1
- package/app/.next-cli-build/server/app/api/keys/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/locale/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/message/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/mcp/[plugin]/sse/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/deepgram/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/elevenlabs/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/inworld/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/minimax/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/media-providers/tts/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/alias/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/alias/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/availability/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/availability/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/catalog-sync/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/custom/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/custom/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/disabled/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/disabled/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/models/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/models/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/[provider]/[action]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/codex/bulk-import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/codex/bulk-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/codex/import-token/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/cursor/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/gitlab/pat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/grok-cli/bulk-import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/grok-cli/bulk-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/iflow/cookie/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/api-key/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/api-key/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/import-cli-proxy/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/import-cli-proxy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-authorize/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/kiro/social-exchange/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/xiaomi-mimo/api-key/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/xiaomi-mimo/api-key/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/xiaomi-mimo/auto-import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/xiaomi-mimo/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/xiaomi-mimo/login/start/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/xiaomi-mimo/login/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/zed/auto-import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/oauth/zed/import/route.js +1 -1
- package/app/.next-cli-build/server/app/api/oauth/zed/import/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pricing/route.js +1 -1
- package/app/.next-cli-build/server/app/api/pricing/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/route.js +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js +1 -1
- package/app/.next-cli-build/server/app/api/provider-nodes/validate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/overrides/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/overrides/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/[id]/test-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/client/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/client/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/kilo/free-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/suggested-models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/suggested-models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/test-batch/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/test-batch/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/providers/validate/route.js +1 -1
- package/app/.next-cli-build/server/app/api/providers/validate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/[id]/test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js +2 -2
- package/app/.next-cli-build/server/app/api/proxy-pools/cloudflare-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/deno-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/netlify-deploy/route.js +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/netlify-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/route.js +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js +1 -1
- package/app/.next-cli-build/server/app/api/proxy-pools/vercel-deploy/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pxpipe/health/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pxpipe/install/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pxpipe/logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pxpipe/restart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pxpipe/start/route.js +1 -1
- package/app/.next-cli-build/server/app/api/pxpipe/start/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pxpipe/stats/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pxpipe/status/route.js +1 -1
- package/app/.next-cli-build/server/app/api/pxpipe/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/pxpipe/stop/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/database/route.js +1 -1
- package/app/.next-cli-build/server/app/api/settings/database/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/proxy-test/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/require-login/route.js +1 -1
- package/app/.next-cli-build/server/app/api/settings/require-login/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/settings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/settings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/shutdown/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tags/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/console-logs/stream/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/load/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/save/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/send/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/send/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/translator/translate/route.js +1 -1
- package/app/.next-cli-build/server/app/api/translator/translate/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/disable/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/disable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/enable/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/enable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/status/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/status/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-check/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-disable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-enable/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js +1 -1
- package/app/.next-cli-build/server/app/api/tunnel/tailscale-install/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/claude-reset/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/claude-reset/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/codex-reset-credits/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/codex-reset-credits/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/[connectionId]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/chart/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/chart/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/history/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/history/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/logs/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/providers/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/providers/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-details/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-details/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-logs/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/request-logs/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stats/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/stats/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/usage/stream/route.js +1 -1
- package/app/.next-cli-build/server/app/api/usage/stream/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/api/chat/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/api/chat/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/speech/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/transcriptions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/audio/voices/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/chat/completions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/embeddings/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/embeddings/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/images/generations/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/images/generations/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/messages/count_tokens/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/messages/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/messages/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/[...model]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/[...model]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/info/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/compact/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/responses/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/search/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/search/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/systemone/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/systemone/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/videos/[id]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/videos/[id]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/videos/edits/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/videos/edits/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/videos/extensions/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/videos/extensions/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/videos/generations/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/videos/generations/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1/web/fetch/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/[...path]/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/v1beta/models/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/shutdown/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/shutdown/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/api/version/update/route.js +1 -1
- package/app/.next-cli-build/server/app/api/version/update/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/callback/page.js +1 -1
- package/app/.next-cli-build/server/app/callback/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/callback/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/callback.html +1 -1
- package/app/.next-cli-build/server/app/callback.rsc +3 -3
- package/app/.next-cli-build/server/app/callback.segments/_full.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/callback.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/callback.segments/callback/__PAGE__.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/basic-chat.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/basic-chat.rsc +23 -21
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/!KGRhc2hib2FyZCk/dashboard/basic-chat/__PAGE__.segment.rsc +25 -23
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_full.segment.rsc +23 -21
- package/app/.next-cli-build/server/app/dashboard/basic-chat.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/cli-tools.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/cli-tools.rsc +26 -24
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/!KGRhc2hib2FyZCk/dashboard/cli-tools/__PAGE__.segment.rsc +27 -25
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_full.segment.rsc +26 -24
- package/app/.next-cli-build/server/app/dashboard/cli-tools.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/combos.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/combos.rsc +27 -25
- package/app/.next-cli-build/server/app/dashboard/combos.segments/!KGRhc2hib2FyZCk/dashboard/combos/__PAGE__.segment.rsc +29 -27
- package/app/.next-cli-build/server/app/dashboard/combos.segments/_full.segment.rsc +27 -25
- package/app/.next-cli-build/server/app/dashboard/combos.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/endpoint.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/endpoint.rsc +25 -23
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/!KGRhc2hib2FyZCk/dashboard/endpoint/__PAGE__.segment.rsc +26 -24
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_full.segment.rsc +25 -23
- package/app/.next-cli-build/server/app/dashboard/endpoint.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.rsc +27 -25
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/!KGRhc2hib2FyZCk/dashboard/media-providers/web/__PAGE__.segment.rsc +29 -27
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_full.segment.rsc +27 -25
- package/app/.next-cli-build/server/app/dashboard/media-providers/web.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/mitm.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/mitm.rsc +25 -23
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/!KGRhc2hib2FyZCk/dashboard/mitm/__PAGE__.segment.rsc +27 -25
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_full.segment.rsc +25 -23
- package/app/.next-cli-build/server/app/dashboard/mitm.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/profile.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/profile.rsc +26 -24
- package/app/.next-cli-build/server/app/dashboard/profile.segments/!KGRhc2hib2FyZCk/dashboard/profile/__PAGE__.segment.rsc +28 -26
- package/app/.next-cli-build/server/app/dashboard/profile.segments/_full.segment.rsc +26 -24
- package/app/.next-cli-build/server/app/dashboard/profile.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers/new.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers/new.rsc +27 -25
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/!KGRhc2hib2FyZCk/dashboard/providers/new/__PAGE__.segment.rsc +29 -27
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_full.segment.rsc +27 -25
- package/app/.next-cli-build/server/app/dashboard/providers/new.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/providers.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/providers.rsc +26 -24
- package/app/.next-cli-build/server/app/dashboard/providers.segments/!KGRhc2hib2FyZCk/dashboard/providers/__PAGE__.segment.rsc +28 -26
- package/app/.next-cli-build/server/app/dashboard/providers.segments/_full.segment.rsc +26 -24
- package/app/.next-cli-build/server/app/dashboard/providers.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.rsc +26 -24
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/!KGRhc2hib2FyZCk/dashboard/proxy-pools/__PAGE__.segment.rsc +28 -26
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_full.segment.rsc +26 -24
- package/app/.next-cli-build/server/app/dashboard/proxy-pools.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/pxpipe.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/pxpipe.rsc +26 -24
- package/app/.next-cli-build/server/app/dashboard/pxpipe.segments/!KGRhc2hib2FyZCk/dashboard/pxpipe/__PAGE__.segment.rsc +28 -26
- package/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_full.segment.rsc +26 -24
- package/app/.next-cli-build/server/app/dashboard/pxpipe.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/quota.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/quota.rsc +24 -22
- package/app/.next-cli-build/server/app/dashboard/quota.segments/!KGRhc2hib2FyZCk/dashboard/quota/__PAGE__.segment.rsc +26 -24
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_full.segment.rsc +24 -22
- package/app/.next-cli-build/server/app/dashboard/quota.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/settings/pricing/page.js +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_full.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/settings/pricing.segments/dashboard/settings/pricing/__PAGE__.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/dashboard/skills.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/skills.rsc +26 -24
- package/app/.next-cli-build/server/app/dashboard/skills.segments/!KGRhc2hib2FyZCk/dashboard/skills/__PAGE__.segment.rsc +28 -26
- package/app/.next-cli-build/server/app/dashboard/skills.segments/_full.segment.rsc +26 -24
- package/app/.next-cli-build/server/app/dashboard/skills.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/token-saver.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/token-saver.rsc +23 -21
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/!KGRhc2hib2FyZCk/dashboard/token-saver/__PAGE__.segment.rsc +25 -23
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_full.segment.rsc +23 -21
- package/app/.next-cli-build/server/app/dashboard/token-saver.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/translator.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/translator.rsc +26 -24
- package/app/.next-cli-build/server/app/dashboard/translator.segments/!KGRhc2hib2FyZCk/dashboard/translator/__PAGE__.segment.rsc +28 -26
- package/app/.next-cli-build/server/app/dashboard/translator.segments/_full.segment.rsc +26 -24
- package/app/.next-cli-build/server/app/dashboard/translator.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard/usage.html +1 -1
- package/app/.next-cli-build/server/app/dashboard/usage.rsc +27 -25
- package/app/.next-cli-build/server/app/dashboard/usage.segments/!KGRhc2hib2FyZCk/dashboard/usage/__PAGE__.segment.rsc +29 -27
- package/app/.next-cli-build/server/app/dashboard/usage.segments/_full.segment.rsc +27 -25
- package/app/.next-cli-build/server/app/dashboard/usage.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/dashboard.html +1 -1
- package/app/.next-cli-build/server/app/dashboard.rsc +24 -22
- package/app/.next-cli-build/server/app/dashboard.segments/!KGRhc2hib2FyZCk/dashboard/__PAGE__.segment.rsc +24 -22
- package/app/.next-cli-build/server/app/dashboard.segments/_full.segment.rsc +24 -22
- package/app/.next-cli-build/server/app/dashboard.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/favicon.ico/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/index.html +1 -1
- package/app/.next-cli-build/server/app/index.rsc +3 -3
- package/app/.next-cli-build/server/app/index.segments/__PAGE__.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/index.segments/_full.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/index.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/landing/page.js +1 -1
- package/app/.next-cli-build/server/app/landing/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/landing/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/landing.html +1 -1
- package/app/.next-cli-build/server/app/landing.rsc +3 -3
- package/app/.next-cli-build/server/app/landing.segments/_full.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/landing.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/landing.segments/landing/__PAGE__.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/login/page.js +1 -1
- package/app/.next-cli-build/server/app/login/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/login/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app/login.html +1 -1
- package/app/.next-cli-build/server/app/login.rsc +3 -3
- package/app/.next-cli-build/server/app/login.segments/_full.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/login.segments/_tree.segment.rsc +2 -2
- package/app/.next-cli-build/server/app/login.segments/login/__PAGE__.segment.rsc +3 -3
- package/app/.next-cli-build/server/app/manifest.webmanifest/route.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/page.js +1 -1
- package/app/.next-cli-build/server/app/page.js.nft.json +1 -1
- package/app/.next-cli-build/server/app/page_client-reference-manifest.js +1 -1
- package/app/.next-cli-build/server/app-paths-manifest.json +18 -18
- package/app/.next-cli-build/server/chunks/1019.js +1 -1
- package/app/.next-cli-build/server/chunks/2132.js +1 -1
- package/app/.next-cli-build/server/chunks/3276.js +3 -3
- package/app/.next-cli-build/server/chunks/3799.js +1 -1
- package/app/.next-cli-build/server/chunks/4043.js +1 -1
- package/app/.next-cli-build/server/chunks/4123.js +1 -1
- package/app/.next-cli-build/server/chunks/4199.js +1 -1
- package/app/.next-cli-build/server/chunks/436.js +1 -1
- package/app/.next-cli-build/server/chunks/4663.js +1 -1
- package/app/.next-cli-build/server/chunks/4785.js +25 -0
- package/app/.next-cli-build/server/chunks/5036.js +1 -0
- package/app/.next-cli-build/server/chunks/5245.js +1 -1
- package/app/.next-cli-build/server/chunks/5330.js +2 -2
- package/app/.next-cli-build/server/chunks/7211.js +1 -1
- package/app/.next-cli-build/server/chunks/7525.js +1 -1
- package/app/.next-cli-build/server/chunks/7557.js +1 -1
- package/app/.next-cli-build/server/chunks/7811.js +1 -1
- package/app/.next-cli-build/server/chunks/827.js +1 -1
- package/app/.next-cli-build/server/chunks/8416.js +1 -1
- package/app/.next-cli-build/server/chunks/8499.js +2 -2
- package/app/.next-cli-build/server/chunks/8895.js +1 -1
- package/app/.next-cli-build/server/chunks/8920.js +1 -1
- package/app/.next-cli-build/server/chunks/915.js +2 -2
- package/app/.next-cli-build/server/chunks/9609.js +1 -1
- package/app/.next-cli-build/server/instrumentation.js.nft.json +1 -1
- package/app/.next-cli-build/server/middleware-build-manifest.js +1 -1
- package/app/.next-cli-build/server/middleware-react-loadable-manifest.js +1 -1
- package/app/.next-cli-build/server/middleware.js.nft.json +1 -1
- package/app/.next-cli-build/server/pages/404.html +1 -1
- package/app/.next-cli-build/server/pages/500.html +1 -1
- package/app/.next-cli-build/static/chunks/{761-2556f561563ff774.js → 761-7590878484e89ed1.js} +1 -1
- package/app/.next-cli-build/static/chunks/7958-b44b343c4ee9f7e0.js +5 -0
- package/app/.next-cli-build/static/chunks/{85-614327c9c3f40a7d.js → 85-abdd4f18753cba17.js} +1 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/basic-chat/page-4cf42b10bafdba52.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/console-log/page-82a7e01a2e463ba2.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/error-c23142e5f5729b5c.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/media-providers/[kind]/[id]/{page-7451e45c01e9f365.js → page-de738056c6c3f5e2.js} +12 -12
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/page-e32ad708ff93ccbb.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/pxpipe/page-1e8ce4fa24e2def5.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/quota/page-61bfa3b2f16b0c6d.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/skills/page-e478c2c7c2491d20.js +1 -0
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/usage/{page-5b432879d2c3afc9.js → page-5bc45ce6d914f906.js} +1 -1
- package/app/.next-cli-build/static/chunks/{webpack-13acc920e6f6a68b.js → webpack-bdd19f62aea907f6.js} +1 -1
- package/app/.next-cli-build/static/css/c478309e956d6de4.css +1 -0
- package/app/cli/.build-home/.omnihilbras/db/data.sqlite +0 -0
- package/app/custom-server.js +7 -0
- package/app/package.json +1 -1
- package/app/public/i18n/literals/fa.json +2 -2
- package/app/public/i18n/literals/id.json +2 -2
- package/app/public/i18n/literals/km.json +2 -2
- package/app/public/i18n/literals/th.json +2 -2
- package/app/public/i18n/literals/zh-CN.json +2 -2
- package/app/src/mitm/server.js +29 -29
- package/cli.js +12 -7
- package/hooks/postinstall.js +1 -1
- package/package.json +1 -1
- package/src/cli/api/client.js +1 -1
- package/src/cli/commands/connect.js +6 -6
- package/src/cli/terminalUI.js +1 -1
- package/src/cli/utils/endpoint.js +2 -2
- package/app/.next-cli-build/server/chunks/7960.js +0 -1
- package/app/.next-cli-build/server/chunks/9100.js +0 -21
- package/app/.next-cli-build/static/chunks/7958-7e4ad761a83f2a9e.js +0 -5
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/basic-chat/page-31316583ab546200.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/console-log/page-decadb6df9e9b417.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/providers/page-a1700bfc6ebb2aac.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/pxpipe/page-71f0c81cddbab903.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/quota/page-e925ebcef32004ab.js +0 -1
- package/app/.next-cli-build/static/chunks/app/(dashboard)/dashboard/skills/page-2422a9a60e84a259.js +0 -1
- package/app/.next-cli-build/static/css/cf553f425046a901.css +0 -1
- /package/app/.next-cli-build/static/{fAJh8_GCT173XCQuAE5si → 2lzaQ8Vt54PR86aQkWaou}/_buildManifest.js +0 -0
- /package/app/.next-cli-build/static/{fAJh8_GCT173XCQuAE5si → 2lzaQ8Vt54PR86aQkWaou}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/acc1c922d613a50a.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/dbccb4a9e22cbf0d-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/4b6560d3a7ee35a9.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/cf553f425046a901.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-13acc920e6f6a68b.js"/><script src="/_next/static/chunks/4bd1b696-8cd12253b448cc13.js" async=""></script><script src="/_next/static/chunks/3794-04350b0fcecd82e5.js" async=""></script><script src="/_next/static/chunks/main-app-71b3088720a13691.js" async=""></script><script src="/_next/static/chunks/8500-63a4afbeacab3b52.js" async=""></script><script src="/_next/static/chunks/246-0bbd2c1424911b5c.js" async=""></script><script src="/_next/static/chunks/85-614327c9c3f40a7d.js" async=""></script><script src="/_next/static/chunks/705-f07c546a169bc3d2.js" async=""></script><script src="/_next/static/chunks/5497-dea83eee58687b78.js" async=""></script><script src="/_next/static/chunks/app/(dashboard)/layout-20e79861e79ed846.js" async=""></script><script src="/_next/static/chunks/505-d36ae6201af05bc2.js" async=""></script><script src="/_next/static/chunks/app/layout-9a382aa3bca368d1.js" async=""></script><script src="/_next/static/chunks/app/landing/page-0a57d1766f9a201d.js" async=""></script><link rel="preload" href="https://www.googletagmanager.com/gtag/js?id=G-LC959F603F" as="script"/><meta name="theme-color" content="#0c0b09"/><title>OmniHilbras — One route to every model</title><meta name="description" content="OmniHilbras is the intelligent routing layer between your applications and every AI provider. A self-hostable AI gateway for intelligent routing, automatic fallback, and one clean API."/><link rel="manifest" href="/manifest.webmanifest"/><meta property="og:title" content="OmniHilbras — One route to every model"/><meta property="og:description" content="A self-hostable AI gateway for intelligent routing, automatic fallback, and one clean API."/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary"/><meta name="twitter:title" content="OmniHilbras — One route to every model"/><meta name="twitter:description" content="A self-hostable AI gateway for intelligent routing, automatic fallback, and one clean API."/><link rel="icon" href="/favicon.ico?603d046c9a6fdfbb" type="image/x-icon" sizes="16x16"/><link rel="icon" href="/favicon.svg"/><meta name="next-size-adjust" content=""/><script>(function(){try{var s=localStorage.getItem('theme');var t=s?(JSON.parse(s).state||{}).theme:'system';t=t||'system';var m=window.matchMedia('(prefers-color-scheme: dark)').matches;if(t==='dark'||(t==='system'&&m)){document.documentElement.classList.add('dark')}}catch(e){}})();</script><script>var d=document,r=d.documentElement,f=function(){r.classList.add('fonts-loaded')};if(d.fonts&&d.fonts.load){d.fonts.load('24px "Material Symbols Outlined"').then(f).catch(f);setTimeout(f,3000)}else{f()}</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="__variable_4cefcd __variable_ad0237 font-sans antialiased"><div hidden=""><!--$--><!--/$--></div><div class="page-enter min-h-screen overflow-x-clip bg-bg text-text"><canvas class="particle-canvas" aria-hidden="true"></canvas><header class="nav-blur sticky top-0 z-50"><nav class="relative mx-auto flex h-16 max-w-6xl items-center gap-6 px-5" aria-label="Main navigation"><a href="#main" class="skip-link btn-gold">Skip to content</a><a class="flex shrink-0 items-center gap-2.5 text-[15px] font-semibold tracking-tight" href="/"><span class="text-xl leading-none text-gold" aria-hidden="true">◈</span><span>Omni<span class="muted font-normal">Hilbras</span></span></a><div class="absolute top-1/2 left-1/2 hidden -translate-x-1/2 -translate-y-1/2 items-center gap-1 whitespace-nowrap lg:flex"><a href="#product" class="rounded-lg px-2.5 py-1.5 text-sm text-muted transition-colors hover:text-gold-text">Product</a><a href="#how-it-works" class="rounded-lg px-2.5 py-1.5 text-sm text-muted transition-colors hover:text-gold-text">How it works</a><a href="#docs" class="rounded-lg px-2.5 py-1.5 text-sm text-muted transition-colors hover:text-gold-text">Docs</a><a class="rounded-lg px-2.5 py-1.5 text-sm text-muted transition-colors hover:text-gold-text" href="/dashboard">Dashboard</a></div><div class="ml-auto flex items-center gap-2.5"><a class="btn-quiet hidden xl:inline-flex" href="/dashboard">Open dashboard</a><a href="#start" class="btn-gold hidden sm:inline-flex">Get started<span class="material-symbols-outlined text-[16px]" aria-hidden="true">arrow_outward</span></a><span class="grid h-9 w-9 place-items-center" aria-hidden="true"></span><button type="button" aria-label="Open navigation menu" aria-expanded="false" class="muted grid h-9 w-9 place-items-center rounded-lg transition-colors hover:bg-bg-soft hover:text-gold-text lg:hidden"><span class="material-symbols-outlined text-[22px]" aria-hidden="true">menu</span></button></div></nav></header><main id="main"><section class="relative overflow-hidden border-b border-line/70"><div aria-hidden="true" class="bg-glow absolute inset-x-0 top-0 h-[620px] opacity-70"></div><div aria-hidden="true" class="grid-wash absolute inset-x-0 top-0 h-[620px] opacity-35"></div><div class="relative mx-auto max-w-6xl px-5 pb-16 pt-16 sm:pb-24 sm:pt-24"><div class="text-center"><div class="reveal "><span class="eyebrow"><span class="eyebrow-dot" aria-hidden="true"></span>Self-hosted AI infrastructure · early preview</span></div><div class="reveal " style="transition-delay:90ms"><h1 class="mx-auto mt-6 max-w-4xl text-[clamp(42px,8vw,76px)] font-extrabold leading-[0.98] tracking-[-0.055em]">One route to <span class="gold-text">every model.</span></h1></div><div class="reveal " style="transition-delay:180ms"><p class="muted mx-auto mt-6 max-w-2xl text-base leading-relaxed sm:text-lg">OmniHilbras is the intelligent gateway between your applications and the model providers you choose. One clean endpoint, smarter routing, fewer surprises.</p></div><div class="reveal " style="transition-delay:270ms"><div class="mt-8 flex flex-wrap items-center justify-center gap-3"><a href="#start" class="btn-gold">Start routing<svg class="h-4 w-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></a><a href="#how-it-works" class="btn-ghost">See how it works</a></div></div><div class="reveal " style="transition-delay:360ms"><div class="muted mt-7 flex flex-wrap items-center justify-center gap-x-5 gap-y-2 font-mono text-[10px] uppercase tracking-[0.12em]"><span class="flex items-center gap-1.5"><svg class="h-3 w-3 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg>Provider agnostic</span><span class="flex items-center gap-1.5"><svg class="h-3 w-3 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg>BYOK by default</span><span class="flex items-center gap-1.5"><svg class="h-3 w-3 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg>Self-hostable</span></div></div></div><div class="reveal mx-auto mt-12 max-w-4xl sm:mt-16" style="transition-delay:450ms"><div class="route-panel overflow-hidden rounded-2xl border border-line"><div class="flex items-center justify-between border-b border-line/80 px-4 py-3 sm:px-5"><div class="flex min-w-0 items-center gap-2.5"><span class="grid h-7 w-7 shrink-0 place-items-center rounded-lg border border-gold/30 bg-gold-soft text-[13px] text-gold-text" aria-hidden="true">◈</span><div class="min-w-0"><p class="truncate font-mono text-[11px] font-medium tracking-wide">omnihilbras / gateway</p><p class="muted mt-0.5 truncate text-[10px]">how a route is chosen</p></div></div><div class="flex shrink-0 items-center gap-2 rounded-full border border-line-strong bg-surface-2 px-2.5 py-1 font-mono text-[10px] text-muted">illustration</div></div><div class="grid gap-5 p-4 sm:p-5 lg:grid-cols-[1fr_0.72fr_1fr] lg:items-center lg:gap-4"><div class="rounded-xl border border-line bg-bg-soft/80 p-4"><div class="mb-4 flex items-center justify-between"><span class="mono-label">incoming request</span></div><div class="space-y-3 font-mono text-[11px] leading-relaxed"><p><span class="code-muted">POST</span> <span class="text-gold-text">/v1/chat/completions</span></p><p><span class="code-muted">model</span> <span class="text-gold-text">auto</span></p><p><span class="code-muted">stream</span> <span class="text-gold-text">true</span></p></div><div class="mt-4 flex items-center gap-2 border-t border-line/70 pt-3 text-[11px] text-muted"><svg class="h-3.5 w-3.5 text-success" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"></path><path d="m9 12 2 2 4-4"></path></svg><span>keys stay on your server</span></div></div><div class="relative hidden min-h-[170px] flex-col items-center justify-center lg:flex" aria-label="Routing path"><div class="absolute left-1/2 top-5 h-[calc(100%-40px)] w-px -translate-x-1/2 bg-line-strong/70"></div><div class="relative z-10 grid h-8 w-8 place-items-center rounded-full border border-gold/40 bg-bg text-gold-text"><svg class="h-4 w-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><circle cx="12" cy="12" r="3" fill="currentColor"></circle></svg></div><div class="route-line absolute left-1/2 top-1/2 h-px w-[78%] -translate-x-1/2"></div><span class="route-dot absolute h-2.5 w-2.5 rounded-full bg-gold" style="left:29%;top:25%;animation-delay:0ms" aria-hidden="true"></span><span class="route-dot absolute h-2.5 w-2.5 rounded-full bg-gold" style="left:50%;top:49%;animation-delay:420ms" aria-hidden="true"></span><span class="route-dot absolute h-2.5 w-2.5 rounded-full bg-gold" style="left:71%;top:73%;animation-delay:840ms" aria-hidden="true"></span><span class="mono-label absolute bottom-2 left-1/2 -translate-x-1/2 whitespace-nowrap">priority order</span></div><div class="rounded-xl border border-line bg-bg-soft/80 p-4" aria-live="polite"><div class="mb-4 flex items-center justify-between"><span class="mono-label">selected route</span><span class="hidden shrink-0 font-mono text-[10px] text-success min-[360px]:inline">200 OK</span></div><div class="flex items-center gap-3"><span class="grid place-items-center font-mono font-bold shrink-0 h-9 w-9 rounded-full text-xs" style="background:#e2bd5222;color:#e2bd52;border:1px solid #e2bd5255" aria-hidden="true">A</span><div class="min-w-0"><p class="truncate text-sm font-semibold">Best available</p><p class="truncate font-mono text-[10px] text-muted">claude-sonnet-4 · gemini-2.5-pro</p></div><svg class="ml-auto h-4 w-4 shrink-0 text-success" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" aria-label="Route healthy"><path d="M20 6 9 17l-5-5"></path></svg></div><div class="mt-4 grid grid-cols-2 gap-2"><div class="rounded-lg border border-line bg-surface px-3 py-2.5"><span class="mono-label block">latency</span><strong class="mt-1 block font-mono text-xs">measured per request</strong></div><div class="rounded-lg border border-line bg-surface px-3 py-2.5"><span class="mono-label block">policy</span><strong class="mt-1 block font-mono text-xs">pinned provider</strong></div></div></div></div><div class="border-t border-line/80 px-4 py-3 sm:px-5"><div class="mb-2 flex items-center justify-between gap-3"><span class="mono-label">choose a policy to preview</span><span class="muted hidden font-mono text-[10px] sm:inline">click a provider</span></div><div class="grid grid-cols-2 gap-2 sm:grid-cols-4"><button type="button" aria-pressed="true" class="flex items-center gap-2 rounded-lg border px-2.5 py-2 text-left transition-colors border-gold/60 bg-gold-soft text-gold-text"><span class="grid place-items-center font-mono font-bold shrink-0 h-5 w-5 rounded-md text-[8px]" style="background:#e2bd5222;color:#e2bd52;border:1px solid #e2bd5255" aria-hidden="true">A</span><span class="min-w-0 truncate text-[11px] font-medium">Auto</span><svg class="ml-auto h-3 w-3 shrink-0" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"></path></svg></button><button type="button" aria-pressed="false" class="flex items-center gap-2 rounded-lg border px-2.5 py-2 text-left transition-colors border-line bg-surface text-muted hover:border-line-strong hover:text-text"><span class="grid place-items-center font-mono font-bold shrink-0 h-5 w-5 rounded-md text-[8px]" style="background:#d9775722;color:#d97757;border:1px solid #d9775755" aria-hidden="true">C</span><span class="min-w-0 truncate text-[11px] font-medium">Anthropic</span></button><button type="button" aria-pressed="false" class="flex items-center gap-2 rounded-lg border px-2.5 py-2 text-left transition-colors border-line bg-surface text-muted hover:border-line-strong hover:text-text"><span class="grid place-items-center font-mono font-bold shrink-0 h-5 w-5 rounded-md text-[8px]" style="background:#6fdb9b22;color:#6fdb9b;border:1px solid #6fdb9b55" aria-hidden="true">O</span><span class="min-w-0 truncate text-[11px] font-medium">OpenAI</span></button><button type="button" aria-pressed="false" class="flex items-center gap-2 rounded-lg border px-2.5 py-2 text-left transition-colors border-line bg-surface text-muted hover:border-line-strong hover:text-text"><span class="grid place-items-center font-mono font-bold shrink-0 h-5 w-5 rounded-md text-[8px]" style="background:#83b7ff22;color:#83b7ff;border:1px solid #83b7ff55" aria-hidden="true">L</span><span class="min-w-0 truncate text-[11px] font-medium">Local</span></button></div></div></div></div></div><div class="hairline"></div></section><section class="overflow-hidden border-b border-line bg-bg-soft/60 py-8" aria-label="Supported providers"><p class="muted text-center text-[10px] font-semibold tracking-[0.18em] uppercase">Bring the providers you already trust</p><div class="relative mt-5 overflow-hidden"><div aria-hidden="true" class="pointer-events-none absolute inset-y-0 left-0 z-10 w-20" style="background-image:linear-gradient(to right, var(--color-bg-alt), transparent)"></div><div aria-hidden="true" class="pointer-events-none absolute inset-y-0 right-0 z-10 w-20" style="background-image:linear-gradient(to left, var(--color-bg-alt), transparent)"></div><div class="marquee flex w-max items-center gap-10 sm:gap-14"><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">O</span>OpenAI</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">A</span>Anthropic</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">G</span>Google</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">M</span>Mistral</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">G</span>Groq</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">O</span>Ollama</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">O</span>OpenRouter</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">D</span>DeepSeek</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">O</span>OpenAI</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">A</span>Anthropic</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">G</span>Google</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">M</span>Mistral</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">G</span>Groq</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">O</span>Ollama</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">O</span>OpenRouter</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">D</span>DeepSeek</span></div></div></section><section id="product" class="mx-auto max-w-6xl px-5 py-16 sm:py-24"><div class="reveal text-center"><span class="eyebrow"><span class="eyebrow-dot" aria-hidden="true"></span>A calmer model layer</span><h2 class="section-title mx-auto mt-5 max-w-2xl">Keep control of the route.</h2><p class="muted mx-auto mt-4 max-w-xl text-sm leading-relaxed sm:text-base">OmniHilbras turns provider choice into an intentional product decision—not a config file written in a hurry.</p></div><div class="mt-10 grid gap-4 md:grid-cols-3"><div class="reveal-card "><article class="card group relative overflow-hidden p-6 h-full"><div class="mb-8 flex items-center justify-between"><span class="grid h-10 w-10 place-items-center rounded-xl border border-gold/25 bg-gold-soft text-gold-text"><svg class="h-5 w-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="16" y="16" width="6" height="6" rx="1"></rect><rect x="2" y="16" width="6" height="6" rx="1"></rect><rect x="9" y="2" width="6" height="6" rx="1"></rect><path d="M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3"></path><path d="M12 12V8"></path></svg></span><span class="mono-label transition-colors group-hover:text-gold-text">Unified surface</span></div><h3 class="text-lg font-semibold tracking-[-0.02em]">One endpoint. Every model.</h3><p class="muted mt-3 text-sm leading-relaxed">Keep your application code stable while providers, models, and regions change underneath it.</p><div class="mt-6 flex items-center gap-2 border-t border-line pt-4 text-[11px] text-muted"><svg class="h-3.5 w-3.5 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg>OpenAI-compatible by default</div><div aria-hidden="true" class="absolute -right-12 -bottom-12 h-32 w-32 rounded-full bg-gold-soft opacity-0 blur-2xl transition-opacity group-hover:opacity-100"></div></article></div><div class="reveal-card " style="transition-delay:90ms"><article class="card group relative overflow-hidden p-6 h-full"><div class="mb-8 flex items-center justify-between"><span class="grid h-10 w-10 place-items-center rounded-xl border border-gold/25 bg-gold-soft text-gold-text"><svg class="h-5 w-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="21" x2="14" y1="4" y2="4"></line><line x1="10" x2="3" y1="4" y2="4"></line><line x1="21" x2="12" y1="12" y2="12"></line><line x1="8" x2="3" y1="12" y2="12"></line><line x1="21" x2="16" y1="20" y2="20"></line><line x1="12" x2="3" y1="20" y2="20"></line><line x1="14" x2="14" y1="2" y2="6"></line><line x1="8" x2="8" y1="10" y2="14"></line><line x1="16" x2="16" y1="18" y2="22"></line></svg></span><span class="mono-label transition-colors group-hover:text-gold-text">Priority routing</span></div><h3 class="text-lg font-semibold tracking-[-0.02em]">You choose the order.</h3><p class="muted mt-3 text-sm leading-relaxed">Set a priority on each connection and the gateway serves them in that order, skipping any that are unhealthy, rate-limited, or missing a credential.</p><div class="mt-6 flex items-center gap-2 border-t border-line pt-4 text-[11px] text-muted"><svg class="h-3.5 w-3.5 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg>Deterministic, with health-aware failover</div><div aria-hidden="true" class="absolute -right-12 -bottom-12 h-32 w-32 rounded-full bg-gold-soft opacity-0 blur-2xl transition-opacity group-hover:opacity-100"></div></article></div><div class="reveal-card " style="transition-delay:180ms"><article class="card group relative overflow-hidden p-6 h-full"><div class="mb-8 flex items-center justify-between"><span class="grid h-10 w-10 place-items-center rounded-xl border border-gold/25 bg-gold-soft text-gold-text"><svg class="h-5 w-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"></path><path d="m9 12 2 2 4-4"></path></svg></span><span class="mono-label transition-colors group-hover:text-gold-text">Resilient by design</span></div><h3 class="text-lg font-semibold tracking-[-0.02em]">Fail over before users notice.</h3><p class="muted mt-3 text-sm leading-relaxed">Health checks, retries, and graceful fallback keep a slow provider from becoming a broken product.</p><div class="mt-6 flex items-center gap-2 border-t border-line pt-4 text-[11px] text-muted"><svg class="h-3.5 w-3.5 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg>Automatic recovery paths</div><div aria-hidden="true" class="absolute -right-12 -bottom-12 h-32 w-32 rounded-full bg-gold-soft opacity-0 blur-2xl transition-opacity group-hover:opacity-100"></div></article></div></div><div class="reveal mt-5"><div class="flex flex-col items-start justify-between gap-4 rounded-2xl border border-gold/25 bg-gold-soft/60 px-5 py-4 sm:flex-row sm:items-center sm:px-6"><div class="flex items-start gap-3"><svg class="mt-0.5 h-4 w-4 shrink-0 text-gold-text" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="16" r="1"></circle><rect x="3" y="10" width="18" height="12" rx="2"></rect><path d="M7 10V7a5 5 0 0 1 10 0v3"></path></svg><div><p class="text-sm font-semibold">Your infrastructure stays yours.</p><p class="muted mt-1 text-xs">Self-host the gateway, keep your keys, and choose exactly where requests run.</p></div></div><a href="#start" class="btn-quiet shrink-0 text-gold-text">See the principles <svg class="h-3.5 w-3.5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></a></div></div></section><section id="how-it-works" class="border-y border-line bg-bg-soft/55"><div class="mx-auto max-w-6xl px-5 py-16 sm:py-24"><div class="reveal mb-10 text-center"><span class="eyebrow">How it works</span><h2 class="section-title mt-5">From provider sprawl to one clear path.</h2><p class="muted mx-auto mt-4 max-w-lg text-sm leading-relaxed">OmniHilbras sits beside your app, not in the way of it. Start small and make the routing policy as expressive as you need.</p></div><div class="grid gap-4 md:grid-cols-3"><div class="reveal-card "><article class="card relative p-6 h-full"><div class="mb-8 flex items-center justify-between"><span class="font-mono text-3xl font-bold text-gold/80">01</span><span class="grid h-9 w-9 place-items-center rounded-full border border-line-strong text-gold-text"><svg class="h-4 w-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="20" height="8" x="2" y="2" rx="2" ry="2"></rect><rect width="20" height="8" x="2" y="14" rx="2" ry="2"></rect><line x1="6" x2="6.01" y1="6" y2="6"></line><line x1="6" x2="6.01" y1="18" y2="18"></line></svg></span></div><h3 class="font-semibold">Connect your providers</h3><p class="muted mt-2.5 text-sm leading-relaxed">Bring API keys for the services you already use, or start with a local Ollama endpoint.</p><div aria-hidden="true" class="absolute -right-3 top-1/2 hidden h-px w-6 bg-gold/45 md:block"></div></article></div><div class="reveal-card " style="transition-delay:90ms"><article class="card relative p-6 h-full"><div class="mb-8 flex items-center justify-between"><span class="font-mono text-3xl font-bold text-gold/80">02</span><span class="grid h-9 w-9 place-items-center rounded-full border border-line-strong text-gold-text"><svg class="h-4 w-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="8" height="8" x="3" y="3" rx="2"></rect><path d="M7 11v4a2 2 0 0 0 2 2h4"></path><rect width="8" height="8" x="13" y="13" rx="2"></rect></svg></span></div><h3 class="font-semibold">Define the policy</h3><p class="muted mt-2.5 text-sm leading-relaxed">Set a priority on each connection. The gateway serves them in order, skipping any that are unhealthy, rate-limited, or missing a credential.</p><div aria-hidden="true" class="absolute -right-3 top-1/2 hidden h-px w-6 bg-gold/45 md:block"></div></article></div><div class="reveal-card " style="transition-delay:180ms"><article class="card relative p-6 h-full"><div class="mb-8 flex items-center justify-between"><span class="font-mono text-3xl font-bold text-gold/80">03</span><span class="grid h-9 w-9 place-items-center rounded-full border border-line-strong text-gold-text"><svg class="h-4 w-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m18 16 4-4-4-4"></path><path d="m6 8-4 4 4 4"></path><path d="m14.5 4-5 16"></path></svg></span></div><h3 class="font-semibold">Ship one clean request</h3><p class="muted mt-2.5 text-sm leading-relaxed">Point your app at OmniHilbras and keep the same interface while the routing layer gets smarter.</p></article></div></div></div></section><section id="docs" class="mx-auto max-w-6xl px-5 py-16 sm:py-24"><div class="grid items-center gap-10 lg:grid-cols-[0.8fr_1.2fr] lg:gap-16"><div class="reveal "><span class="eyebrow">A familiar interface</span><h2 class="section-title mt-5">A better default, not a new abstraction.</h2><p class="muted mt-4 text-sm leading-relaxed sm:text-base">Keep the request shape your team already knows. OmniHilbras handles provider selection behind the endpoint, so your product can focus on the user.</p><ul class="mt-7 space-y-3.5"><li class="flex items-start gap-2.5 text-sm"><svg class="mt-0.5 h-4 w-4 shrink-0 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg><span class="muted">OpenAI-compatible request and response shapes</span></li><li class="flex items-start gap-2.5 text-sm"><svg class="mt-0.5 h-4 w-4 shrink-0 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg><span class="muted">Streaming passthrough for responsive interfaces</span></li><li class="flex items-start gap-2.5 text-sm"><svg class="mt-0.5 h-4 w-4 shrink-0 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg><span class="muted">Per-request overrides when you need control</span></li></ul><a href="#start" class="btn-ghost mt-8"><svg class="h-4 w-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 7v14"></path><path d="M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z"></path></svg>Read the getting started guide</a></div><div class="reveal " style="transition-delay:120ms"><div class="overflow-hidden rounded-2xl border border-line bg-[#0d0c09] shadow-2xl"><div class="flex items-center justify-between border-b border-white/10 px-4 py-3"><div class="flex items-center gap-1.5" aria-hidden="true"><span class="h-2.5 w-2.5 rounded-full bg-[#ff5f57]"></span><span class="h-2.5 w-2.5 rounded-full bg-[#febc2e]"></span><span class="h-2.5 w-2.5 rounded-full bg-[#28c840]"></span></div><div class="flex rounded-lg border border-white/10 bg-white/5 p-0.5" role="tablist" aria-label="Code language"><button type="button" role="tab" aria-selected="true" class="rounded-md px-2.5 py-1 font-mono text-[10px] transition-colors bg-white/10 text-[#f3d789]">cURL</button><button type="button" role="tab" aria-selected="false" class="rounded-md px-2.5 py-1 font-mono text-[10px] transition-colors text-[#8c8575] hover:text-[#e6c768]">TypeScript</button></div><button type="button" aria-label="Copy code" class="grid h-7 w-7 place-items-center rounded-md text-[#8c8575] transition-colors hover:bg-white/10 hover:text-[#f3d789]"><svg class="h-3.5 w-3.5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="14" height="14" x="8" y="8" rx="2"></rect><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"></path></svg></button></div><div class="overflow-x-auto px-4 py-5 sm:px-6"><pre class="min-w-[560px] font-mono text-[11px] leading-[1.85] sm:text-xs"><code><span class="flex"><span class="mr-5 w-5 shrink-0 select-none text-right text-[#8c8575]">01</span><span class="text-[#b5ad9d]">curl http://127.0.0.1:8787/v1/chat/completions \</span></span><span class="flex"><span class="mr-5 w-5 shrink-0 select-none text-right text-[#8c8575]">02</span><span class="text-[#83b7ff]"> -H "Authorization: Bearer $OMNIHILBRAS_KEY" \</span></span><span class="flex"><span class="mr-5 w-5 shrink-0 select-none text-right text-[#8c8575]">03</span><span class="text-[#b5ad9d]"> -H "Content-Type: application/json" \</span></span><span class="flex"><span class="mr-5 w-5 shrink-0 select-none text-right text-[#8c8575]">04</span><span class="text-[#b5ad9d]"> -d '{</span></span><span class="flex"><span class="mr-5 w-5 shrink-0 select-none text-right text-[#8c8575]">05</span><span class="text-[#83b7ff]"> "model": "auto",</span></span><span class="flex"><span class="mr-5 w-5 shrink-0 select-none text-right text-[#8c8575]">06</span><span class="text-[#b5ad9d]"> "messages": [{ "role": "user", "content": "Hello" }]</span></span><span class="flex"><span class="mr-5 w-5 shrink-0 select-none text-right text-[#8c8575]">07</span><span class="text-[#b5ad9d]"> }'</span></span></code></pre></div><div class="flex items-center justify-between border-t border-white/10 px-4 py-3 font-mono text-[10px] text-[#8c8575] sm:px-6"><span>omnihilbras-client.ts</span><span class="flex items-center gap-1.5 text-[#7fd88f]"><span class="h-1.5 w-1.5 rounded-full bg-[#7fd88f]"></span>ready to route</span></div></div></div></div></section><section id="observability" class="border-y border-line bg-bg-soft/55"><div class="mx-auto grid max-w-6xl items-center gap-10 px-5 py-16 sm:py-24 lg:grid-cols-[0.78fr_1.22fr] lg:gap-16"><div class="reveal "><span class="eyebrow">No black box</span><h2 class="section-title mt-5">See the decision, not just the answer.</h2><p class="muted mt-4 text-sm leading-relaxed sm:text-base">Every response says which provider served it, under which request id, and what was tried before it. When a request fails, the reason is named rather than swallowed — and when a provider is skipped, the skip has a reason too. OmniHilbras makes routing observable by default.</p><div class="mt-7 space-y-4"><div class="flex gap-3"><svg class="mt-0.5 h-4 w-4 shrink-0 text-gold-text" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 10a2 2 0 0 0-2 2c0 1.02-.1 2.51-.26 4"></path><path d="M14 13.12c0 2.38 0 6.38-1 8.88"></path><path d="M17.29 21.02c.12-.6.43-2.3.5-3.02"></path><path d="M2 12a10 10 0 0 1 18-6"></path><path d="M2 16h.01"></path><path d="M21.8 16c.2-2 .131-5.354 0-6"></path><path d="M5 19.5C5.5 18 6 15 6 12a6 6 0 0 1 .34-2"></path><path d="M8.65 22c.21-.66.45-1.32.57-2"></path><path d="M9 6.8a6 6 0 0 1 9 5.2v2"></path></svg><div><p class="text-sm font-semibold">A request id on every response</p><p class="muted mt-1 text-xs leading-relaxed">Every reply carries gateway.requestId, and the providers that were tried before it.</p></div></div><div class="flex gap-3"><svg class="mt-0.5 h-4 w-4 shrink-0 text-gold-text" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2"></path></svg><div><p class="text-sm font-semibold">Named reasons, never generic errors</p><p class="muted mt-1 text-xs leading-relaxed">A skip is one of unhealthy, rate-limited, no-credential, no-models or disabled — not a silent fallback.</p></div></div><div class="flex gap-3"><svg class="mt-0.5 h-4 w-4 shrink-0 text-gold-text" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m12 14 4-4"></path><path d="M3.34 19a10 10 0 1 1 17.32 0"></path></svg><div><p class="text-sm font-semibold">Health that changes routing</p><p class="muted mt-1 text-xs leading-relaxed">Connections are polled; consecutive failures mark one unhealthy and routing stops choosing it, recording why.</p></div></div></div></div></div></section><section id="start" class="mx-auto max-w-6xl px-5 py-16 sm:py-24"><div class="reveal "><div class="card relative overflow-hidden px-6 py-12 text-center sm:px-10 sm:py-16"><div aria-hidden="true" class="pointer-events-none absolute inset-x-0 -top-32 h-64 opacity-60 blur-3xl" style="background:radial-gradient(ellipse, var(--glow), transparent 70%)"></div><div class="relative"><span class="eyebrow">The first release is taking shape</span><h2 class="section-title mx-auto mt-5 max-w-2xl">Keep your options <span class="gold-text">open.</span></h2><p class="muted mx-auto mt-4 max-w-lg text-sm leading-relaxed sm:text-base">OmniHilbras is being built for teams that want more leverage from every model without giving up control of the stack.</p><div class="mt-8 flex flex-wrap items-center justify-center gap-3"><a class="btn-gold" href="/dashboard">Open the dashboard<svg class="h-4 w-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7"></path><path d="M7 7h10v10"></path></svg></a><a href="#how-it-works" class="btn-ghost">See how it works</a></div><div class="muted mt-7 flex flex-wrap items-center justify-center gap-x-5 gap-y-2 font-mono text-[10px]"><span class="flex items-center gap-1.5"><svg class="h-3 w-3 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z"></path></svg>Early preview</span><span class="flex items-center gap-1.5"><svg class="h-3 w-3 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="16" r="1"></circle><rect x="3" y="10" width="18" height="12" rx="2"></rect><path d="M7 10V7a5 5 0 0 1 10 0v3"></path></svg>Local-first</span><span class="flex items-center gap-1.5"><svg class="h-3 w-3 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 3H7a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5c0 1.1.9 2 2 2h1"></path><path d="M16 21h1a2 2 0 0 0 2-2v-5c0-1.1.9-2 2-2a2 2 0 0 1-2-2V5a2 2 0 0 0-2-2h-1"></path></svg>Developer-friendly</span></div></div></div></div></section></main><footer class="relative border-t border-line"><div class="mx-auto grid max-w-6xl gap-10 px-5 py-12 sm:grid-cols-2 lg:grid-cols-4"><div class="max-w-xs"><a class="flex items-center gap-2.5 text-[15px] font-semibold tracking-tight" href="/"><span class="text-xl leading-none text-gold" aria-hidden="true">◈</span><span>Omni<span class="muted font-normal">Hilbras</span></span></a><p class="muted mt-3 text-[13px] leading-relaxed">One intelligent route between your applications and every model provider.</p><a href="#start" class="btn-gold mt-5 !px-3.5 !py-2 !text-[13px]">Start building</a></div><div><h2 class="mono-label">Explore</h2><ul class="mt-4 space-y-2.5 text-sm"><li><a href="#product" class="footer-link">Product</a></li><li><a href="#how-it-works" class="footer-link">How it works</a></li><li><a href="#docs" class="footer-link">Documentation</a></li><li><a class="footer-link" href="/dashboard">Dashboard</a></li></ul></div><div><h2 class="mono-label">Build</h2><ul class="mt-4 space-y-2.5 text-sm"><li><a href="#start" class="footer-link">Get started</a></li><li><a href="#docs" class="footer-link">API reference</a></li><li><a href="#observability" class="footer-link">Observability</a></li></ul></div><div><h2 class="mono-label">Built for</h2><p class="muted mt-4 max-w-[190px] text-sm leading-relaxed">Developers who want choice without operational chaos.</p><div class="mt-4 flex items-center gap-2 text-gold-text"><span class="h-1.5 w-1.5 rounded-full bg-gold" aria-hidden="true"></span><span class="font-mono text-[11px]">Local-first · BYOK</span></div></div></div><div class="border-t border-line"><div class="mx-auto flex max-w-6xl flex-col items-center justify-between gap-2 px-5 py-5 text-xs sm:flex-row"><span class="muted">© 2026 OmniHilbras — a Hilbras product</span><span class="muted font-mono">One route. Every model.</span></div></div></footer></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-13acc920e6f6a68b.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:\"static/chunks/8500-63a4afbeacab3b52.js\"\n3:\"static/chunks/246-0bbd2c1424911b5c.js\"\n4:\"static/chunks/85-614327c9c3f40a7d.js\"\n5:\"static/chunks/705-f07c546a169bc3d2.js\"\n6:\"static/chunks/5497-dea83eee58687b78.js\"\n7:\"static/chunks/app/(dashboard)/layout-20e79861e79ed846.js\"\n8:I[21110,[\"8500\",\"$2\",\"246\",\"$3\",\"85\",\"$4\",\"705\",\"$5\",\"5497\",\"$6\",\"9305\",\"$7\"],\"ThemeProvider\"]\n9:\"static/chunks/505-d36ae6201af05bc2.js\"\na:\"static/chunks/app/layout-9a382aa3bca368d1.js\"\nb:\"RuntimeI18nProvider\"\nc:I[94635,[\"505\",\"$9\",\"85\",\"$4\",\"7177\",\"$a\"],\"$b\"]\nd:I[57121,[],\"\"]\ne:I[74581,[],\"\"]\nf:I[30565,[\"505\",\"$9\",\"85\",\"$4\",\"7177\",\"$a\"],\"GoogleAnalytics\"]\n13:I[61304,[],\"ClientPageRoot\"]\n14:\"static/chunks/app/landing/page-0a57d1766f9a201d.js\"\n15:I[72893,[\"8500\",\"$2\",\"7018\",\"$14\"],\"default\"]\n18:I[90484,[],\"OutletBoundary\"]\n19:\"$Sreact.suspense\"\n1b:\"ViewportBoundary\"\n1c:I[90484,[],\"$1b\"]\n1e:\"MetadataBoundary\"\n1f:I[90484,[],\"$1e\"]\n21:I[27123,[],\"default\",1]\n:HL[\"/_next/static/media/acc1c922d613a50a.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/dbccb4a9e22cbf0d-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/4b6560d3a7ee35a9.css\",\"style\"]\n:HL[\"/_next/static/css/cf553f425046a901.css\",\"style\"]\n11:X\n12:[[\"children\",{\"s\":\"__PAGE__\",\"h\":512,\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L13\",null,{\"Component\":\"$15\",\"serverProvidedParams\":{\"searchParams\":{},\"params\":{},\"promises\":[\"$@16\",\"$@17\"]}}],null,[\"$\",\"$L18\",null,{\"children\":[\"$\",\"$19\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@1a\"}]}]]}],\"p\":false,\"v\":null}}]]\n10:[[\"children\",{\"s\":\"landing\",\"h\":512,\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$Ld\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$Le\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],\"p\":false,\"v\":\"$11\"},\"c\":\"$Q12\"}]]\n0:{\"P\":null,\"c\":[\"\",\"landing\"],\"q\":\"\",\"i\":false,\"t\":{\"t\":{\"s\":\"\",\"h\":528,\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/4b6560d3a7ee35a9.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/cf553f425046a901.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var s=localStorage.getItem('theme');var t=s?(JSON.parse(s).state||{}).theme:'system';t=t||'system';var m=window.matchMedia('(prefers-color-scheme: dark)').matches;if(t==='dark'||(t==='system'\u0026\u0026m)){document.documentElement.classList.add('dark')}}catch(e){}})();\"}}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"var d=document,r=d.documentElement,f=function(){r.classList.add('fonts-loaded')};if(d.fonts\u0026\u0026d.fonts.load){d.fonts.load('24px \\\"Material Symbols Outlined\\\"').then(f).catch(f);setTimeout(f,3000)}else{f()}\"}}]]}],[\"$\",\"body\",null,{\"className\":\"__variable_4cefcd __variable_ad0237 font-sans antialiased\",\"children\":[[\"$\",\"$L8\",null,{\"children\":[\"$\",\"$Lc\",null,{\"children\":[\"$\",\"$Ld\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$Le\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}],[\"$\",\"$Lf\",null,{\"gaId\":\"G-LC959F603F\"}]]}]]}]]}],\"p\":false,\"v\":null},\"c\":\"$Q10\"},\"h\":{\"r\":[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L1c\",null,{\"children\":\"$L1d\"}],[\"$\",\"$L1f\",null,{\"children\":[[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$19\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L20\"}]}],null]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],\"p\":false,\"v\":null}},\"m\":\"$undefined\",\"G\":[\"$21\",[]],\"S\":true,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"fAJh8_GCT173XCQuAE5si\"}\n11:C\n16:{}\n17:\"$12:0:1:d:r:props:children:0:props:serverProvidedParams:params\"\n1d:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#0c0b09\"}]]\n22:I[86869,[],\"IconMark\"]\n1a:null\n20:[[\"$\",\"title\",\"0\",{\"children\":\"OmniHilbras — One route to every model\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"OmniHilbras is the intelligent routing layer between your applications and every AI provider. A self-hostable AI gateway for intelligent routing, automatic fallback, and one clean API.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"manifest\",\"href\":\"/manifest.webmanifest\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"meta\",\"3\",{\"property\":\"og:title\",\"content\":\"OmniHilbras — One route to every model\"}],[\"$\",\"meta\",\"4\",{\"property\":\"og:description\",\"content\":\"A self-hostable AI gateway for intelligent routing, automatic fallback, and one clean API.\"}],[\"$\",\"meta\",\"5\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"6\",{\"name\":\"twitter:card\",\"content\":\"summary\"}],[\"$\",\"meta\",\"7\",{\"name\":\"twitter:title\",\"content\":\"OmniHilbras — One route to every model\"}],[\"$\",\"meta\",\"8\",{\"name\":\"twitter:description\",\"content\":\"A self-hostable AI gateway for intelligent routing, automatic fallback, and one clean API.\"}],[\"$\",\"link\",\"9\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?603d046c9a6fdfbb\",\"type\":\"image/x-icon\",\"sizes\":\"16x16\"}],[\"$\",\"link\",\"10\",{\"rel\":\"icon\",\"href\":\"/favicon.svg\"}],[\"$\",\"$L22\",\"11\",{}]]\n"])</script></body></html>
|
|
1
|
+
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" href="/_next/static/media/acc1c922d613a50a.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="preload" href="/_next/static/media/dbccb4a9e22cbf0d-s.p.woff2" as="font" crossorigin="" type="font/woff2"/><link rel="stylesheet" href="/_next/static/css/4b6560d3a7ee35a9.css" data-precedence="next"/><link rel="stylesheet" href="/_next/static/css/c478309e956d6de4.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-bdd19f62aea907f6.js"/><script src="/_next/static/chunks/4bd1b696-8cd12253b448cc13.js" async=""></script><script src="/_next/static/chunks/3794-04350b0fcecd82e5.js" async=""></script><script src="/_next/static/chunks/main-app-71b3088720a13691.js" async=""></script><script src="/_next/static/chunks/8500-63a4afbeacab3b52.js" async=""></script><script src="/_next/static/chunks/246-0bbd2c1424911b5c.js" async=""></script><script src="/_next/static/chunks/85-abdd4f18753cba17.js" async=""></script><script src="/_next/static/chunks/705-f07c546a169bc3d2.js" async=""></script><script src="/_next/static/chunks/5497-dea83eee58687b78.js" async=""></script><script src="/_next/static/chunks/app/(dashboard)/layout-20e79861e79ed846.js" async=""></script><script src="/_next/static/chunks/505-d36ae6201af05bc2.js" async=""></script><script src="/_next/static/chunks/app/layout-9a382aa3bca368d1.js" async=""></script><script src="/_next/static/chunks/app/landing/page-0a57d1766f9a201d.js" async=""></script><link rel="preload" href="https://www.googletagmanager.com/gtag/js?id=G-LC959F603F" as="script"/><meta name="theme-color" content="#0c0b09"/><title>OmniHilbras — One route to every model</title><meta name="description" content="OmniHilbras is the intelligent routing layer between your applications and every AI provider. A self-hostable AI gateway for intelligent routing, automatic fallback, and one clean API."/><link rel="manifest" href="/manifest.webmanifest"/><meta property="og:title" content="OmniHilbras — One route to every model"/><meta property="og:description" content="A self-hostable AI gateway for intelligent routing, automatic fallback, and one clean API."/><meta property="og:type" content="website"/><meta name="twitter:card" content="summary"/><meta name="twitter:title" content="OmniHilbras — One route to every model"/><meta name="twitter:description" content="A self-hostable AI gateway for intelligent routing, automatic fallback, and one clean API."/><link rel="icon" href="/favicon.ico?603d046c9a6fdfbb" type="image/x-icon" sizes="16x16"/><link rel="icon" href="/favicon.svg"/><meta name="next-size-adjust" content=""/><script>(function(){try{var s=localStorage.getItem('theme');var t=s?(JSON.parse(s).state||{}).theme:'system';t=t||'system';var m=window.matchMedia('(prefers-color-scheme: dark)').matches;if(t==='dark'||(t==='system'&&m)){document.documentElement.classList.add('dark')}}catch(e){}})();</script><script>var d=document,r=d.documentElement,f=function(){r.classList.add('fonts-loaded')};if(d.fonts&&d.fonts.load){d.fonts.load('24px "Material Symbols Outlined"').then(f).catch(f);setTimeout(f,3000)}else{f()}</script><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="__variable_4cefcd __variable_ad0237 font-sans antialiased"><div hidden=""><!--$--><!--/$--></div><div class="page-enter min-h-screen overflow-x-clip bg-bg text-text"><canvas class="particle-canvas" aria-hidden="true"></canvas><header class="nav-blur sticky top-0 z-50"><nav class="relative mx-auto flex h-16 max-w-6xl items-center gap-6 px-5" aria-label="Main navigation"><a href="#main" class="skip-link btn-gold">Skip to content</a><a class="flex shrink-0 items-center gap-2.5 text-[15px] font-semibold tracking-tight" href="/"><span class="text-xl leading-none text-gold" aria-hidden="true">◈</span><span>Omni<span class="muted font-normal">Hilbras</span></span></a><div class="absolute top-1/2 left-1/2 hidden -translate-x-1/2 -translate-y-1/2 items-center gap-1 whitespace-nowrap lg:flex"><a href="#product" class="rounded-lg px-2.5 py-1.5 text-sm text-muted transition-colors hover:text-gold-text">Product</a><a href="#how-it-works" class="rounded-lg px-2.5 py-1.5 text-sm text-muted transition-colors hover:text-gold-text">How it works</a><a href="#docs" class="rounded-lg px-2.5 py-1.5 text-sm text-muted transition-colors hover:text-gold-text">Docs</a><a class="rounded-lg px-2.5 py-1.5 text-sm text-muted transition-colors hover:text-gold-text" href="/dashboard">Dashboard</a></div><div class="ml-auto flex items-center gap-2.5"><a class="btn-quiet hidden xl:inline-flex" href="/dashboard">Open dashboard</a><a href="#start" class="btn-gold hidden sm:inline-flex">Get started<span class="material-symbols-outlined text-[16px]" aria-hidden="true">arrow_outward</span></a><span class="grid h-9 w-9 place-items-center" aria-hidden="true"></span><button type="button" aria-label="Open navigation menu" aria-expanded="false" class="muted grid h-9 w-9 place-items-center rounded-lg transition-colors hover:bg-bg-soft hover:text-gold-text lg:hidden"><span class="material-symbols-outlined text-[22px]" aria-hidden="true">menu</span></button></div></nav></header><main id="main"><section class="relative overflow-hidden border-b border-line/70"><div aria-hidden="true" class="bg-glow absolute inset-x-0 top-0 h-[620px] opacity-70"></div><div aria-hidden="true" class="grid-wash absolute inset-x-0 top-0 h-[620px] opacity-35"></div><div class="relative mx-auto max-w-6xl px-5 pb-16 pt-16 sm:pb-24 sm:pt-24"><div class="text-center"><div class="reveal "><span class="eyebrow"><span class="eyebrow-dot" aria-hidden="true"></span>Self-hosted AI infrastructure · early preview</span></div><div class="reveal " style="transition-delay:90ms"><h1 class="mx-auto mt-6 max-w-4xl text-[clamp(42px,8vw,76px)] font-extrabold leading-[0.98] tracking-[-0.055em]">One route to <span class="gold-text">every model.</span></h1></div><div class="reveal " style="transition-delay:180ms"><p class="muted mx-auto mt-6 max-w-2xl text-base leading-relaxed sm:text-lg">OmniHilbras is the intelligent gateway between your applications and the model providers you choose. One clean endpoint, smarter routing, fewer surprises.</p></div><div class="reveal " style="transition-delay:270ms"><div class="mt-8 flex flex-wrap items-center justify-center gap-3"><a href="#start" class="btn-gold">Start routing<svg class="h-4 w-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></a><a href="#how-it-works" class="btn-ghost">See how it works</a></div></div><div class="reveal " style="transition-delay:360ms"><div class="muted mt-7 flex flex-wrap items-center justify-center gap-x-5 gap-y-2 font-mono text-[10px] uppercase tracking-[0.12em]"><span class="flex items-center gap-1.5"><svg class="h-3 w-3 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg>Provider agnostic</span><span class="flex items-center gap-1.5"><svg class="h-3 w-3 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg>BYOK by default</span><span class="flex items-center gap-1.5"><svg class="h-3 w-3 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg>Self-hostable</span></div></div></div><div class="reveal mx-auto mt-12 max-w-4xl sm:mt-16" style="transition-delay:450ms"><div class="route-panel overflow-hidden rounded-2xl border border-line"><div class="flex items-center justify-between border-b border-line/80 px-4 py-3 sm:px-5"><div class="flex min-w-0 items-center gap-2.5"><span class="grid h-7 w-7 shrink-0 place-items-center rounded-lg border border-gold/30 bg-gold-soft text-[13px] text-gold-text" aria-hidden="true">◈</span><div class="min-w-0"><p class="truncate font-mono text-[11px] font-medium tracking-wide">omnihilbras / gateway</p><p class="muted mt-0.5 truncate text-[10px]">how a route is chosen</p></div></div><div class="flex shrink-0 items-center gap-2 rounded-full border border-line-strong bg-surface-2 px-2.5 py-1 font-mono text-[10px] text-muted">illustration</div></div><div class="grid gap-5 p-4 sm:p-5 lg:grid-cols-[1fr_0.72fr_1fr] lg:items-center lg:gap-4"><div class="rounded-xl border border-line bg-bg-soft/80 p-4"><div class="mb-4 flex items-center justify-between"><span class="mono-label">incoming request</span></div><div class="space-y-3 font-mono text-[11px] leading-relaxed"><p><span class="code-muted">POST</span> <span class="text-gold-text">/v1/chat/completions</span></p><p><span class="code-muted">model</span> <span class="text-gold-text">auto</span></p><p><span class="code-muted">stream</span> <span class="text-gold-text">true</span></p></div><div class="mt-4 flex items-center gap-2 border-t border-line/70 pt-3 text-[11px] text-muted"><svg class="h-3.5 w-3.5 text-success" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"></path><path d="m9 12 2 2 4-4"></path></svg><span>keys stay on your server</span></div></div><div class="relative hidden min-h-[170px] flex-col items-center justify-center lg:flex" aria-label="Routing path"><div class="absolute left-1/2 top-5 h-[calc(100%-40px)] w-px -translate-x-1/2 bg-line-strong/70"></div><div class="relative z-10 grid h-8 w-8 place-items-center rounded-full border border-gold/40 bg-bg text-gold-text"><svg class="h-4 w-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><circle cx="12" cy="12" r="3" fill="currentColor"></circle></svg></div><div class="route-line absolute left-1/2 top-1/2 h-px w-[78%] -translate-x-1/2"></div><span class="route-dot absolute h-2.5 w-2.5 rounded-full bg-gold" style="left:29%;top:25%;animation-delay:0ms" aria-hidden="true"></span><span class="route-dot absolute h-2.5 w-2.5 rounded-full bg-gold" style="left:50%;top:49%;animation-delay:420ms" aria-hidden="true"></span><span class="route-dot absolute h-2.5 w-2.5 rounded-full bg-gold" style="left:71%;top:73%;animation-delay:840ms" aria-hidden="true"></span><span class="mono-label absolute bottom-2 left-1/2 -translate-x-1/2 whitespace-nowrap">priority order</span></div><div class="rounded-xl border border-line bg-bg-soft/80 p-4" aria-live="polite"><div class="mb-4 flex items-center justify-between"><span class="mono-label">selected route</span><span class="hidden shrink-0 font-mono text-[10px] text-success min-[360px]:inline">200 OK</span></div><div class="flex items-center gap-3"><span class="grid place-items-center font-mono font-bold shrink-0 h-9 w-9 rounded-full text-xs" style="background:#e2bd5222;color:#e2bd52;border:1px solid #e2bd5255" aria-hidden="true">A</span><div class="min-w-0"><p class="truncate text-sm font-semibold">Best available</p><p class="truncate font-mono text-[10px] text-muted">claude-sonnet-4 · gemini-2.5-pro</p></div><svg class="ml-auto h-4 w-4 shrink-0 text-success" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" aria-label="Route healthy"><path d="M20 6 9 17l-5-5"></path></svg></div><div class="mt-4 grid grid-cols-2 gap-2"><div class="rounded-lg border border-line bg-surface px-3 py-2.5"><span class="mono-label block">latency</span><strong class="mt-1 block font-mono text-xs">measured per request</strong></div><div class="rounded-lg border border-line bg-surface px-3 py-2.5"><span class="mono-label block">policy</span><strong class="mt-1 block font-mono text-xs">pinned provider</strong></div></div></div></div><div class="border-t border-line/80 px-4 py-3 sm:px-5"><div class="mb-2 flex items-center justify-between gap-3"><span class="mono-label">choose a policy to preview</span><span class="muted hidden font-mono text-[10px] sm:inline">click a provider</span></div><div class="grid grid-cols-2 gap-2 sm:grid-cols-4"><button type="button" aria-pressed="true" class="flex items-center gap-2 rounded-lg border px-2.5 py-2 text-left transition-colors border-gold/60 bg-gold-soft text-gold-text"><span class="grid place-items-center font-mono font-bold shrink-0 h-5 w-5 rounded-md text-[8px]" style="background:#e2bd5222;color:#e2bd52;border:1px solid #e2bd5255" aria-hidden="true">A</span><span class="min-w-0 truncate text-[11px] font-medium">Auto</span><svg class="ml-auto h-3 w-3 shrink-0" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m9 18 6-6-6-6"></path></svg></button><button type="button" aria-pressed="false" class="flex items-center gap-2 rounded-lg border px-2.5 py-2 text-left transition-colors border-line bg-surface text-muted hover:border-line-strong hover:text-text"><span class="grid place-items-center font-mono font-bold shrink-0 h-5 w-5 rounded-md text-[8px]" style="background:#d9775722;color:#d97757;border:1px solid #d9775755" aria-hidden="true">C</span><span class="min-w-0 truncate text-[11px] font-medium">Anthropic</span></button><button type="button" aria-pressed="false" class="flex items-center gap-2 rounded-lg border px-2.5 py-2 text-left transition-colors border-line bg-surface text-muted hover:border-line-strong hover:text-text"><span class="grid place-items-center font-mono font-bold shrink-0 h-5 w-5 rounded-md text-[8px]" style="background:#6fdb9b22;color:#6fdb9b;border:1px solid #6fdb9b55" aria-hidden="true">O</span><span class="min-w-0 truncate text-[11px] font-medium">OpenAI</span></button><button type="button" aria-pressed="false" class="flex items-center gap-2 rounded-lg border px-2.5 py-2 text-left transition-colors border-line bg-surface text-muted hover:border-line-strong hover:text-text"><span class="grid place-items-center font-mono font-bold shrink-0 h-5 w-5 rounded-md text-[8px]" style="background:#83b7ff22;color:#83b7ff;border:1px solid #83b7ff55" aria-hidden="true">L</span><span class="min-w-0 truncate text-[11px] font-medium">Local</span></button></div></div></div></div></div><div class="hairline"></div></section><section class="overflow-hidden border-b border-line bg-bg-soft/60 py-8" aria-label="Supported providers"><p class="muted text-center text-[10px] font-semibold tracking-[0.18em] uppercase">Bring the providers you already trust</p><div class="relative mt-5 overflow-hidden"><div aria-hidden="true" class="pointer-events-none absolute inset-y-0 left-0 z-10 w-20" style="background-image:linear-gradient(to right, var(--color-bg-alt), transparent)"></div><div aria-hidden="true" class="pointer-events-none absolute inset-y-0 right-0 z-10 w-20" style="background-image:linear-gradient(to left, var(--color-bg-alt), transparent)"></div><div class="marquee flex w-max items-center gap-10 sm:gap-14"><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">O</span>OpenAI</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">A</span>Anthropic</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">G</span>Google</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">M</span>Mistral</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">G</span>Groq</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">O</span>Ollama</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">O</span>OpenRouter</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">D</span>DeepSeek</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">O</span>OpenAI</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">A</span>Anthropic</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">G</span>Google</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">M</span>Mistral</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">G</span>Groq</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">O</span>Ollama</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">O</span>OpenRouter</span><span class="muted flex items-center gap-2 text-sm font-semibold"><span class="grid h-5 w-5 place-items-center rounded-md border border-line-strong bg-surface font-mono text-[9px] text-gold-text">D</span>DeepSeek</span></div></div></section><section id="product" class="mx-auto max-w-6xl px-5 py-16 sm:py-24"><div class="reveal text-center"><span class="eyebrow"><span class="eyebrow-dot" aria-hidden="true"></span>A calmer model layer</span><h2 class="section-title mx-auto mt-5 max-w-2xl">Keep control of the route.</h2><p class="muted mx-auto mt-4 max-w-xl text-sm leading-relaxed sm:text-base">OmniHilbras turns provider choice into an intentional product decision—not a config file written in a hurry.</p></div><div class="mt-10 grid gap-4 md:grid-cols-3"><div class="reveal-card "><article class="card group relative overflow-hidden p-6 h-full"><div class="mb-8 flex items-center justify-between"><span class="grid h-10 w-10 place-items-center rounded-xl border border-gold/25 bg-gold-soft text-gold-text"><svg class="h-5 w-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="16" y="16" width="6" height="6" rx="1"></rect><rect x="2" y="16" width="6" height="6" rx="1"></rect><rect x="9" y="2" width="6" height="6" rx="1"></rect><path d="M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3"></path><path d="M12 12V8"></path></svg></span><span class="mono-label transition-colors group-hover:text-gold-text">Unified surface</span></div><h3 class="text-lg font-semibold tracking-[-0.02em]">One endpoint. Every model.</h3><p class="muted mt-3 text-sm leading-relaxed">Keep your application code stable while providers, models, and regions change underneath it.</p><div class="mt-6 flex items-center gap-2 border-t border-line pt-4 text-[11px] text-muted"><svg class="h-3.5 w-3.5 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg>OpenAI-compatible by default</div><div aria-hidden="true" class="absolute -right-12 -bottom-12 h-32 w-32 rounded-full bg-gold-soft opacity-0 blur-2xl transition-opacity group-hover:opacity-100"></div></article></div><div class="reveal-card " style="transition-delay:90ms"><article class="card group relative overflow-hidden p-6 h-full"><div class="mb-8 flex items-center justify-between"><span class="grid h-10 w-10 place-items-center rounded-xl border border-gold/25 bg-gold-soft text-gold-text"><svg class="h-5 w-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><line x1="21" x2="14" y1="4" y2="4"></line><line x1="10" x2="3" y1="4" y2="4"></line><line x1="21" x2="12" y1="12" y2="12"></line><line x1="8" x2="3" y1="12" y2="12"></line><line x1="21" x2="16" y1="20" y2="20"></line><line x1="12" x2="3" y1="20" y2="20"></line><line x1="14" x2="14" y1="2" y2="6"></line><line x1="8" x2="8" y1="10" y2="14"></line><line x1="16" x2="16" y1="18" y2="22"></line></svg></span><span class="mono-label transition-colors group-hover:text-gold-text">Priority routing</span></div><h3 class="text-lg font-semibold tracking-[-0.02em]">You choose the order.</h3><p class="muted mt-3 text-sm leading-relaxed">Set a priority on each connection and the gateway serves them in that order, skipping any that are unhealthy, rate-limited, or missing a credential.</p><div class="mt-6 flex items-center gap-2 border-t border-line pt-4 text-[11px] text-muted"><svg class="h-3.5 w-3.5 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg>Deterministic, with health-aware failover</div><div aria-hidden="true" class="absolute -right-12 -bottom-12 h-32 w-32 rounded-full bg-gold-soft opacity-0 blur-2xl transition-opacity group-hover:opacity-100"></div></article></div><div class="reveal-card " style="transition-delay:180ms"><article class="card group relative overflow-hidden p-6 h-full"><div class="mb-8 flex items-center justify-between"><span class="grid h-10 w-10 place-items-center rounded-xl border border-gold/25 bg-gold-soft text-gold-text"><svg class="h-5 w-5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z"></path><path d="m9 12 2 2 4-4"></path></svg></span><span class="mono-label transition-colors group-hover:text-gold-text">Resilient by design</span></div><h3 class="text-lg font-semibold tracking-[-0.02em]">Fail over before users notice.</h3><p class="muted mt-3 text-sm leading-relaxed">Health checks, retries, and graceful fallback keep a slow provider from becoming a broken product.</p><div class="mt-6 flex items-center gap-2 border-t border-line pt-4 text-[11px] text-muted"><svg class="h-3.5 w-3.5 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg>Automatic recovery paths</div><div aria-hidden="true" class="absolute -right-12 -bottom-12 h-32 w-32 rounded-full bg-gold-soft opacity-0 blur-2xl transition-opacity group-hover:opacity-100"></div></article></div></div><div class="reveal mt-5"><div class="flex flex-col items-start justify-between gap-4 rounded-2xl border border-gold/25 bg-gold-soft/60 px-5 py-4 sm:flex-row sm:items-center sm:px-6"><div class="flex items-start gap-3"><svg class="mt-0.5 h-4 w-4 shrink-0 text-gold-text" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="16" r="1"></circle><rect x="3" y="10" width="18" height="12" rx="2"></rect><path d="M7 10V7a5 5 0 0 1 10 0v3"></path></svg><div><p class="text-sm font-semibold">Your infrastructure stays yours.</p><p class="muted mt-1 text-xs">Self-host the gateway, keep your keys, and choose exactly where requests run.</p></div></div><a href="#start" class="btn-quiet shrink-0 text-gold-text">See the principles <svg class="h-3.5 w-3.5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12h14"></path><path d="m12 5 7 7-7 7"></path></svg></a></div></div></section><section id="how-it-works" class="border-y border-line bg-bg-soft/55"><div class="mx-auto max-w-6xl px-5 py-16 sm:py-24"><div class="reveal mb-10 text-center"><span class="eyebrow">How it works</span><h2 class="section-title mt-5">From provider sprawl to one clear path.</h2><p class="muted mx-auto mt-4 max-w-lg text-sm leading-relaxed">OmniHilbras sits beside your app, not in the way of it. Start small and make the routing policy as expressive as you need.</p></div><div class="grid gap-4 md:grid-cols-3"><div class="reveal-card "><article class="card relative p-6 h-full"><div class="mb-8 flex items-center justify-between"><span class="font-mono text-3xl font-bold text-gold/80">01</span><span class="grid h-9 w-9 place-items-center rounded-full border border-line-strong text-gold-text"><svg class="h-4 w-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="20" height="8" x="2" y="2" rx="2" ry="2"></rect><rect width="20" height="8" x="2" y="14" rx="2" ry="2"></rect><line x1="6" x2="6.01" y1="6" y2="6"></line><line x1="6" x2="6.01" y1="18" y2="18"></line></svg></span></div><h3 class="font-semibold">Connect your providers</h3><p class="muted mt-2.5 text-sm leading-relaxed">Bring API keys for the services you already use, or start with a local Ollama endpoint.</p><div aria-hidden="true" class="absolute -right-3 top-1/2 hidden h-px w-6 bg-gold/45 md:block"></div></article></div><div class="reveal-card " style="transition-delay:90ms"><article class="card relative p-6 h-full"><div class="mb-8 flex items-center justify-between"><span class="font-mono text-3xl font-bold text-gold/80">02</span><span class="grid h-9 w-9 place-items-center rounded-full border border-line-strong text-gold-text"><svg class="h-4 w-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="8" height="8" x="3" y="3" rx="2"></rect><path d="M7 11v4a2 2 0 0 0 2 2h4"></path><rect width="8" height="8" x="13" y="13" rx="2"></rect></svg></span></div><h3 class="font-semibold">Define the policy</h3><p class="muted mt-2.5 text-sm leading-relaxed">Set a priority on each connection. The gateway serves them in order, skipping any that are unhealthy, rate-limited, or missing a credential.</p><div aria-hidden="true" class="absolute -right-3 top-1/2 hidden h-px w-6 bg-gold/45 md:block"></div></article></div><div class="reveal-card " style="transition-delay:180ms"><article class="card relative p-6 h-full"><div class="mb-8 flex items-center justify-between"><span class="font-mono text-3xl font-bold text-gold/80">03</span><span class="grid h-9 w-9 place-items-center rounded-full border border-line-strong text-gold-text"><svg class="h-4 w-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m18 16 4-4-4-4"></path><path d="m6 8-4 4 4 4"></path><path d="m14.5 4-5 16"></path></svg></span></div><h3 class="font-semibold">Ship one clean request</h3><p class="muted mt-2.5 text-sm leading-relaxed">Point your app at OmniHilbras and keep the same interface while the routing layer gets smarter.</p></article></div></div></div></section><section id="docs" class="mx-auto max-w-6xl px-5 py-16 sm:py-24"><div class="grid items-center gap-10 lg:grid-cols-[0.8fr_1.2fr] lg:gap-16"><div class="reveal "><span class="eyebrow">A familiar interface</span><h2 class="section-title mt-5">A better default, not a new abstraction.</h2><p class="muted mt-4 text-sm leading-relaxed sm:text-base">Keep the request shape your team already knows. OmniHilbras handles provider selection behind the endpoint, so your product can focus on the user.</p><ul class="mt-7 space-y-3.5"><li class="flex items-start gap-2.5 text-sm"><svg class="mt-0.5 h-4 w-4 shrink-0 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg><span class="muted">OpenAI-compatible request and response shapes</span></li><li class="flex items-start gap-2.5 text-sm"><svg class="mt-0.5 h-4 w-4 shrink-0 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg><span class="muted">Streaming passthrough for responsive interfaces</span></li><li class="flex items-start gap-2.5 text-sm"><svg class="mt-0.5 h-4 w-4 shrink-0 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"></circle><path d="m9 12 2 2 4-4"></path></svg><span class="muted">Per-request overrides when you need control</span></li></ul><a href="#start" class="btn-ghost mt-8"><svg class="h-4 w-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 7v14"></path><path d="M3 18a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h5a4 4 0 0 1 4 4 4 4 0 0 1 4-4h5a1 1 0 0 1 1 1v13a1 1 0 0 1-1 1h-6a3 3 0 0 0-3 3 3 3 0 0 0-3-3z"></path></svg>Read the getting started guide</a></div><div class="reveal " style="transition-delay:120ms"><div class="overflow-hidden rounded-2xl border border-line bg-[#0d0c09] shadow-2xl"><div class="flex items-center justify-between border-b border-white/10 px-4 py-3"><div class="flex items-center gap-1.5" aria-hidden="true"><span class="h-2.5 w-2.5 rounded-full bg-[#ff5f57]"></span><span class="h-2.5 w-2.5 rounded-full bg-[#febc2e]"></span><span class="h-2.5 w-2.5 rounded-full bg-[#28c840]"></span></div><div class="flex rounded-lg border border-white/10 bg-white/5 p-0.5" role="tablist" aria-label="Code language"><button type="button" role="tab" aria-selected="true" class="rounded-md px-2.5 py-1 font-mono text-[10px] transition-colors bg-white/10 text-[#f3d789]">cURL</button><button type="button" role="tab" aria-selected="false" class="rounded-md px-2.5 py-1 font-mono text-[10px] transition-colors text-[#8c8575] hover:text-[#e6c768]">TypeScript</button></div><button type="button" aria-label="Copy code" class="grid h-7 w-7 place-items-center rounded-md text-[#8c8575] transition-colors hover:bg-white/10 hover:text-[#f3d789]"><svg class="h-3.5 w-3.5" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect width="14" height="14" x="8" y="8" rx="2"></rect><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"></path></svg></button></div><div class="overflow-x-auto px-4 py-5 sm:px-6"><pre class="min-w-[560px] font-mono text-[11px] leading-[1.85] sm:text-xs"><code><span class="flex"><span class="mr-5 w-5 shrink-0 select-none text-right text-[#8c8575]">01</span><span class="text-[#b5ad9d]">curl http://127.0.0.1:8787/v1/chat/completions \</span></span><span class="flex"><span class="mr-5 w-5 shrink-0 select-none text-right text-[#8c8575]">02</span><span class="text-[#83b7ff]"> -H "Authorization: Bearer $OMNIHILBRAS_KEY" \</span></span><span class="flex"><span class="mr-5 w-5 shrink-0 select-none text-right text-[#8c8575]">03</span><span class="text-[#b5ad9d]"> -H "Content-Type: application/json" \</span></span><span class="flex"><span class="mr-5 w-5 shrink-0 select-none text-right text-[#8c8575]">04</span><span class="text-[#b5ad9d]"> -d '{</span></span><span class="flex"><span class="mr-5 w-5 shrink-0 select-none text-right text-[#8c8575]">05</span><span class="text-[#83b7ff]"> "model": "auto",</span></span><span class="flex"><span class="mr-5 w-5 shrink-0 select-none text-right text-[#8c8575]">06</span><span class="text-[#b5ad9d]"> "messages": [{ "role": "user", "content": "Hello" }]</span></span><span class="flex"><span class="mr-5 w-5 shrink-0 select-none text-right text-[#8c8575]">07</span><span class="text-[#b5ad9d]"> }'</span></span></code></pre></div><div class="flex items-center justify-between border-t border-white/10 px-4 py-3 font-mono text-[10px] text-[#8c8575] sm:px-6"><span>omnihilbras-client.ts</span><span class="flex items-center gap-1.5 text-[#7fd88f]"><span class="h-1.5 w-1.5 rounded-full bg-[#7fd88f]"></span>ready to route</span></div></div></div></div></section><section id="observability" class="border-y border-line bg-bg-soft/55"><div class="mx-auto grid max-w-6xl items-center gap-10 px-5 py-16 sm:py-24 lg:grid-cols-[0.78fr_1.22fr] lg:gap-16"><div class="reveal "><span class="eyebrow">No black box</span><h2 class="section-title mt-5">See the decision, not just the answer.</h2><p class="muted mt-4 text-sm leading-relaxed sm:text-base">Every response says which provider served it, under which request id, and what was tried before it. When a request fails, the reason is named rather than swallowed — and when a provider is skipped, the skip has a reason too. OmniHilbras makes routing observable by default.</p><div class="mt-7 space-y-4"><div class="flex gap-3"><svg class="mt-0.5 h-4 w-4 shrink-0 text-gold-text" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 10a2 2 0 0 0-2 2c0 1.02-.1 2.51-.26 4"></path><path d="M14 13.12c0 2.38 0 6.38-1 8.88"></path><path d="M17.29 21.02c.12-.6.43-2.3.5-3.02"></path><path d="M2 12a10 10 0 0 1 18-6"></path><path d="M2 16h.01"></path><path d="M21.8 16c.2-2 .131-5.354 0-6"></path><path d="M5 19.5C5.5 18 6 15 6 12a6 6 0 0 1 .34-2"></path><path d="M8.65 22c.21-.66.45-1.32.57-2"></path><path d="M9 6.8a6 6 0 0 1 9 5.2v2"></path></svg><div><p class="text-sm font-semibold">A request id on every response</p><p class="muted mt-1 text-xs leading-relaxed">Every reply carries gateway.requestId, and the providers that were tried before it.</p></div></div><div class="flex gap-3"><svg class="mt-0.5 h-4 w-4 shrink-0 text-gold-text" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2"></path></svg><div><p class="text-sm font-semibold">Named reasons, never generic errors</p><p class="muted mt-1 text-xs leading-relaxed">A skip is one of unhealthy, rate-limited, no-credential, no-models or disabled — not a silent fallback.</p></div></div><div class="flex gap-3"><svg class="mt-0.5 h-4 w-4 shrink-0 text-gold-text" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m12 14 4-4"></path><path d="M3.34 19a10 10 0 1 1 17.32 0"></path></svg><div><p class="text-sm font-semibold">Health that changes routing</p><p class="muted mt-1 text-xs leading-relaxed">Connections are polled; consecutive failures mark one unhealthy and routing stops choosing it, recording why.</p></div></div></div></div></div></section><section id="start" class="mx-auto max-w-6xl px-5 py-16 sm:py-24"><div class="reveal "><div class="card relative overflow-hidden px-6 py-12 text-center sm:px-10 sm:py-16"><div aria-hidden="true" class="pointer-events-none absolute inset-x-0 -top-32 h-64 opacity-60 blur-3xl" style="background:radial-gradient(ellipse, var(--glow), transparent 70%)"></div><div class="relative"><span class="eyebrow">The first release is taking shape</span><h2 class="section-title mx-auto mt-5 max-w-2xl">Keep your options <span class="gold-text">open.</span></h2><p class="muted mx-auto mt-4 max-w-lg text-sm leading-relaxed sm:text-base">OmniHilbras is being built for teams that want more leverage from every model without giving up control of the stack.</p><div class="mt-8 flex flex-wrap items-center justify-center gap-3"><a class="btn-gold" href="/dashboard">Open the dashboard<svg class="h-4 w-4" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 17 17 7"></path><path d="M7 7h10v10"></path></svg></a><a href="#how-it-works" class="btn-ghost">See how it works</a></div><div class="muted mt-7 flex flex-wrap items-center justify-center gap-x-5 gap-y-2 font-mono text-[10px]"><span class="flex items-center gap-1.5"><svg class="h-3 w-3 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.581a.5.5 0 0 1 0 .964L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z"></path></svg>Early preview</span><span class="flex items-center gap-1.5"><svg class="h-3 w-3 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="16" r="1"></circle><rect x="3" y="10" width="18" height="12" rx="2"></rect><path d="M7 10V7a5 5 0 0 1 10 0v3"></path></svg>Local-first</span><span class="flex items-center gap-1.5"><svg class="h-3 w-3 text-gold" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 3H7a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5c0 1.1.9 2 2 2h1"></path><path d="M16 21h1a2 2 0 0 0 2-2v-5c0-1.1.9-2 2-2a2 2 0 0 1-2-2V5a2 2 0 0 0-2-2h-1"></path></svg>Developer-friendly</span></div></div></div></div></section></main><footer class="relative border-t border-line"><div class="mx-auto grid max-w-6xl gap-10 px-5 py-12 sm:grid-cols-2 lg:grid-cols-4"><div class="max-w-xs"><a class="flex items-center gap-2.5 text-[15px] font-semibold tracking-tight" href="/"><span class="text-xl leading-none text-gold" aria-hidden="true">◈</span><span>Omni<span class="muted font-normal">Hilbras</span></span></a><p class="muted mt-3 text-[13px] leading-relaxed">One intelligent route between your applications and every model provider.</p><a href="#start" class="btn-gold mt-5 !px-3.5 !py-2 !text-[13px]">Start building</a></div><div><h2 class="mono-label">Explore</h2><ul class="mt-4 space-y-2.5 text-sm"><li><a href="#product" class="footer-link">Product</a></li><li><a href="#how-it-works" class="footer-link">How it works</a></li><li><a href="#docs" class="footer-link">Documentation</a></li><li><a class="footer-link" href="/dashboard">Dashboard</a></li></ul></div><div><h2 class="mono-label">Build</h2><ul class="mt-4 space-y-2.5 text-sm"><li><a href="#start" class="footer-link">Get started</a></li><li><a href="#docs" class="footer-link">API reference</a></li><li><a href="#observability" class="footer-link">Observability</a></li></ul></div><div><h2 class="mono-label">Built for</h2><p class="muted mt-4 max-w-[190px] text-sm leading-relaxed">Developers who want choice without operational chaos.</p><div class="mt-4 flex items-center gap-2 text-gold-text"><span class="h-1.5 w-1.5 rounded-full bg-gold" aria-hidden="true"></span><span class="font-mono text-[11px]">Local-first · BYOK</span></div></div></div><div class="border-t border-line"><div class="mx-auto flex max-w-6xl flex-col items-center justify-between gap-2 px-5 py-5 text-xs sm:flex-row"><span class="muted">© 2026 OmniHilbras — a Hilbras product</span><span class="muted font-mono">One route. Every model.</span></div></div></footer></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-bdd19f62aea907f6.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:\"static/chunks/8500-63a4afbeacab3b52.js\"\n3:\"static/chunks/246-0bbd2c1424911b5c.js\"\n4:\"static/chunks/85-abdd4f18753cba17.js\"\n5:\"static/chunks/705-f07c546a169bc3d2.js\"\n6:\"static/chunks/5497-dea83eee58687b78.js\"\n7:\"static/chunks/app/(dashboard)/layout-20e79861e79ed846.js\"\n8:I[21110,[\"8500\",\"$2\",\"246\",\"$3\",\"85\",\"$4\",\"705\",\"$5\",\"5497\",\"$6\",\"9305\",\"$7\"],\"ThemeProvider\"]\n9:\"static/chunks/505-d36ae6201af05bc2.js\"\na:\"static/chunks/app/layout-9a382aa3bca368d1.js\"\nb:\"RuntimeI18nProvider\"\nc:I[94635,[\"505\",\"$9\",\"85\",\"$4\",\"7177\",\"$a\"],\"$b\"]\nd:I[57121,[],\"\"]\ne:I[74581,[],\"\"]\nf:I[30565,[\"505\",\"$9\",\"85\",\"$4\",\"7177\",\"$a\"],\"GoogleAnalytics\"]\n13:I[61304,[],\"ClientPageRoot\"]\n14:\"static/chunks/app/landing/page-0a57d1766f9a201d.js\"\n15:I[72893,[\"8500\",\"$2\",\"7018\",\"$14\"],\"default\"]\n18:I[90484,[],\"OutletBoundary\"]\n19:\"$Sreact.suspense\"\n1b:\"ViewportBoundary\"\n1c:I[90484,[],\"$1b\"]\n1e:\"MetadataBoundary\"\n1f:I[90484,[],\"$1e\"]\n21:I[27123,[],\"default\",1]\n:HL[\"/_next/static/media/acc1c922d613a50a.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/dbccb4a9e22cbf0d-s.p.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/css/4b6560d3a7ee35a9.css\",\"style\"]\n:HL[\"/_next/static/css/c478309e956d6de4.css\",\"style\"]\n11:X\n12:[[\"children\",{\"s\":\"__PAGE__\",\"h\":512,\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[[\"$\",\"$L13\",null,{\"Component\":\"$15\",\"serverProvidedParams\":{\"searchParams\":{},\"params\":{},\"promises\":[\"$@16\",\"$@17\"]}}],null,[\"$\",\"$L18\",null,{\"children\":[\"$\",\"$19\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@1a\"}]}]]}],\"p\":false,\"v\":null}}]]\n10:[[\"children\",{\"s\":\"landing\",\"h\":512,\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$Ld\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$Le\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],\"p\":false,\"v\":\"$11\"},\"c\":\"$Q12\"}]]\n0:{\"P\":null,\"c\":[\"\",\"landing\"],\"q\":\"\",\"i\":false,\"t\":{\"t\":{\"s\":\"\",\"h\":528,\"d\":{\"r\":[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/4b6560d3a7ee35a9.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/c478309e956d6de4.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"(function(){try{var s=localStorage.getItem('theme');var t=s?(JSON.parse(s).state||{}).theme:'system';t=t||'system';var m=window.matchMedia('(prefers-color-scheme: dark)').matches;if(t==='dark'||(t==='system'\u0026\u0026m)){document.documentElement.classList.add('dark')}}catch(e){}})();\"}}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"var d=document,r=d.documentElement,f=function(){r.classList.add('fonts-loaded')};if(d.fonts\u0026\u0026d.fonts.load){d.fonts.load('24px \\\"Material Symbols Outlined\\\"').then(f).catch(f);setTimeout(f,3000)}else{f()}\"}}]]}],[\"$\",\"body\",null,{\"className\":\"__variable_4cefcd __variable_ad0237 font-sans antialiased\",\"children\":[[\"$\",\"$L8\",null,{\"children\":[\"$\",\"$Lc\",null,{\"children\":[\"$\",\"$Ld\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$Le\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}],[\"$\",\"$Lf\",null,{\"gaId\":\"G-LC959F603F\"}]]}]]}]]}],\"p\":false,\"v\":null},\"c\":\"$Q10\"},\"h\":{\"r\":[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$L1c\",null,{\"children\":\"$L1d\"}],[\"$\",\"$L1f\",null,{\"children\":[[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$19\",null,{\"name\":\"Next.Metadata\",\"children\":\"$L20\"}]}],null]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}],\"p\":false,\"v\":null}},\"m\":\"$undefined\",\"G\":[\"$21\",[]],\"S\":true,\"r\":\"$undefined\",\"s\":\"$undefined\",\"a\":\"$undefined\",\"l\":\"$undefined\",\"p\":\"$undefined\",\"d\":\"$undefined\",\"b\":\"2lzaQ8Vt54PR86aQkWaou\"}\n11:C\n16:{}\n17:\"$12:0:1:d:r:props:children:0:props:serverProvidedParams:params\"\n1d:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#0c0b09\"}]]\n22:I[86869,[],\"IconMark\"]\n1a:null\n20:[[\"$\",\"title\",\"0\",{\"children\":\"OmniHilbras — One route to every model\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"OmniHilbras is the intelligent routing layer between your applications and every AI provider. A self-hostable AI gateway for intelligent routing, automatic fallback, and one clean API.\"}],[\"$\",\"link\",\"2\",{\"rel\":\"manifest\",\"href\":\"/manifest.webmanifest\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"meta\",\"3\",{\"property\":\"og:title\",\"content\":\"OmniHilbras — One route to every model\"}],[\"$\",\"meta\",\"4\",{\"property\":\"og:description\",\"content\":\"A self-hostable AI gateway for intelligent routing, automatic fallback, and one clean API.\"}],[\"$\",\"meta\",\"5\",{\"property\":\"og:type\",\"content\":\"website\"}],[\"$\",\"meta\",\"6\",{\"name\":\"twitter:card\",\"content\":\"summary\"}],[\"$\",\"meta\",\"7\",{\"name\":\"twitter:title\",\"content\":\"OmniHilbras — One route to every model\"}],[\"$\",\"meta\",\"8\",{\"name\":\"twitter:description\",\"content\":\"A self-hostable AI gateway for intelligent routing, automatic fallback, and one clean API.\"}],[\"$\",\"link\",\"9\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?603d046c9a6fdfbb\",\"type\":\"image/x-icon\",\"sizes\":\"16x16\"}],[\"$\",\"link\",\"10\",{\"rel\":\"icon\",\"href\":\"/favicon.svg\"}],[\"$\",\"$L22\",\"11\",{}]]\n"])</script></body></html>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
1:"$Sreact.fragment"
|
|
2
2
|
2:"static/chunks/8500-63a4afbeacab3b52.js"
|
|
3
3
|
3:"static/chunks/246-0bbd2c1424911b5c.js"
|
|
4
|
-
4:"static/chunks/85-
|
|
4
|
+
4:"static/chunks/85-abdd4f18753cba17.js"
|
|
5
5
|
5:"static/chunks/705-f07c546a169bc3d2.js"
|
|
6
6
|
6:"static/chunks/5497-dea83eee58687b78.js"
|
|
7
7
|
7:"static/chunks/app/(dashboard)/layout-20e79861e79ed846.js"
|
|
@@ -26,11 +26,11 @@ f:I[30565,["505","$9","85","$4","7177","$a"],"GoogleAnalytics"]
|
|
|
26
26
|
:HL["/_next/static/media/acc1c922d613a50a.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
|
|
27
27
|
:HL["/_next/static/media/dbccb4a9e22cbf0d-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
|
|
28
28
|
:HL["/_next/static/css/4b6560d3a7ee35a9.css","style"]
|
|
29
|
-
:HL["/_next/static/css/
|
|
29
|
+
:HL["/_next/static/css/c478309e956d6de4.css","style"]
|
|
30
30
|
11:X
|
|
31
31
|
12:[["children",{"s":"__PAGE__","h":512,"d":{"r":["$","$1","c",{"children":[["$","$L13",null,{"Component":"$15","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@16","$@17"]}}],null,["$","$L18",null,{"children":["$","$19",null,{"name":"Next.MetadataOutlet","children":"$@1a"}]}]]}],"p":false,"v":null}}]]
|
|
32
32
|
10:[["children",{"s":"landing","h":512,"d":{"r":["$","$1","c",{"children":[null,["$","$Ld",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$Le",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],"p":false,"v":"$11"},"c":"$Q12"}]]
|
|
33
|
-
0:{"P":null,"c":["","landing"],"q":"","i":false,"t":{"t":{"s":"","h":528,"d":{"r":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/4b6560d3a7ee35a9.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/
|
|
33
|
+
0:{"P":null,"c":["","landing"],"q":"","i":false,"t":{"t":{"s":"","h":528,"d":{"r":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/4b6560d3a7ee35a9.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/c478309e956d6de4.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":[["$","head",null,{"children":[["$","script",null,{"dangerouslySetInnerHTML":{"__html":"(function(){try{var s=localStorage.getItem('theme');var t=s?(JSON.parse(s).state||{}).theme:'system';t=t||'system';var m=window.matchMedia('(prefers-color-scheme: dark)').matches;if(t==='dark'||(t==='system'&&m)){document.documentElement.classList.add('dark')}}catch(e){}})();"}}],["$","script",null,{"dangerouslySetInnerHTML":{"__html":"var d=document,r=d.documentElement,f=function(){r.classList.add('fonts-loaded')};if(d.fonts&&d.fonts.load){d.fonts.load('24px \"Material Symbols Outlined\"').then(f).catch(f);setTimeout(f,3000)}else{f()}"}}]]}],["$","body",null,{"className":"__variable_4cefcd __variable_ad0237 font-sans antialiased","children":[["$","$L8",null,{"children":["$","$Lc",null,{"children":["$","$Ld",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$Le",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$Lf",null,{"gaId":"G-LC959F603F"}]]}]]}]]}],"p":false,"v":null},"c":"$Q10"},"h":{"r":["$","$1","h",{"children":[null,["$","$L1c",null,{"children":"$L1d"}],["$","$L1f",null,{"children":[["$","div",null,{"hidden":true,"children":["$","$19",null,{"name":"Next.Metadata","children":"$L20"}]}],null]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"p":false,"v":null}},"m":"$undefined","G":["$21",[]],"S":true,"r":"$undefined","s":"$undefined","a":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"2lzaQ8Vt54PR86aQkWaou"}
|
|
34
34
|
11:C
|
|
35
35
|
16:{}
|
|
36
36
|
17:"$12:0:1:d:r:props:children:0:props:serverProvidedParams:params"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
1:"$Sreact.fragment"
|
|
2
2
|
2:"static/chunks/8500-63a4afbeacab3b52.js"
|
|
3
3
|
3:"static/chunks/246-0bbd2c1424911b5c.js"
|
|
4
|
-
4:"static/chunks/85-
|
|
4
|
+
4:"static/chunks/85-abdd4f18753cba17.js"
|
|
5
5
|
5:"static/chunks/705-f07c546a169bc3d2.js"
|
|
6
6
|
6:"static/chunks/5497-dea83eee58687b78.js"
|
|
7
7
|
7:"static/chunks/app/(dashboard)/layout-20e79861e79ed846.js"
|
|
@@ -26,11 +26,11 @@ f:I[30565,["505","$9","85","$4","7177","$a"],"GoogleAnalytics"]
|
|
|
26
26
|
:HL["/_next/static/media/acc1c922d613a50a.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
|
|
27
27
|
:HL["/_next/static/media/dbccb4a9e22cbf0d-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
|
|
28
28
|
:HL["/_next/static/css/4b6560d3a7ee35a9.css","style"]
|
|
29
|
-
:HL["/_next/static/css/
|
|
29
|
+
:HL["/_next/static/css/c478309e956d6de4.css","style"]
|
|
30
30
|
11:X
|
|
31
31
|
12:[["children",{"s":"__PAGE__","h":512,"d":{"r":["$","$1","c",{"children":[["$","$L13",null,{"Component":"$15","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@16","$@17"]}}],null,["$","$L18",null,{"children":["$","$19",null,{"name":"Next.MetadataOutlet","children":"$@1a"}]}]]}],"p":false,"v":null}}]]
|
|
32
32
|
10:[["children",{"s":"landing","h":512,"d":{"r":["$","$1","c",{"children":[null,["$","$Ld",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$Le",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],"p":false,"v":"$11"},"c":"$Q12"}]]
|
|
33
|
-
0:{"P":null,"c":["","landing"],"q":"","i":false,"t":{"t":{"s":"","h":528,"d":{"r":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/4b6560d3a7ee35a9.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/
|
|
33
|
+
0:{"P":null,"c":["","landing"],"q":"","i":false,"t":{"t":{"s":"","h":528,"d":{"r":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/4b6560d3a7ee35a9.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/c478309e956d6de4.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":[["$","head",null,{"children":[["$","script",null,{"dangerouslySetInnerHTML":{"__html":"(function(){try{var s=localStorage.getItem('theme');var t=s?(JSON.parse(s).state||{}).theme:'system';t=t||'system';var m=window.matchMedia('(prefers-color-scheme: dark)').matches;if(t==='dark'||(t==='system'&&m)){document.documentElement.classList.add('dark')}}catch(e){}})();"}}],["$","script",null,{"dangerouslySetInnerHTML":{"__html":"var d=document,r=d.documentElement,f=function(){r.classList.add('fonts-loaded')};if(d.fonts&&d.fonts.load){d.fonts.load('24px \"Material Symbols Outlined\"').then(f).catch(f);setTimeout(f,3000)}else{f()}"}}]]}],["$","body",null,{"className":"__variable_4cefcd __variable_ad0237 font-sans antialiased","children":[["$","$L8",null,{"children":["$","$Lc",null,{"children":["$","$Ld",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$Le",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}],["$","$Lf",null,{"gaId":"G-LC959F603F"}]]}]]}]]}],"p":false,"v":null},"c":"$Q10"},"h":{"r":["$","$1","h",{"children":[null,["$","$L1c",null,{"children":"$L1d"}],["$","$L1f",null,{"children":[["$","div",null,{"hidden":true,"children":["$","$19",null,{"name":"Next.Metadata","children":"$L20"}]}],null]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"p":false,"v":null}},"m":"$undefined","G":["$21",[]],"S":true,"r":"$undefined","s":"$undefined","a":"$undefined","l":"$undefined","p":"$undefined","d":"$undefined","b":"2lzaQ8Vt54PR86aQkWaou"}
|
|
34
34
|
11:C
|
|
35
35
|
16:{}
|
|
36
36
|
17:"$12:0:1:d:r:props:children:0:props:serverProvidedParams:params"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
:HL["/_next/static/media/acc1c922d613a50a.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
|
|
2
2
|
:HL["/_next/static/media/dbccb4a9e22cbf0d-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}]
|
|
3
3
|
:HL["/_next/static/css/4b6560d3a7ee35a9.css","style"]
|
|
4
|
-
:HL["/_next/static/css/
|
|
4
|
+
:HL["/_next/static/css/c478309e956d6de4.css","style"]
|
|
5
5
|
2:[["children",{"s":"__PAGE__","h":160}]]
|
|
6
6
|
1:[["children",{"s":"landing","h":96,"c":"$Q2"}]]
|
|
7
|
-
0:{"b":"
|
|
7
|
+
0:{"b":"2lzaQ8Vt54PR86aQkWaou","t":{"t":{"s":"","h":80,"c":"$Q1"}}}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
1:"$Sreact.fragment"
|
|
2
2
|
2:"static/chunks/8500-63a4afbeacab3b52.js"
|
|
3
3
|
3:"static/chunks/246-0bbd2c1424911b5c.js"
|
|
4
|
-
4:"static/chunks/85-
|
|
4
|
+
4:"static/chunks/85-abdd4f18753cba17.js"
|
|
5
5
|
5:"static/chunks/705-f07c546a169bc3d2.js"
|
|
6
6
|
6:"static/chunks/5497-dea83eee58687b78.js"
|
|
7
7
|
7:"static/chunks/app/(dashboard)/layout-20e79861e79ed846.js"
|
|
@@ -24,13 +24,13 @@ f:I[30565,["505","$9","85","$4","7177","$a"],"GoogleAnalytics"]
|
|
|
24
24
|
22:I[90484,[],"$21"]
|
|
25
25
|
23:I[86869,[],"IconMark"]
|
|
26
26
|
:HL["/_next/static/css/4b6560d3a7ee35a9.css","style"]
|
|
27
|
-
:HL["/_next/static/css/
|
|
27
|
+
:HL["/_next/static/css/c478309e956d6de4.css","style"]
|
|
28
28
|
11:X
|
|
29
29
|
14:X
|
|
30
30
|
14:C
|
|
31
31
|
15:[["children",{"s":"__PAGE__","h":160,"d":{"r":["$","$1","c",{"children":[["$","$L16",null,{"Component":"$18","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@19","$@1a"]}}],null,["$","$L1b",null,{"children":["$","$1c",null,{"name":"Next.MetadataOutlet","children":"$@1d"}]}]]}],"p":"$@1e","v":null,"s":"$11"}}]]
|
|
32
32
|
12:[["children",{"s":"landing","h":96,"d":{"r":["$","$1","c",{"children":[null,["$","$Ld",null,{"parallelRouterKey":"children","template":["$","$Le",null,{}]}]]}],"p":"$@13","v":"$14","s":"$11"},"c":"$Q15"}]]
|
|
33
|
-
0:{"t":{"t":{"s":"","h":80,"d":{"r":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/4b6560d3a7ee35a9.css","precedence":"next"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/
|
|
33
|
+
0:{"t":{"t":{"s":"","h":80,"d":{"r":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/css/4b6560d3a7ee35a9.css","precedence":"next"}],["$","link","1",{"rel":"stylesheet","href":"/_next/static/css/c478309e956d6de4.css","precedence":"next"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":[["$","head",null,{"children":[["$","script",null,{"dangerouslySetInnerHTML":{"__html":"(function(){try{var s=localStorage.getItem('theme');var t=s?(JSON.parse(s).state||{}).theme:'system';t=t||'system';var m=window.matchMedia('(prefers-color-scheme: dark)').matches;if(t==='dark'||(t==='system'&&m)){document.documentElement.classList.add('dark')}}catch(e){}})();"}}],["$","script",null,{"dangerouslySetInnerHTML":{"__html":"var d=document,r=d.documentElement,f=function(){r.classList.add('fonts-loaded')};if(d.fonts&&d.fonts.load){d.fonts.load('24px \"Material Symbols Outlined\"').then(f).catch(f);setTimeout(f,3000)}else{f()}"}}]]}],["$","body",null,{"className":"__variable_4cefcd __variable_ad0237 font-sans antialiased","children":[["$","$L8",null,{"children":["$","$Lc",null,{"children":["$","$Ld",null,{"parallelRouterKey":"children","template":["$","$Le",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}]}],["$","$Lf",null,{"gaId":"G-LC959F603F"}]]}]]}]]}],"p":"$@10","v":null,"s":"$11"},"c":"$Q12"},"h":{"r":["$","$1","h",{"children":[null,["$","$L20",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","2",{"name":"theme-color","content":"#0c0b09"}]]}],["$","$L22",null,{"children":[["$","div",null,{"hidden":true,"children":["$","$1c",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"OmniHilbras — One route to every model"}],["$","meta","1",{"name":"description","content":"OmniHilbras is the intelligent routing layer between your applications and every AI provider. A self-hostable AI gateway for intelligent routing, automatic fallback, and one clean API."}],["$","link","2",{"rel":"manifest","href":"/manifest.webmanifest"}],["$","meta","3",{"property":"og:title","content":"OmniHilbras — One route to every model"}],["$","meta","4",{"property":"og:description","content":"A self-hostable AI gateway for intelligent routing, automatic fallback, and one clean API."}],["$","meta","5",{"property":"og:type","content":"website"}],["$","meta","6",{"name":"twitter:card","content":"summary"}],["$","meta","7",{"name":"twitter:title","content":"OmniHilbras — One route to every model"}],["$","meta","8",{"name":"twitter:description","content":"A self-hostable AI gateway for intelligent routing, automatic fallback, and one clean API."}],["$","link","9",{"rel":"icon","href":"/favicon.ico?603d046c9a6fdfbb","type":"image/x-icon","sizes":"16x16"}],["$","link","10",{"rel":"icon","href":"/favicon.svg"}],["$","$L23","11",{}]]}]}],null]}],["$","meta",null,{"name":"next-size-adjust","content":""}]]}],"p":"$@24","v":null,"s":"$11"}},"a":"$@25","u":"$@26","b":"2lzaQ8Vt54PR86aQkWaou"}
|
|
34
34
|
19:{}
|
|
35
35
|
1a:"$15:0:1:d:r:props:children:0:props:serverProvidedParams:params"
|
|
36
36
|
1d:null
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{var a={};a.id=4520,a.ids=[4520],a.modules={643:a=>{"use strict";a.exports=require("node:perf_hooks")},1708:a=>{"use strict";a.exports=require("node:process")},1932:a=>{"use strict";a.exports=require("url")},3295:a=>{"use strict";a.exports=require("next/dist/server/app-render/after-task-async-storage.external.js")},4573:a=>{"use strict";a.exports=require("node:buffer")},7066:a=>{"use strict";a.exports=require("node:tty")},8128:a=>{"use strict";a.exports=require("next/dist/server/runtime-reacts.external.js")},9890:(a,b,c)=>{Promise.resolve().then(c.bind(c,65674))},10846:a=>{"use strict";a.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},14412:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>g});var d=c(48249),e=c(67484),f=c(50412);function g(){let[a,b]=(0,e.useState)(""),[c,g]=(0,e.useState)(""),[h,i]=(0,e.useState)(""),[j,k]=(0,e.useState)(0),[l,m]=(0,e.useState)(!1),[n,o]=(0,e.useState)(null),[p,q]=(0,e.useState)("password"),[r,s]=(0,e.useState)("oidc"),[t,u]=(0,e.useState)(!1),[v,w]=(0,e.useState)("Sign in with OIDC"),[x,y]=(0,e.useState)(!1),[z,A]=(0,e.useState)("Sign in with SAML SSO"),[B,C]=(0,e.useState)(!1),[D,E]=(0,e.useState)(""),F=async b=>{b.preventDefault(),m(!0),g(""),i("");try{let b=await fetch("/api/auth/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({password:a})});if(b.ok){if((await b.json()).mustChangePassword)return void C(!0);window.location.assign("/dashboard")}else{let a=await b.json();g(a.error||"Invalid password"),a.resetHint&&i(a.resetHint),a.retryAfter&&k(Number(a.retryAfter))}}catch(a){g("An error occurred. Please try again.")}finally{m(!1)}},G=async b=>{b.preventDefault(),m(!0),g("");try{let b=await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({currentPassword:a,newPassword:D})});if(b.ok)window.location.assign("/dashboard");else{let a=await b.json();g(a.error||"Failed to set password")}}catch(a){g("An error occurred. Please try again.")}finally{m(!1)}},H=["sso","oidc","saml","both"].includes(p),I=r||("saml"===p?"saml":"oidc"),J=H&&"saml"===I&&x,K=H&&"oidc"===I&&t,L=J||K,M="password"===p||"both"===p||!L;return null===n?(0,d.jsx)("div",{className:"min-h-screen flex items-center justify-center bg-bg p-4",children:(0,d.jsxs)("div",{className:"text-center",children:[(0,d.jsx)("div",{className:"inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-primary"}),(0,d.jsx)("p",{className:"text-text-muted mt-4",children:"Loading..."})]})}):(0,d.jsxs)("div",{className:"min-h-screen flex items-center justify-center bg-bg p-4 relative overflow-hidden",children:[(0,d.jsx)("div",{className:"landing-grid absolute inset-0 pointer-events-none","aria-hidden":"true"}),(0,d.jsxs)("div",{className:"relative z-10 w-full max-w-md",children:[(0,d.jsxs)("div",{className:"text-center mb-8",children:[(0,d.jsx)("h1",{className:"text-3xl font-bold text-primary mb-2",children:"OmniHilbras"}),(0,d.jsx)("p",{className:"text-text-muted",children:J?"Sign in with SAML 2.0 Single Sign-On":K?"Sign in with your OIDC provider to access the dashboard":"Enter your password to access the dashboard"})]}),(0,d.jsx)(f.Zp,{children:B?(0,d.jsxs)("form",{onSubmit:G,className:"flex flex-col gap-4",children:[(0,d.jsx)("p",{className:"text-sm text-amber-600 dark:text-amber-400 text-center",children:"Set a new password before accessing the dashboard remotely."}),(0,d.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,d.jsx)("label",{className:"text-sm font-medium",children:"New password"}),(0,d.jsx)(f.pd,{type:"password",placeholder:"Enter new password",value:D,onChange:a=>E(a.target.value),required:!0,autoFocus:!0}),c&&(0,d.jsx)("p",{className:"text-xs text-red-500",children:c})]}),(0,d.jsx)(f.$n,{type:"submit",variant:"primary",className:"w-full",loading:l,disabled:!D,children:"Set password"})]}):(0,d.jsxs)("div",{className:"flex flex-col gap-4",children:[J&&(0,d.jsx)(f.$n,{type:"button",variant:"primary",className:"w-full",onClick:()=>{window.location.href="/api/auth/saml/start"},children:z}),K&&(0,d.jsx)(f.$n,{type:"button",variant:"primary",className:"w-full",onClick:()=>{window.location.href="/api/auth/oidc/start"},children:v}),L&&M&&(0,d.jsx)("div",{className:"h-px bg-border/60"}),M?(0,d.jsxs)("form",{onSubmit:F,className:"flex flex-col gap-4",children:[H&&!L&&(0,d.jsxs)("p",{className:"text-xs text-amber-600 dark:text-amber-400 text-center",children:["saml"===I?"SAML SSO":"OIDC"," login is enabled, but configuration is incomplete. Password login is still available for recovery."]}),"both"===p&&L&&(0,d.jsxs)("p",{className:"text-xs text-text-muted text-center",children:["Password and ","saml"===I?"SAML SSO":"OIDC"," login are both enabled."]}),(0,d.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,d.jsx)("label",{className:"text-sm font-medium",children:"Password"}),(0,d.jsx)(f.pd,{type:"password",placeholder:"Enter password",value:a,onChange:a=>b(a.target.value),required:!0,autoFocus:!K}),c&&(0,d.jsx)("p",{className:"text-xs text-red-500",children:c}),j>0&&(0,d.jsxs)("p",{className:"text-xs text-amber-600 dark:text-amber-400",children:["Locked. Retry in ",(0,d.jsxs)("span",{className:"font-mono",children:[j,"s"]}),"."]}),h&&(0,d.jsxs)("p",{className:"text-xs text-text-muted",children:["Forgot password? Open ",(0,d.jsx)("code",{className:"bg-sidebar px-1 rounded",children:"omnihilbras"})," CLI on the host → ",(0,d.jsx)("b",{children:"Settings"})," → ",(0,d.jsx)("b",{children:"Reset Password to Default"}),"."]})]}),(0,d.jsx)(f.$n,{type:"submit",variant:"primary",className:"w-full",loading:l,disabled:j>0,children:j>0?`Wait ${j}s`:"Login"}),(0,d.jsxs)("p",{className:"text-xs text-center text-text-muted mt-2",children:["Default password is ",(0,d.jsx)("code",{className:"bg-sidebar px-1 rounded",children:"123456"})]}),!1===n&&(0,d.jsx)("p",{className:"text-xs text-center text-amber-600 dark:text-amber-400",children:"Security risk: no password set. You will be asked to set one when logging in remotely."})]}):c&&(0,d.jsx)("p",{className:"text-xs text-red-500",children:c})]})})]})]})}},14953:(a,b,c)=>{"use strict";var d=c(68662);function e(){}function f(){}f.resetWarningCache=e,a.exports=function(){function a(a,b,c,e,f,g){if(g!==d){var h=Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw h.name="Invariant Violation",h}}function b(){return a}a.isRequired=a;var c={array:a,bigint:a,bool:a,func:a,number:a,object:a,string:a,symbol:a,any:a,arrayOf:b,element:a,elementType:a,instanceOf:b,node:a,objectOf:b,oneOf:b,oneOfType:b,shape:b,exact:b,checkPropTypes:f,resetWarningCache:e};return c.PropTypes=c,c}},14985:a=>{"use strict";a.exports=require("dns")},16698:a=>{"use strict";a.exports=require("node:async_hooks")},19121:a=>{"use strict";a.exports=require("next/dist/server/app-render/action-async-storage.external.js")},21820:a=>{"use strict";a.exports=require("os")},27910:a=>{"use strict";a.exports=require("stream")},28042:(a,b,c)=>{Promise.resolve().then(c.bind(c,14412))},28354:a=>{"use strict";a.exports=require("util")},29021:a=>{"use strict";a.exports=require("fs")},29294:a=>{"use strict";a.exports=require("next/dist/server/app-render/work-async-storage.external.js")},31421:a=>{"use strict";a.exports=require("node:child_process")},32467:a=>{"use strict";a.exports=require("node:http2")},33873:a=>{"use strict";a.exports=require("path")},34589:a=>{"use strict";a.exports=require("node:assert")},37067:a=>{"use strict";a.exports=require("node:http")},37540:a=>{"use strict";a.exports=require("node:console")},38522:a=>{"use strict";a.exports=require("node:zlib")},40610:a=>{"use strict";a.exports=require("node:dns")},41025:a=>{"use strict";a.exports=require("next/dist/server/app-render/dynamic-access-async-storage.external.js")},41692:a=>{"use strict";a.exports=require("node:tls")},41792:a=>{"use strict";a.exports=require("node:querystring")},46060:a=>{"use strict";a.exports=require("next/dist/shared/lib/no-fallback-error.external.js")},46293:a=>{"use strict";a.exports=require("sql.js")},48161:a=>{"use strict";a.exports=require("node:os")},49885:(a,b,c)=>{a.exports=c(14953)()},51455:a=>{"use strict";a.exports=require("node:fs/promises")},53053:a=>{"use strict";a.exports=require("node:diagnostics_channel")},55511:a=>{"use strict";a.exports=require("crypto")},55591:a=>{"use strict";a.exports=require("https")},57075:a=>{"use strict";a.exports=require("node:stream")},57975:a=>{"use strict";a.exports=require("node:util")},63033:a=>{"use strict";a.exports=require("next/dist/server/app-render/work-unit-async-storage.external.js")},65674:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>d});let d=(0,c(77943).registerClientReference)(function(){throw Error("Attempted to call the default export of \"/home/gin/work/Hilbras/OmniHilbras/src/app/login/page.js\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/home/gin/work/Hilbras/OmniHilbras/src/app/login/page.js","default")},68662:a=>{"use strict";a.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},71553:a=>{"use strict";a.exports=require("node:dns/promises")},71622:a=>{"use strict";a.exports=import("open")},72271:a=>{"use strict";a.exports=require("@aws-sdk/credential-providers")},73024:a=>{"use strict";a.exports=require("node:fs")},73136:a=>{"use strict";a.exports=require("node:url")},73429:a=>{"use strict";a.exports=require("node:util/types")},73496:a=>{"use strict";a.exports=require("http2")},74075:a=>{"use strict";a.exports=require("zlib")},75919:a=>{"use strict";a.exports=require("node:worker_threads")},76760:a=>{"use strict";a.exports=require("node:path")},77030:a=>{"use strict";a.exports=require("node:net")},77598:a=>{"use strict";a.exports=require("node:crypto")},78474:a=>{"use strict";a.exports=require("node:events")},79646:a=>{"use strict";a.exports=require("child_process")},79868:a=>{"use strict";a.exports=require("node:sqlite")},81630:a=>{"use strict";a.exports=require("http")},81787:a=>{"use strict";a.exports=require("bun:sqlite")},87550:a=>{"use strict";a.exports=require("better-sqlite3")},87997:a=>{"use strict";a.exports=require("node:timers")},91645:a=>{"use strict";a.exports=require("net")},94735:a=>{"use strict";a.exports=require("events")},95078:(a,b,c)=>{"use strict";c.r(b),c.d(b,{__next_app__:()=>q,handler:()=>s,routeModule:()=>r});var d=c(21635),e=c(86315),f=c(1020),g=c(61287),h={};for(let a in g)0>["default","__next_app__","routeModule","handler"].indexOf(a)&&(h[a]=()=>g[a]);c.d(b,h);let i=(0,d.p)(()=>Promise.resolve().then(c.bind(c,57529))),j=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,95547,23))),k=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,55091,23))),l=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,45270,23))),m=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,28193,23))),n=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,95547,23))),o={children:["",{children:["login",{children:["__PAGE__",{},{page:[(0,d.p)(()=>Promise.resolve().then(c.bind(c,65674))),"/home/gin/work/Hilbras/OmniHilbras/src/app/login/page.js"]}]},{"global-error":[n,"next/dist/client/components/builtin/global-error.js"],metadata:{icon:[async a=>(await (0,d.p)(()=>Promise.resolve().then(c.bind(c,70440)))()).default(a)],apple:[],openGraph:[],twitter:[],manifest:"/manifest.webmanifest"}},[]]},{layout:[i,"/home/gin/work/Hilbras/OmniHilbras/src/app/layout.js"],"global-error":[j,"next/dist/client/components/builtin/global-error.js"],"not-found":[k,"next/dist/client/components/builtin/not-found.js"],forbidden:[l,"next/dist/client/components/builtin/forbidden.js"],unauthorized:[m,"next/dist/client/components/builtin/unauthorized.js"],metadata:{icon:[async a=>(await (0,d.p)(()=>Promise.resolve().then(c.bind(c,70440)))()).default(a)],apple:[],openGraph:[],twitter:[],manifest:"/manifest.webmanifest"}},[]]}.children,p=(0,e.H)({tree:o,page:"/login/page",pathname:"/login",require:c,loadChunk:()=>Promise.resolve(),interopDefault:f.T}),q=p.__next_app__,r=p.routeModule,s=p.handler}};var b=require("../../webpack-runtime.js");b.C(a);var c=b.X(0,[2970,1260,2430,3031,2116,9100,4043,6070,1329,915,6457,4123,3799,6777,412],()=>b(b.s=95078));module.exports=c})();
|
|
1
|
+
(()=>{var a={};a.id=4520,a.ids=[4520],a.modules={643:a=>{"use strict";a.exports=require("node:perf_hooks")},1708:a=>{"use strict";a.exports=require("node:process")},1932:a=>{"use strict";a.exports=require("url")},3295:a=>{"use strict";a.exports=require("next/dist/server/app-render/after-task-async-storage.external.js")},4573:a=>{"use strict";a.exports=require("node:buffer")},7066:a=>{"use strict";a.exports=require("node:tty")},8128:a=>{"use strict";a.exports=require("next/dist/server/runtime-reacts.external.js")},9890:(a,b,c)=>{Promise.resolve().then(c.bind(c,65674))},10846:a=>{"use strict";a.exports=require("next/dist/compiled/next-server/app-page.runtime.prod.js")},14412:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>g});var d=c(48249),e=c(67484),f=c(50412);function g(){let[a,b]=(0,e.useState)(""),[c,g]=(0,e.useState)(""),[h,i]=(0,e.useState)(""),[j,k]=(0,e.useState)(0),[l,m]=(0,e.useState)(!1),[n,o]=(0,e.useState)(null),[p,q]=(0,e.useState)("password"),[r,s]=(0,e.useState)("oidc"),[t,u]=(0,e.useState)(!1),[v,w]=(0,e.useState)("Sign in with OIDC"),[x,y]=(0,e.useState)(!1),[z,A]=(0,e.useState)("Sign in with SAML SSO"),[B,C]=(0,e.useState)(!1),[D,E]=(0,e.useState)(""),F=async b=>{b.preventDefault(),m(!0),g(""),i("");try{let b=await fetch("/api/auth/login",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({password:a})});if(b.ok){if((await b.json()).mustChangePassword)return void C(!0);window.location.assign("/dashboard")}else{let a=await b.json();g(a.error||"Invalid password"),a.resetHint&&i(a.resetHint),a.retryAfter&&k(Number(a.retryAfter))}}catch(a){g("An error occurred. Please try again.")}finally{m(!1)}},G=async b=>{b.preventDefault(),m(!0),g("");try{let b=await fetch("/api/settings",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({currentPassword:a,newPassword:D})});if(b.ok)window.location.assign("/dashboard");else{let a=await b.json();g(a.error||"Failed to set password")}}catch(a){g("An error occurred. Please try again.")}finally{m(!1)}},H=["sso","oidc","saml","both"].includes(p),I=r||("saml"===p?"saml":"oidc"),J=H&&"saml"===I&&x,K=H&&"oidc"===I&&t,L=J||K,M="password"===p||"both"===p||!L;return null===n?(0,d.jsx)("div",{className:"min-h-screen flex items-center justify-center bg-bg p-4",children:(0,d.jsxs)("div",{className:"text-center",children:[(0,d.jsx)("div",{className:"inline-block animate-spin rounded-full h-8 w-8 border-b-2 border-primary"}),(0,d.jsx)("p",{className:"text-text-muted mt-4",children:"Loading..."})]})}):(0,d.jsxs)("div",{className:"min-h-screen flex items-center justify-center bg-bg p-4 relative overflow-hidden",children:[(0,d.jsx)("div",{className:"landing-grid absolute inset-0 pointer-events-none","aria-hidden":"true"}),(0,d.jsxs)("div",{className:"relative z-10 w-full max-w-md",children:[(0,d.jsxs)("div",{className:"text-center mb-8",children:[(0,d.jsx)("h1",{className:"text-3xl font-bold text-primary mb-2",children:"OmniHilbras"}),(0,d.jsx)("p",{className:"text-text-muted",children:J?"Sign in with SAML 2.0 Single Sign-On":K?"Sign in with your OIDC provider to access the dashboard":"Enter your password to access the dashboard"})]}),(0,d.jsx)(f.Zp,{children:B?(0,d.jsxs)("form",{onSubmit:G,className:"flex flex-col gap-4",children:[(0,d.jsx)("p",{className:"text-sm text-amber-600 dark:text-amber-400 text-center",children:"Set a new password before accessing the dashboard remotely."}),(0,d.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,d.jsx)("label",{className:"text-sm font-medium",children:"New password"}),(0,d.jsx)(f.pd,{type:"password",placeholder:"Enter new password",value:D,onChange:a=>E(a.target.value),required:!0,autoFocus:!0}),c&&(0,d.jsx)("p",{className:"text-xs text-red-500",children:c})]}),(0,d.jsx)(f.$n,{type:"submit",variant:"primary",className:"w-full",loading:l,disabled:!D,children:"Set password"})]}):(0,d.jsxs)("div",{className:"flex flex-col gap-4",children:[J&&(0,d.jsx)(f.$n,{type:"button",variant:"primary",className:"w-full",onClick:()=>{window.location.href="/api/auth/saml/start"},children:z}),K&&(0,d.jsx)(f.$n,{type:"button",variant:"primary",className:"w-full",onClick:()=>{window.location.href="/api/auth/oidc/start"},children:v}),L&&M&&(0,d.jsx)("div",{className:"h-px bg-border/60"}),M?(0,d.jsxs)("form",{onSubmit:F,className:"flex flex-col gap-4",children:[H&&!L&&(0,d.jsxs)("p",{className:"text-xs text-amber-600 dark:text-amber-400 text-center",children:["saml"===I?"SAML SSO":"OIDC"," login is enabled, but configuration is incomplete. Password login is still available for recovery."]}),"both"===p&&L&&(0,d.jsxs)("p",{className:"text-xs text-text-muted text-center",children:["Password and ","saml"===I?"SAML SSO":"OIDC"," login are both enabled."]}),(0,d.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,d.jsx)("label",{className:"text-sm font-medium",children:"Password"}),(0,d.jsx)(f.pd,{type:"password",placeholder:"Enter password",value:a,onChange:a=>b(a.target.value),required:!0,autoFocus:!K}),c&&(0,d.jsx)("p",{className:"text-xs text-red-500",children:c}),j>0&&(0,d.jsxs)("p",{className:"text-xs text-amber-600 dark:text-amber-400",children:["Locked. Retry in ",(0,d.jsxs)("span",{className:"font-mono",children:[j,"s"]}),"."]}),h&&(0,d.jsxs)("p",{className:"text-xs text-text-muted",children:["Forgot password? Open ",(0,d.jsx)("code",{className:"bg-sidebar px-1 rounded",children:"omnihilbras"})," CLI on the host → ",(0,d.jsx)("b",{children:"Settings"})," → ",(0,d.jsx)("b",{children:"Reset Password to Default"}),"."]})]}),(0,d.jsx)(f.$n,{type:"submit",variant:"primary",className:"w-full",loading:l,disabled:j>0,children:j>0?`Wait ${j}s`:"Login"}),(0,d.jsxs)("p",{className:"text-xs text-center text-text-muted mt-2",children:["Default password is ",(0,d.jsx)("code",{className:"bg-sidebar px-1 rounded",children:"123456"})]}),!1===n&&(0,d.jsx)("p",{className:"text-xs text-center text-amber-600 dark:text-amber-400",children:"Security risk: no password set. You will be asked to set one when logging in remotely."})]}):c&&(0,d.jsx)("p",{className:"text-xs text-red-500",children:c})]})})]})]})}},14953:(a,b,c)=>{"use strict";var d=c(68662);function e(){}function f(){}f.resetWarningCache=e,a.exports=function(){function a(a,b,c,e,f,g){if(g!==d){var h=Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw h.name="Invariant Violation",h}}function b(){return a}a.isRequired=a;var c={array:a,bigint:a,bool:a,func:a,number:a,object:a,string:a,symbol:a,any:a,arrayOf:b,element:a,elementType:a,instanceOf:b,node:a,objectOf:b,oneOf:b,oneOfType:b,shape:b,exact:b,checkPropTypes:f,resetWarningCache:e};return c.PropTypes=c,c}},14985:a=>{"use strict";a.exports=require("dns")},16698:a=>{"use strict";a.exports=require("node:async_hooks")},19121:a=>{"use strict";a.exports=require("next/dist/server/app-render/action-async-storage.external.js")},21820:a=>{"use strict";a.exports=require("os")},27910:a=>{"use strict";a.exports=require("stream")},28042:(a,b,c)=>{Promise.resolve().then(c.bind(c,14412))},28354:a=>{"use strict";a.exports=require("util")},29021:a=>{"use strict";a.exports=require("fs")},29294:a=>{"use strict";a.exports=require("next/dist/server/app-render/work-async-storage.external.js")},31421:a=>{"use strict";a.exports=require("node:child_process")},32467:a=>{"use strict";a.exports=require("node:http2")},33873:a=>{"use strict";a.exports=require("path")},34589:a=>{"use strict";a.exports=require("node:assert")},37067:a=>{"use strict";a.exports=require("node:http")},37540:a=>{"use strict";a.exports=require("node:console")},38522:a=>{"use strict";a.exports=require("node:zlib")},40610:a=>{"use strict";a.exports=require("node:dns")},41025:a=>{"use strict";a.exports=require("next/dist/server/app-render/dynamic-access-async-storage.external.js")},41692:a=>{"use strict";a.exports=require("node:tls")},41792:a=>{"use strict";a.exports=require("node:querystring")},46060:a=>{"use strict";a.exports=require("next/dist/shared/lib/no-fallback-error.external.js")},46293:a=>{"use strict";a.exports=require("sql.js")},48161:a=>{"use strict";a.exports=require("node:os")},49885:(a,b,c)=>{a.exports=c(14953)()},51455:a=>{"use strict";a.exports=require("node:fs/promises")},53053:a=>{"use strict";a.exports=require("node:diagnostics_channel")},55511:a=>{"use strict";a.exports=require("crypto")},55591:a=>{"use strict";a.exports=require("https")},57075:a=>{"use strict";a.exports=require("node:stream")},57975:a=>{"use strict";a.exports=require("node:util")},63033:a=>{"use strict";a.exports=require("next/dist/server/app-render/work-unit-async-storage.external.js")},65674:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>d});let d=(0,c(77943).registerClientReference)(function(){throw Error("Attempted to call the default export of \"/home/gin/work/Hilbras/OmniHilbras/src/app/login/page.js\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/home/gin/work/Hilbras/OmniHilbras/src/app/login/page.js","default")},68662:a=>{"use strict";a.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},71553:a=>{"use strict";a.exports=require("node:dns/promises")},71622:a=>{"use strict";a.exports=import("open")},72271:a=>{"use strict";a.exports=require("@aws-sdk/credential-providers")},73024:a=>{"use strict";a.exports=require("node:fs")},73136:a=>{"use strict";a.exports=require("node:url")},73429:a=>{"use strict";a.exports=require("node:util/types")},73496:a=>{"use strict";a.exports=require("http2")},74075:a=>{"use strict";a.exports=require("zlib")},75919:a=>{"use strict";a.exports=require("node:worker_threads")},76760:a=>{"use strict";a.exports=require("node:path")},77030:a=>{"use strict";a.exports=require("node:net")},77598:a=>{"use strict";a.exports=require("node:crypto")},78474:a=>{"use strict";a.exports=require("node:events")},79646:a=>{"use strict";a.exports=require("child_process")},79868:a=>{"use strict";a.exports=require("node:sqlite")},81630:a=>{"use strict";a.exports=require("http")},81787:a=>{"use strict";a.exports=require("bun:sqlite")},87550:a=>{"use strict";a.exports=require("better-sqlite3")},87997:a=>{"use strict";a.exports=require("node:timers")},91645:a=>{"use strict";a.exports=require("net")},94735:a=>{"use strict";a.exports=require("events")},95078:(a,b,c)=>{"use strict";c.r(b),c.d(b,{__next_app__:()=>q,handler:()=>s,routeModule:()=>r});var d=c(21635),e=c(86315),f=c(1020),g=c(61287),h={};for(let a in g)0>["default","__next_app__","routeModule","handler"].indexOf(a)&&(h[a]=()=>g[a]);c.d(b,h);let i=(0,d.p)(()=>Promise.resolve().then(c.bind(c,57529))),j=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,95547,23))),k=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,55091,23))),l=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,45270,23))),m=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,28193,23))),n=(0,d.p)(()=>Promise.resolve().then(c.t.bind(c,95547,23))),o={children:["",{children:["login",{children:["__PAGE__",{},{page:[(0,d.p)(()=>Promise.resolve().then(c.bind(c,65674))),"/home/gin/work/Hilbras/OmniHilbras/src/app/login/page.js"]}]},{"global-error":[n,"next/dist/client/components/builtin/global-error.js"],metadata:{icon:[async a=>(await (0,d.p)(()=>Promise.resolve().then(c.bind(c,70440)))()).default(a)],apple:[],openGraph:[],twitter:[],manifest:"/manifest.webmanifest"}},[]]},{layout:[i,"/home/gin/work/Hilbras/OmniHilbras/src/app/layout.js"],"global-error":[j,"next/dist/client/components/builtin/global-error.js"],"not-found":[k,"next/dist/client/components/builtin/not-found.js"],forbidden:[l,"next/dist/client/components/builtin/forbidden.js"],unauthorized:[m,"next/dist/client/components/builtin/unauthorized.js"],metadata:{icon:[async a=>(await (0,d.p)(()=>Promise.resolve().then(c.bind(c,70440)))()).default(a)],apple:[],openGraph:[],twitter:[],manifest:"/manifest.webmanifest"}},[]]}.children,p=(0,e.H)({tree:o,page:"/login/page",pathname:"/login",require:c,loadChunk:()=>Promise.resolve(),interopDefault:f.T}),q=p.__next_app__,r=p.routeModule,s=p.handler}};var b=require("../../webpack-runtime.js");b.C(a);var c=b.X(0,[2970,1260,2430,3031,2116,4785,4043,6070,1329,915,6457,4123,3799,6777,412],()=>b(b.s=95078));module.exports=c})();
|