@@ -90,72 +90,15 @@ function Detail({ useCase }: { useCase: UseCase }) {
9090 < p className = "ucd-scenario" > { useCase . scenario } </ p >
9191 </ header >
9292
93- { useCase . services . length > 0 && (
94- < section className = "ucd-section" >
95- < h2 > How to set it up</ h2 >
96- < p className = "ucd-section-lede" >
97- This scenario uses { useCase . services . length } { ' ' }
98- { useCase . services . length === 1 ? 'service' : 'services' } from instanode.dev.
99- Each is one HTTP call to provision — no signup, no Docker.
100- </ p >
101- < ol className = "ucd-steps" >
102- { useCase . services . map ( ( s , i ) => {
103- const info = SERVICE_INFO [ s ]
104- return (
105- < li key = { s } className = "ucd-step" >
106- < p className = "ucd-step-title" >
107- < span className = "ucd-step-num" > { i + 1 } .</ span > Provision { info . label }
108- </ p >
109- < p className = "ucd-step-gets" > { info . gets } </ p >
110- < pre className = "ucd-step-curl" > < code > { info . curl } </ code > </ pre >
111- </ li >
112- )
113- } ) }
114- < li className = "ucd-step" >
115- < p className = "ucd-step-title" >
116- < span className = "ucd-step-num" > { useCase . services . length + 1 } .</ span > Wire your agent or app to the returned connection URLs
117- </ p >
118- < p className = "ucd-step-gets" >
119- Every response includes a < code > connection_url</ code > (or < code > receive_url</ code > for
120- webhooks, < code > endpoint</ code > for storage) plus an < code > upgrade_jwt</ code > you can
121- hand to < code > /claim</ code > when you want to keep the resource past the 24-hour
122- anonymous window.
123- </ p >
124- </ li >
125- </ ol >
126- </ section >
127- ) }
128-
129- < section className = "ucd-section" >
130- < h2 > Why this is useful</ h2 >
131- < ul className = "ucd-bullets" >
132- < li >
133- < strong > Zero ceremony.</ strong > No signup, no API key, no Docker, no cloud account.
134- The first call returns a real resource in under a second.
135- </ li >
136- < li >
137- < strong > Anonymous-first.</ strong > The 24-hour anonymous tier is the trial — every
138- resource expires unless you claim it. No credit card needed to try.
139- </ li >
140- < li >
141- < strong > Real infrastructure, not a sandbox.</ strong > Every Postgres is a real
142- Postgres, every Redis a real Redis. Your code that works on instanode.dev works
143- against any standard hosted version when you migrate.
144- </ li >
145- < li >
146- < strong > Designed for agents.</ strong > Single HTTP calls fit in muscle memory for
147- LLM tool use. Predictable JSON responses, OpenAPI 3.1 spec at < code > /openapi.json</ code > .
148- </ li >
149- </ ul >
150- </ section >
151-
152- { useCase . body && (
153- < section className = "ucd-section ucd-section-custom" >
154- < h2 > Detail</ h2 >
155- < div className = "ucd-body" >
156- { renderMarkdown ( useCase . body , { baseHeading : 'h3' , keyPrefix : useCase . slug } ) }
157- </ div >
158- </ section >
93+ { useCase . body ? (
94+ < div className = "ucd-body" >
95+ { renderMarkdown ( useCase . body , { baseHeading : 'h2' , keyPrefix : useCase . slug } ) }
96+ </ div >
97+ ) : (
98+ /* Fallback for cases without a hand-authored body. Today every
99+ * case has one; this branch exists for resilience if a new
100+ * case ships in the content repo before its body is written. */
101+ < AutoDetail services = { useCase . services } />
159102 ) }
160103
161104 < footer className = "ucd-foot" >
@@ -172,6 +115,76 @@ function Detail({ useCase }: { useCase: UseCase }) {
172115 )
173116}
174117
118+ /* AutoDetail — fallback section block rendered only when a use case
119+ * ships without a hand-authored body. Lists the curls per service and
120+ * a generic value-prop bullet list — enough that the page is useful
121+ * even for an un-authored case. Once a body lands in the content repo
122+ * for the slug, this fallback is hidden and the body takes over. */
123+ function AutoDetail ( { services } : { services : Service [ ] } ) {
124+ return (
125+ < >
126+ { services . length > 0 && (
127+ < section className = "ucd-section" >
128+ < h2 > How to set it up</ h2 >
129+ < p className = "ucd-section-lede" >
130+ This scenario uses { services . length } { ' ' }
131+ { services . length === 1 ? 'service' : 'services' } from instanode.dev.
132+ Each is one HTTP call to provision — no signup, no Docker.
133+ </ p >
134+ < ol className = "ucd-steps" >
135+ { services . map ( ( s , i ) => {
136+ const info = SERVICE_INFO [ s ]
137+ return (
138+ < li key = { s } className = "ucd-step" >
139+ < p className = "ucd-step-title" >
140+ < span className = "ucd-step-num" > { i + 1 } .</ span > Provision { info . label }
141+ </ p >
142+ < p className = "ucd-step-gets" > { info . gets } </ p >
143+ < pre className = "ucd-step-curl" > < code > { info . curl } </ code > </ pre >
144+ </ li >
145+ )
146+ } ) }
147+ < li className = "ucd-step" >
148+ < p className = "ucd-step-title" >
149+ < span className = "ucd-step-num" > { services . length + 1 } .</ span > Wire your agent or app to the returned connection URLs
150+ </ p >
151+ < p className = "ucd-step-gets" >
152+ Every response includes a < code > connection_url</ code > (or < code > receive_url</ code > for
153+ webhooks, < code > endpoint</ code > for storage) plus an < code > upgrade_jwt</ code > you can
154+ hand to < code > /claim</ code > when you want to keep the resource past the 24-hour
155+ anonymous window.
156+ </ p >
157+ </ li >
158+ </ ol >
159+ </ section >
160+ ) }
161+
162+ < section className = "ucd-section" >
163+ < h2 > Why this is useful</ h2 >
164+ < ul className = "ucd-bullets" >
165+ < li >
166+ < strong > Zero ceremony.</ strong > No signup, no API key, no Docker, no cloud account.
167+ The first call returns a real resource in under a second.
168+ </ li >
169+ < li >
170+ < strong > Anonymous-first.</ strong > The 24-hour anonymous tier is the trial — every
171+ resource expires unless you claim it. No credit card needed to try.
172+ </ li >
173+ < li >
174+ < strong > Real infrastructure, not a sandbox.</ strong > Every Postgres is a real
175+ Postgres, every Redis a real Redis. Your code that works on instanode.dev works
176+ against any standard hosted version when you migrate.
177+ </ li >
178+ < li >
179+ < strong > Designed for agents.</ strong > Single HTTP calls fit in muscle memory for
180+ LLM tool use. Predictable JSON responses, OpenAPI 3.1 spec at < code > /openapi.json</ code > .
181+ </ li >
182+ </ ul >
183+ </ section >
184+ </ >
185+ )
186+ }
187+
175188function primaryCurl ( services : Service [ ] ) : string {
176189 if ( services . length === 0 ) return 'curl -X POST https://api.instanode.dev/db/new'
177190 return SERVICE_INFO [ services [ 0 ] ] . curl
@@ -221,9 +234,10 @@ function DetailStyles() {
221234 .ucd-bullets li { margin: 0 0 10px; }
222235 .ucd-bullets strong { color: var(--text); font-weight: 600; }
223236
224- .ucd-section-custom h3 { font-size: 18px; margin: 24px 0 8px; color: var(--text); }
225- .ucd-section-custom h4 { font-size: 15px; margin: 18px 0 6px; color: var(--text); }
226- .ucd-body { color: var(--text); font-size: 15px; line-height: 1.65; }
237+ .ucd-body { color: var(--text); font-size: 15px; line-height: 1.65; margin: 40px 0; }
238+ .ucd-body h2 { font-size: 22px; margin: 40px 0 14px; letter-spacing: -0.01em; color: var(--text); }
239+ .ucd-body h3 { font-size: 18px; margin: 24px 0 8px; color: var(--text); }
240+ .ucd-body h4 { font-size: 15px; margin: 18px 0 6px; color: var(--text); }
227241 .ucd-body p { margin: 0 0 14px; }
228242 .ucd-body code {
229243 background: var(--ink); border: 1px solid var(--border); color: var(--text);
0 commit comments