agentleFS
astriaaiastriaai/skills/landing-page-editor/SKILL.md

landing-page-editor

Skill2 starsChanged 27 days agoMITView on GitHub

Use when editing, updating, or iterating on a workspace's landing page HTML (the magazine-style /w/:slug page). Supports incremental edits — fetch the current HTML, make targeted changes, then write it back. NOT for initial generation — that comes from the `brief` field which runs the server-side LANDING_PAGE_PROMPT against Gemini.

The file

Show its rules and text

We split this skill into the rules it gives an agent

13 rules. About 0 are common, 1 is distinctive, and 12 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈1

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 12

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Use get_workspace with the destination workspace id to read the current HTML and update_workspace with that same id and landing_page_html …

    line 19
  2. Very specific:

    Use brief only for an explicitly requested full regeneration.

    line 23
  3. Very specific:

    When editing, preserve these invariants (the live /w/:slug page depends on them):

    line 27
  4. Very specific:

    Every image / video is wrapped in an <a> tag

    line 32
  5. Distinctive:

    Never use data URIs or embedded image data in HTML or CSS (including base64 images and inline SVG images).

    line 34
  6. Very specific:

    Call get_workspace and retain landing_page_html unchanged as the starting point.

    line 43
  7. Very specific:

    Use list_templates, list_references, and list_prompts with their declared schemas.

    line 48
  8. Very specific:

    Before inserting a supplied image into the page, call attach_workspace_images with id set to the destination workspace ID, image_urls …

    line 53
  9. Very specific:

    Use the returned images[].url values in the HTML.

    line 64
  10. Very specific:

    Call update_workspace with the complete landing_page_html and a fresh idempotency_key.

    line 76
  11. Very specific:

    Only when the user explicitly asks for a full redesign — submit a brief and the server runs LANDING_PAGE_PROMPT against Gemini, overwriting …

    line 83
  12. Very specific:

    Call update_workspace with the requested brief and a fresh idempotency_key.

    line 86
  13. Very specific:

    Read the resulting HTML with get_workspace and verify the result.

    line 89

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Workspace Landing Page Editor

The workspace landing page (rendered at /w/:slug) is a single self-contained HTML blob stored on workspace.landing_page_html. It is generated from scratch by the server-side LANDING_PAGE_PROMPT whenever a brief is submitted — that path overwrites the HTML wholesale.

For ANY change that should not regenerate the whole page (typography tweaks, layout edits, adding a section, changing copy, swapping an image, fixing a tagline), edit the HTML directly and write it back. Do NOT send a brief unless the user wants a full regeneration.

Use get_workspace with the destination workspace id to read the current HTML and update_workspace with that same id and landing_page_html to save edits. For embedded agents, omit the optional workspace scope to inherit the current chat scope unless the user explicitly requested another destination. Use brief only for an explicitly requested full regeneration.

Constraints carried over from LANDING_PAGE_PROMPT

When editing, preserve these invariants (the live /w/:slug page depends on them):

  • The output is inner body HTML — no <html>, <head>, <body>, or <!DOCTYPE> tags
  • Styling uses Tailwind utility classes (already loaded on the page). Use <style> only for hover/animation effects Tailwind can't express
  • Pack links are exactly /p/{slug}; model/reference links use the link field from the tunes JSON verbatim (do NOT re-encode %5B/%5D)
  • Every image / video is wrapped in an <a> tag
  • Image and video URLs must be ones that already exist — do not invent URLs
  • Never use data URIs or embedded image data in HTML or CSS (including base64 images and inline SVG images). Use hosted HTTPS image URLs from Astria workspace attachments instead.
  • Videos use <video autoplay muted loop playsinline poster="POSTER_URL"><source src="VIDEO_URL" type="video/mp4"></video>
  • The string __TUNES_JSON_PAYLOAD__ inside <script type="application/json" id="tunes-data">…</script> is a server-side placeholder. The server substitutes it at render time with the live tunes JSON. Never replace it with literal JSON — that freezes the cast and newly added tunes won't appear
  • Editorial styling: serif headlines, generous whitespace, hairline rules, object-cover object-[center_top] on portrait images, max-h-[70vh] on hero spreads, aspect-[4/5] or aspect-[3/4] on portrait containers

Workflow

1. Fetch the current landing page HTML

Call get_workspace and retain landing_page_html unchanged as the starting point. Preview the rendered page at /w/{slug}.

2. Read data needed for the edit

Use list_templates, list_references, and list_prompts with their declared schemas. Read only the requested workspace. Use limit/offset pagination as needed.

3. Upload and attach images with Astria

Before inserting a supplied image into the page, call attach_workspace_images with id set to the destination workspace ID, image_urls containing the supplied HTTPS URLs, and a fresh idempotency_key. This includes Astria direct-upload URLs: putting a URL in HTML does not attach its blob, and unattached uploads can be purged. For local files, use Astria's create_upload tool to prepare the upload, execute its returned upload command, and verify it succeeds before passing the returned blob_signed_id to attach_workspace_images in its signed_ids array. create_upload only prepares an upload slot; it does not upload or attach the image itself. Never attach a pending upload or embed image bytes in the page.

The tool reuses Astria blobs and imports external images into workspace storage. Use the returned images[].url values in the HTML. If attachment fails, resolve the error before saving HTML that uses those images. Images already listed in get_workspace.images need no attachment call. Do not create a reference or a generation merely to retain a landing-page image.

4. Make the incremental edit

Preserve unrelated HTML and the constraints above. Save a working text file only if helpful; do not substitute a filename for the HTML tool argument.

5. Save and verify

Call update_workspace with the complete landing_page_html and a fresh idempotency_key. Do not pass brief. Read it back with get_workspace and verify the saved change, confirm the new images appear in images, and check the rendered page when browser access is available.

Regenerating from scratch

Only when the user explicitly asks for a full redesign — submit a brief and the server runs LANDING_PAGE_PROMPT against Gemini, overwriting the HTML:

Call update_workspace with the requested brief and a fresh idempotency_key. Attach supplied images using step 3 before submitting the brief, so the generator receives them as workspace assets. Read the resulting HTML with get_workspace and verify the result.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.