import "./index.css" import { createAsync, query } from "@solidjs/router" import { Title, Meta } from "@solidjs/meta" import { For, createMemo, createSignal, onCleanup, onMount } from "solid-js" //import { HttpHeader } from "@solidjs/start" import goLogoLight from "../../asset/go-ornate-light.svg" import goLogoDark from "../../asset/go-ornate-dark.svg" import { EmailSignup } from "~/component/email-signup" import { Faq } from "~/component/faq" import { Legal } from "~/component/legal" import { Footer } from "~/component/footer" import { Header } from "~/component/header" import { config } from "~/config" import { getLastSeenWorkspaceID } from "../workspace/common" import { IconMiniMax, IconMiMo, IconZai, IconAlibaba, IconDeepSeek } from "~/component/icon" import { useI18n } from "~/context/i18n" import { useLanguage } from "~/context/language" import { LocaleLinks } from "~/component/locale-links" const checkLoggedIn = query(async () => { "use server" return await getLastSeenWorkspaceID().catch(() => undefined) }, "checkLoggedIn.get") const models = [ { name: "GLM-5.1", provider: "DeepInfra, Fireworks AI, Z.ai" }, { name: "GLM-5", provider: "DeepInfra, Fireworks AI, Z.ai" }, { name: "Kimi K2.5", provider: "Moonshot AI" }, { name: "Kimi K2.6", provider: "Moonshot AI" }, { name: "MiMo-V2-Pro", provider: "Xiaomi MiMo" }, { name: "MiMo-V2-Omni", provider: "Xiaomi MiMo" }, { name: "MiMo-V2.5-Pro", provider: "Xiaomi MiMo" }, { name: "MiMo-V2.5", provider: "Xiaomi MiMo" }, { name: "Qwen3.5 Plus", provider: "Alibaba Cloud Model Studio" }, { name: "Qwen3.6 Plus", provider: "Alibaba Cloud Model Studio" }, { name: "MiniMax M2.7", provider: "MiniMax" }, { name: "MiniMax M2.5", provider: "MiniMax" }, { name: "DeepSeek V4 Pro", provider: "DeepSeek" }, { name: "DeepSeek V4 Flash", provider: "DeepSeek" }, ] function LimitsGraph(props: { href: string }) { let root!: HTMLElement const [visible, setVisible] = createSignal(false) const i18n = useI18n() onMount(() => { if (typeof IntersectionObserver === "undefined") return setVisible(true) const observer = new IntersectionObserver( (entries) => { const entry = entries[0] if (!entry?.isIntersecting) return setVisible(true) observer.disconnect() }, { threshold: 0.35 }, ) observer.observe(root) onCleanup(() => observer.disconnect()) }) const free = 200 const graph = [ { id: "glm-5.1", name: "GLM-5.1", req: 880, d: "100ms" }, { id: "kimi-k2.6", name: "Kimi K2.6 (3x usage)", req: 3450, baseReq: 1150, d: "150ms" }, { id: "mimo-v2.5-pro", name: "MiMo-V2.5-Pro", req: 1290, d: "150ms" }, { id: "qwen3.6-plus", name: "Qwen3.6 Plus", req: 3300, d: "280ms" }, { id: "minimax-m2.7", name: "MiniMax M2.7", req: 3400, d: "300ms" }, { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", req: 3450, d: "200ms" }, { id: "qwen3.5-plus", name: "Qwen3.5 Plus", req: 10200, d: "360ms" }, { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", req: 31650, d: "340ms" }, ] const w = 720 const h = 330 const left = 40 const right = 60 const top = 18 const bottom = 44 const plot = w - left - right const ratio = (n: number) => n / free const rmax = Math.max(1, ...graph.map((m) => ratio(m.req))) const log = (n: number) => Math.log10(Math.max(n, 1)) const base = 24 const p = 2.2 const x = (r: number) => left + base + Math.pow(log(r) / log(rmax), p) * (plot - base) const start = (x(1) / w) * 100 const ticks = [1, 5, 10, 25, 50, 100].filter((t) => t <= rmax) const labels = (() => { const set = new Set() let last = -Infinity for (const t of ticks) { if (t === 1) { set.add(t) last = x(t) continue } const pos = x(t) if (pos - last < 44) continue set.add(t) last = pos } return set })() const shown = ticks.filter((t) => labels.has(t)) const bh = 8 const gap = 20 const step = bh + gap const sep = bh + 40 const fy = top + 22 const gy = (i: number) => fy + sep + step * i const my = graph.length < 2 ? gy(0) : (gy(0) + gy(graph.length - 1)) / 2 const px = (n: number) => `${(n / w) * 100}%` const py = (n: number) => `${(n / h) * 100}%` const lx = px(left - 16) const ty = py(h - 18) return (
{i18n.t("go.graph.label")} {i18n.t("go.graph.usageLimits")}
) } export default function Home() { const workspaceID = createAsync(() => checkLoggedIn()) const subscribeUrl = createMemo(() => (workspaceID() ? `/workspace/${workspaceID()}/go` : "/auth")) const i18n = useI18n() const language = useLanguage() return (
{/**/} {i18n.t("go.title")}
{i18n.t("home.banner.badge")}
{i18n.t("go.banner.text")}

{i18n.t("go.pricing.body")}

{i18n.t("go.problem.title")}

{i18n.t("go.problem.body")}

{i18n.t("go.problem.subtitle")}

  • [*] {i18n.t("go.problem.item1")}
  • [*] {i18n.t("go.problem.item2")}
  • [*] {i18n.t("go.problem.item3")}
  • [*] {i18n.t("go.problem.item4")}

{i18n.t("go.how.title")}

{i18n.t("go.how.body")}

{i18n.t("common.faq")}

  • {i18n.t("go.faq.a1")}
  • {i18n.t("go.faq.a2")}
    {(m) => ( )}
    {i18n.t("workspace.models.table.model")} {i18n.t("workspace.providers.table.provider")}
    {m.name} {m.provider}
  • {i18n.t("go.faq.a9")}
  • {i18n.t("go.faq.a3")}
  • {i18n.t("go.faq.a4.p1.beforePricing")}{" "} {i18n.t("go.faq.a4.p1.pricingLink")}{" "} {i18n.t("go.faq.a4.p1.afterPricing")} {i18n.t("go.faq.a4.p2.beforeAccount")}{" "} {i18n.t("go.faq.a4.p2.accountLink")}. {i18n.t("go.faq.a4.p3")}
  • {i18n.t("go.faq.a5.body")}
  • {i18n.t("go.faq.a6")}
  • {i18n.t("go.faq.a7")}
  • {i18n.t("go.faq.a8")}
) }