@atmyapp/astroPreviews, metadata, and forms for Astro

Content your clients can edit. Code that stays yours.

Define what's editable in a TypeScript schema, migrate it with one command, and read it from any framework. Your client gets the editor, forms, and analytics.

~/bistro-roma
bistro-roma $
  • Works with
  • Astro
  • Next.js
  • Vite
  • SvelteKit
  • Any JavaScript site

From schema to handoff in four steps

No theme to fight and no admin panel to configure. You set the rules in code; AtMyApp handles the editing.

  1. 1

    atmyapp.schema.ts

    headline: s.string({ max: 80 }),

    cover: s.image(),

    Define the content

    Describe what's editable in one TypeScript file.

  2. 2
    $ npx atmyapp migrateUploaded 3 definitions

    Migrate it

    The CLI validates the schema and uploads it to your project.

  3. 3

    Fresh pasta, made every morning

    Render it your way

    Read typed content and render it with your own components.

  4. 4

    Add cacio e pepe to the lunch menu

    Published

    Hand it over

    Your client edits and publishes. You get back to building.

A clean line between code and content.

You write the rules once. Your client asks for changes in plain words, and the assistant can only change what your schema allows.

You ownSchema, components, rendering, and deploys

atmyapp.schema.tsyour repo
import { defineSchema, defineDocument, defineCollection, s }  from "@atmyapp/structure"; export default defineSchema({  definitions: {    home: defineDocument({      path: "home.json",      fields: {        headline: s.string({ max: 80 }),        introduction: s.longText({ optional: true }),      },    }),    dishes: defineCollection({      fields: {        name: s.string(),        price: s.number({ min: 0 }),        vegetarian: s.boolean(),      },    }),  },});

Your client managesCopy, images, entries, and publishing

Bistro Roma · Assistant
  1. 1

    Client asks

    Change the headline to “Fresh pasta, made every morning”
  2. 2

    Checked against your schema

    home › headline

    s.string({ max: 80 })

  3. 3

    Change ready to publish

    Handmade pasta since 1998

    Fresh pasta, made every morning

    PreviewPublish

Every field maps to an input clients understand.

Pick a builder, add limits and a description. AtMyApp renders the right control for your client and validates every value before it's published.

Fresh pasta, daily
s.string()Text
s.longText()Long text
s.markdown()Markdown
s.image()Image
s.gallery()Gallery
Cacio e pepe
s.reference()Reference
/menu/cacio-e-pepe
s.slug()URL slug
LunchDinnerBoth
s.enum()Choice
Vegetarian
s.boolean()Toggle
12 Oct 2026
s.date()Date
FirstSecond
s.order()Ordering
s.array()List

Also: number, email, url, datetime, object, union, file, and mdx. Mark any text field with localize: true for translations.Field reference

Keep your framework. Add content in a few files.

One schema, one client, and your own components. Pick a framework to see the files you'd add.

Astro setup guide

bistro-roma › src/pages › index.astro

---import { getAtMyApp } from "@atmyapp/astro/server";import schema from "../../atmyapp.schema"; const ama = getAtMyApp(Astro, { schema });const home = await ama.storage.getValue("home");--- <h1>{home.headline}</h1><p>{home.introduction}</p>
Astro@atmyapp/astro

Choose when content loads.

Read content in the browser, on the server, or at build time. The schema and the client's workflow stay the same.

  1. Published
  2. Next read
  3. Live

Browser rendering

The SDK runs in the visitor's browser and reads content on the fly.

Edits appear
On the next read
Good for
Client-side apps and widgets
  1. Published
  2. Next request
  3. Live

Server rendering

The SDK runs in your request handler, with a preview-aware client per request.

Edits appear
On the next request
Good for
Pages that change often
  1. Published
  2. Rebuild
  3. Deploy
  4. Live

Static generation

The SDK runs during your build. A failed read can fail the build instead of shipping empty pages.

Edits appear
After a rebuild and deploy
Good for
Fast sites with a rebuild hook

The rest of the site, already wired up.

Forms, previews, translations, and analytics come from the same schema and SDK. No extra services to connect for each client.

Forms

Define a submission type and messages land in your client's inbox. Static HTML forms work without JavaScript.

contact: defineSubmission({ … })

Previews

Clients check drafts on your real templates before anything is published.

searchParams.get("amaPreviewKey")

Localization

Mark text fields as localized. Your site keeps control of locale routing.

title: s.string({ localize: true })

Analytics

Track custom events alongside the visitor stats your client already sees.

signup: defineEvent({ … })

Start building

Make one page editable. Then hand it over.

Install the packages, connect the CLI to your project, and migrate your first schema.

Source and SDKs on GitHub

Frequently asked questions.

Answers to what developers usually ask before their first integration. Can't find yours? We're just an email away.

Still have questions?

contact@atmyapp.com

Yes. The public website API key is designed for SDK reads and permitted website operations, so it can live on the server, in the build, or in the browser.

Keep your CLI token private. It's for schema uploads and belongs in your local session or protected CI.

Let's talk

Your next project.
See what's possible.

Walk through the integration, explore the developer tools, and see how your clients can manage their own content.

  • A walkthrough tailored to your needs
  • Answers to your questions, from our team
  • No commitment. Just a conversation.
contact@atmyapp.com

Book your demo

Leave your email and we'll find a time that works for you.

We'll use your email to arrange the demo and answer your questions.