Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 24 additions & 2 deletions i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"notIncludedLabel": "Not included",
"notIncluded": {
"0": "Inference service access (GPUs)",
"1": "Workspaces and app deployment",
"1": "An included workspace (workspace slots are sold separately)",
"2": "API key for model calls"
},
"faqUpgradeQ": "How do I move to the inference plan later?",
Expand Down Expand Up @@ -410,12 +410,30 @@
"3,000M token allowance per billing period",
"400M tokens per rolling 4h window: the limit a coding agent reaches first",
"1M context · 10 concurrent requests",
"One free Micro workspace (1 vCPU · 2 GiB RAM · 10 GiB disk)",
"Everything in nan_member",
"Access switches on a few minutes after payment"
],
"premiumCond": "GLM 5.3 premium (200€/mo) is offered to members as seats open. Join the waitlist and we will flag you for this tier.",
"premiumCta": "Join the waitlist",
"premiumBadge": "glm 5.3 · premium"
"premiumBadge": "glm 5.3 · premium",
"workspaces": {
"label": "workspaces · add-on",
"title": "Your own cloud machine.",
"sub": "A dedicated, isolated dev box reachable over SSH and from the browser, with Pi, Hermes, gentle-shell and Herdr ready to use. Any paying member can buy slots; each slot keeps one workspace running.",
"per": "/mo",
"headSize": "size",
"headSpecs": "vCPU · RAM · disk",
"headSlot": "slot",
"headBackups": "daily backups",
"notes": [
"Premium (200€) includes one free Micro workspace.",
"Slots pay for the machine only. Agents use NaN inference only on an inference plan (70€ or 200€).",
"Backups are optional: one snapshot a day, kept 7 days, restore it yourself.",
"Monthly, billed in euros. Cancel a slot anytime."
],
"cta": "Read the workspaces guide"
}
},
"who": {
"label": "who's behind",
Expand Down Expand Up @@ -471,6 +489,10 @@
"q": "Can I train models?",
"a": "No. NaN is inference, not training. The GPUs are optimized to run existing models at high speed, not for fine-tuning."
},
{
"q": "What is a workspace?",
"a": "Your own cloud machine for development: a dedicated, isolated box you reach over SSH or from the browser, with coding agents such as Pi and Hermes ready to use. Any paying member can buy workspace slots from 4,99€ a month, and the premium plan includes one free Micro workspace. A slot does not include inference: agents use NaN models only on an inference plan. The workspaces guide in the docs has sizes, prices, network rules and how backups work."
},
{
"q": "What payment methods do you accept?",
"a": "Credit or debit card. New memberships are billed in euros from any region, taxes included; subscriptions opened earlier in US dollars keep their original price. No commitment: cancel anytime."
Expand Down
26 changes: 24 additions & 2 deletions i18n/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"notIncludedLabel": "Qué NO incluye",
"notIncluded": {
"0": "Acceso al servicio de inferencia (GPUs)",
"1": "Workspaces y despliegue de apps",
"1": "Un workspace incluido (los slots de workspace se venden aparte)",
"2": "API key para llamadas a modelos"
},
"faqUpgradeQ": "¿Cómo paso al plan de inferencia más adelante?",
Expand Down Expand Up @@ -410,12 +410,30 @@
"Asignación de 3.000M de tokens por periodo de facturación",
"400M de tokens por ventana deslizante de 4h: el límite que un agente de código alcanza primero",
"Contexto de 1M · 10 peticiones en paralelo",
"Un workspace Micro gratis (1 vCPU · 2 GiB de RAM · 10 GiB de disco)",
"Todo lo incluido en nan_member",
"El acceso se activa pocos minutos después del pago"
],
"premiumCond": "GLM 5.3 premium (200€/mes) se ofrece a miembros según haya plazas. Únete a la waitlist y te marcaremos para este tier.",
"premiumCta": "Únete a la waitlist",
"premiumBadge": "glm 5.3 · premium"
"premiumBadge": "glm 5.3 · premium",
"workspaces": {
"label": "workspaces · complemento",
"title": "Tu propia máquina en la nube.",
"sub": "Una máquina de desarrollo dedicada y aislada, accesible por SSH y desde el navegador, con Pi, Hermes, gentle-shell y Herdr listos para usar. Cualquier miembro de pago puede comprar slots; cada slot mantiene un workspace en marcha.",
"per": "/mes",
"headSize": "tamaño",
"headSpecs": "vCPU · RAM · disco",
"headSlot": "slot",
"headBackups": "backups diarios",
"notes": [
"Premium (200€) incluye un workspace Micro gratis.",
"Los slots pagan solo la máquina. Los agentes usan la inferencia de NaN solo con un plan de inferencia (70€ o 200€).",
"Los backups son opcionales: una instantánea al día, guardada 7 días, y la restauras tú.",
"Mensual, se factura en euros. Cancela un slot cuando quieras."
],
"cta": "Lee la guía de workspaces"
}
},
"who": {
"label": "quién está detrás",
Expand Down Expand Up @@ -471,6 +489,10 @@
"q": "¿Puedo entrenar modelos?",
"a": "No. NaN es inferencia, no entrenamiento. Las GPUs están optimizadas para correr modelos existentes a alta velocidad, no para fine-tuning."
},
{
"q": "¿Qué es un workspace?",
"a": "Tu propia máquina en la nube para desarrollar: una máquina dedicada y aislada a la que entras por SSH o desde el navegador, con agentes de código como Pi y Hermes listos para usar. Cualquier miembro de pago puede comprar slots de workspace desde 4,99€ al mes, y el plan premium incluye un workspace Micro gratis. Un slot no incluye inferencia: los agentes usan los modelos de NaN solo con un plan de inferencia. La guía de workspaces de la documentación tiene los tamaños, los precios, las reglas de red y cómo funcionan los backups."
},
{
"q": "¿Qué métodos de pago aceptáis?",
"a": "Tarjeta de crédito o débito. Las altas nuevas se facturan en euros desde cualquier región, impuestos incluidos; las suscripciones abiertas antes en dólares mantienen su precio original. Sin compromiso: cancela cuando quieras."
Expand Down
Binary file added public/docs/workspaces/create-1-name-ssh.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/docs/workspaces/create-2-agents.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/docs/workspaces/create-3-config.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/docs/workspaces/phone-02-generate-key.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/docs/workspaces/phone-03-add-ssh-key.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/docs/workspaces/phone-05-host-address.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/docs/workspaces/phone-07-connected.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/docs/workspaces/phone-09-herdr-phone.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
54 changes: 54 additions & 0 deletions src/components/docs/Screenshot.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
---
/**
* A product screenshot with a caption.
*
* A component rather than raw `<figure>`/`<img>` in the MDX: the text extractor
* (src/lib/mdxToText.ts) only understands headings and a handful of inline
* tags, so raw block HTML would throw and take /api/docs down for the page.
* Here the extractor serves it as a markdown image plus an italic caption.
*
* Lazy and async like every other docs image, with its intrinsic size so the
* page does not reflow while it loads.
*/
interface Props {
src: string;
alt: string;
width: number;
height: number;
caption?: string;
/** A phone screen: shown narrower, the way it looks in the hand. */
variant?: 'default' | 'phone';
}

const { src, alt, width, height, caption, variant = 'default' } = Astro.props;
---

<figure class:list={['docs-shot', 'not-prose', { 'docs-shot--phone': variant === 'phone' }]}>
<img src={src} alt={alt} width={width} height={height} loading="lazy" decoding="async" />
{caption && <figcaption>{caption}</figcaption>}
</figure>

<style>
.docs-shot {
margin: 1.5rem 0 2.5rem;
}
.docs-shot img {
display: block;
width: 100%;
max-width: 640px;
height: auto;
border: 1px solid rgb(38 38 38 / 0.8);
border-radius: 0.75rem;
}
.docs-shot--phone img {
max-width: min(300px, 100%);
border-radius: 1.25rem;
}
.docs-shot figcaption {
margin-top: 0.75rem;
font-family: var(--font-mono, ui-monospace, monospace);
font-size: 12px;
line-height: 1.5;
color: rgb(163 163 163);
}
</style>
126 changes: 126 additions & 0 deletions src/components/nan/home/Pricing.astro
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,21 @@ const tiers = [
primary: false,
},
];

// Workspace slots, sold to any paying member (helmcode/nan workspaces launch).
// Sizes mirror cloud-api's tier catalogue (internal/workspace/tiers.go); the
// prices are the live EUR Stripe prices of the slot and of the backup add-on
// (cmd/stripe-bootstrap/workspace_backups.go). The premium plan's free
// workspace is the Micro size.
const workspaceSlots = [
{ size: 'micro', vcpu: 1, ram: 2, disk: 10, slot: '4,99€', backups: '0,99€' },
{ size: 'nano', vcpu: 2, ram: 4, disk: 20, slot: '8,99€', backups: '1,49€' },
{ size: 'basic', vcpu: 4, ram: 8, disk: 40, slot: '16,99€', backups: '2,49€' },
{ size: 'medium', vcpu: 8, ram: 16, disk: 80, slot: '32,99€', backups: '3,99€' },
{ size: 'large', vcpu: 8, ram: 32, disk: 160, slot: '60,99€', backups: '6,99€' },
];
const ws = tt.workspaces;
const wsDocs = lang === 'es' ? '/es/docs/workspaces' : '/docs/workspaces';
---

<section class="pricing" id="pricing">
Expand Down Expand Up @@ -98,6 +113,43 @@ const tiers = [
</article>
))}
</div>

<div class="pws" id="workspaces" data-reveal>
<div class="pws__head">
<span class="pws__label">{ws.label}</span>
<h3 class="pws__title">{ws.title}</h3>
<p class="pws__sub">{ws.sub}</p>
</div>

<div class="pws__tablewrap">
<table class="pws__table">
<thead>
<tr>
<th scope="col">{ws.headSize}</th>
<th scope="col">{ws.headSpecs}</th>
<th scope="col">{ws.headSlot}</th>
<th scope="col">{ws.headBackups}</th>
</tr>
</thead>
<tbody>
{workspaceSlots.map((row) => (
<tr>
<th scope="row">{row.size}</th>
<td>{row.vcpu} · {row.ram} GiB · {row.disk} GiB</td>
<td><strong>{row.slot}</strong><span class="pws__per">{ws.per}</span></td>
<td>+{row.backups}<span class="pws__per">{ws.per}</span></td>
</tr>
))}
</tbody>
</table>
</div>

<ul class="pws__notes">
{ws.notes.map((note) => <li>{note}</li>)}
</ul>

<a class="btn btn-ghost pws__cta" href={wsDocs}>{ws.cta}</a>
</div>
</div>
</section>

Expand Down Expand Up @@ -217,10 +269,84 @@ const tiers = [
min-height: 3em; /* reserva 2 líneas -> condición de altura igual en los 3 tiers */
}

/* Workspace slots: an add-on to the tiers above, so a table, not a fourth card. */
.pws {
max-width: 1080px;
margin: var(--space-16) auto 0;
padding: var(--space-8) var(--space-6);
border: 1px solid var(--color-line);
background: var(--color-surface);
}
.pws__label { font-family: var(--font-mono); font-size: 12px; color: var(--color-text-dim); }
.pws__title {
margin-top: var(--space-3);
font-family: var(--font-serif);
font-weight: 400;
color: var(--color-text);
font-size: clamp(28px, 3vw, 44px);
line-height: 1.05;
}
.pws__sub {
margin-top: var(--space-4);
max-width: 64ch;
color: var(--color-text);
font-size: 15px;
line-height: 1.6;
}
/* Only the table scrolls on a narrow phone, never the page. */
.pws__tablewrap { margin-top: var(--space-8); overflow-x: auto; }
.pws__table {
width: 100%;
border-collapse: collapse;
font-family: var(--font-mono);
font-size: 13px;
color: var(--color-text);
}
.pws__table th,
.pws__table td {
text-align: left;
padding: var(--space-3) var(--space-4) var(--space-3) 0;
border-bottom: 1px solid var(--color-line);
white-space: nowrap;
}
.pws__table thead th { font-weight: 400; color: var(--color-muted); font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; }
.pws__table tbody th { font-weight: 600; }
.pws__table strong { font-weight: 700; }
.pws__per { color: var(--color-text-dim); margin-left: 2px; }
.pws__notes {
list-style: none;
margin: var(--space-6) 0 0;
padding: 0;
display: grid;
gap: var(--space-2);
}
.pws__notes li {
position: relative;
padding-left: 18px;
font-size: 14px;
line-height: 1.5;
color: var(--color-text);
}
.pws__notes li::before {
content: '';
position: absolute;
left: 0;
top: 0.55em;
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--color-violet);
}
.pws__cta { margin-top: var(--space-6); }

@media (max-width: 900px) {
.pricing { padding-block: var(--space-16); }
}
@media (max-width: 640px) {
.ptier { min-height: 0; }
.pws { padding: var(--space-6) var(--space-4); }
.pws__table { font-size: 12px; }
.pws__table th,
.pws__table td { padding-right: var(--space-3); }
}
</style>
2 changes: 1 addition & 1 deletion src/content/docs-es/apps.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: Apps
description: Despliega tus apps desde GitHub a NaN Cloud en minutos.
order: 19
order: 20
group: Guías
---

Expand Down
2 changes: 1 addition & 1 deletion src/content/docs-es/examples.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: Ejemplos
description: Fragmentos de código para conectarte a la API de NaN con Python, Node.js, curl y más.
order: 18
order: 19
group: Guías
---

Expand Down
1 change: 1 addition & 0 deletions src/content/docs-es/intro.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,6 @@ Los límites van por API key — un tope de peticiones por minuto y un máximo d
- [CLI de NaN](/es/docs/nan-cli): la herramienta oficial de terminal, que además configura varias de ellas por ti.
- [Referencia de la API](/es/docs/api): todos los endpoints, campo a campo.
- [Modelos](/es/docs/models): las fichas técnicas y los límites.
- [Workspaces](/es/docs/workspaces): tu propia máquina en la nube, por SSH y en el navegador, con agentes de código listos para usar.
- [Ejemplos](/es/docs/examples): fragmentos en Python, Node.js y curl.
- Soporte: reporta incidencias en `#support` de Discord.
Loading
Loading