f●
FOLIO RESUME STUDIO · YOUR STORY, YOURS

AI resume helper

Bring your own AI assistant into the writing process. Folio gives you a backup, a facts-only prompt, and the exact format to return your changes safely.

  1. 01

    Back up your resume

    Open the editor and choose Backup. Keep the downloaded JSON file somewhere you can find it.

    Open editor
  2. 02

    Edit with AI

    Give your backup and the prompt below to an AI assistant you trust. Review its edits before bringing the file back.

    The prompt asks for writing improvements while keeping your existing facts and backup data intact.

  3. 03

    Return and import

    Save the assistant’s result as a .json file. In Folio, choose Import backup and select it. The editor’s own validation is authoritative; invalid files are rejected before they can change your resume. Undo is available for resume changes.

    Return to editor
THE FILE FORMAT

Folio resume JSON Schema

This schema describes the complete canonical version 2 backup the AI should return. On import, Folio’s editor validation is authoritative and may normalize omitted fields from older backups.

VERSION 2
Inspect the complete schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "Folio Resume Backup, Version 2",
  "type": "object",
  "description": "This is the complete canonical version 2 backup output. On import, the editor may normalize omitted legacy fields and ignores unknown properties; editor validation is authoritative. Section IDs and block IDs must be unique; the editor checks block IDs across sections.",
  "required": ["schemaVersion", "name", "role", "email", "phone", "location", "website", "links", "photo", "sections", "design", "blockLibrary"],
  "properties": {
    "schemaVersion": {"const": 2},
    "name": {"$ref": "#/$defs/text"},
    "role": {"$ref": "#/$defs/text"},
    "email": {"$ref": "#/$defs/text"},
    "phone": {"$ref": "#/$defs/text"},
    "location": {"$ref": "#/$defs/text"},
    "website": {"$ref": "#/$defs/text"},
    "links": {"type": "array", "maxItems": 10, "description": "Additional header links. Preserve incomplete and unsafe drafts as text; the editor renders only complete labels and makes only absolute credential-free HTTP or HTTPS URLs clickable.", "items": {"$ref": "#/$defs/headerLink"}},
    "photo": {"type": "string", "maxLength": 1500000, "pattern": "^$|^data:image/(?:[Jj][Pp][Ee][Gg]|[Pp][Nn][Gg]|[Ww][Ee][Bb][Pp]);base64,(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$"},
    "sections": {"type": "array", "maxItems": 40, "description": "Section IDs are unique. x-uniqueBy documents the editor-enforced uniqueness check.", "x-uniqueBy": "id", "items": {"$ref": "#/$defs/section"}},
    "design": {"$ref": "#/$defs/design"},
    "blockLibrary": {"type": "array", "maxItems": 50, "items": {"$ref": "#/$defs/libraryEntry"}}
  },
  "$defs": {
    "text": {"type": "string", "maxLength": 20000},
    "headerLink": {"type": "object", "required": ["label", "url"], "additionalProperties": false, "description": "A header link draft. Both fields may be empty or partial; only a complete label and an absolute credential-free HTTP or HTTPS URL is clickable.", "properties": {"label": {"type": "string", "maxLength": 20000}, "url": {"type": "string", "maxLength": 20000, "description": "Only an absolute HTTP or HTTPS URL without embedded credentials (username or password) becomes clickable; other drafts are preserved as inert text."}}},
    "section": {
      "type": "object", 
      "required": ["id", "title", "column", "blockSpacing", "blocks"],
      "properties": {
        "id": {"type": "string", "minLength": 1, "maxLength": 20000},
        "title": {"$ref": "#/$defs/text"},
        "column": {"enum": ["main", "side"]},
        "blockSpacing": {"type": "number", "minimum": 0, "maximum": 48, "description": "Per-section margin below each block except the final block; defaults to 18 for older backups."},
        "blocks": {"type": "array", "maxItems": 100, "description": "Block IDs are unique within this section; the editor also checks uniqueness across the full resume.", "x-uniqueBy": "id", "items": {"$ref": "#/$defs/block"}}
      }
    },
    "block": {
      "type": "object", 
      "required": ["id", "title", "subtitle", "date", "location", "paragraph", "bullets", "icon", "style"],
      "properties": {
        "id": {"type": "string", "minLength": 1, "maxLength": 20000},
        "title": {"$ref": "#/$defs/text"}, "subtitle": {"$ref": "#/$defs/text"},
        "date": {"$ref": "#/$defs/text"}, "location": {"$ref": "#/$defs/text"},
        "paragraph": {"$ref": "#/$defs/text"},
        "bullets": {"type": "array", "maxItems": 200, "items": {"type": "string", "maxLength": 20000}},
        "icon": {"enum": ["none", "briefcase", "code", "book", "star", "award", "heart", "globe"]},
        "style": {"$ref": "#/$defs/blockStyle"}
      }
    },
    "blockStyle": {
      "type": "object", 
      "required": ["font", "titleColor", "subtitleColor", "textColor", "background", "bulletStyle", "border"],
      "properties": {
        "font": {"enum": ["inherit", "sans", "arial", "verdana", "trebuchet", "serif", "times", "mono"]},
        "titleColor": {"$ref": "#/$defs/colorOrEmpty"}, "subtitleColor": {"$ref": "#/$defs/colorOrEmpty"},
        "textColor": {"$ref": "#/$defs/colorOrEmpty"}, "background": {"$ref": "#/$defs/colorOrEmpty"},
        "bulletStyle": {"enum": ["inherit", "disc", "circle", "square", "dash", "arrow", "check", "decimal", "none"]},
        "border": {"enum": ["none", "line", "card"]}
      }
    },
    "colorOrEmpty": {"type": "string", "pattern": "^$|^#[0-9a-fA-F]{6}$"},
    "design": {
      "type": "object", 
      "required": ["template", "accent", "font", "size", "margin", "spacing", "lineHeight", "columns", "ratio", "background", "icons", "paper", "subtitleColor", "textColor", "bulletStyle", "headingStyle", "photoShape", "photoPosition", "photoSize"],
      "properties": {
        "template": {"enum": ["editorial", "classic", "modern"]},
        "accent": {"$ref": "#/$defs/color"}, "subtitleColor": {"$ref": "#/$defs/color"}, "textColor": {"$ref": "#/$defs/color"},
        "font": {"enum": ["sans", "arial", "verdana", "trebuchet", "serif", "times", "mono"]},
        "size": {"type": "number", "minimum": 8, "maximum": 13}, "margin": {"type": "number", "minimum": 20, "maximum": 64},
        "spacing": {"type": "number", "minimum": 8, "maximum": 36}, "lineHeight": {"type": "number", "minimum": 1.2, "maximum": 1.9},
        "columns": {"enum": [1, 2]}, "ratio": {"type": "number", "minimum": 50, "maximum": 75},
        "background": {"enum": ["clean", "tinted", "sidebar"]}, "icons": {"enum": ["minimal", "none", "classic"]},
        "paper": {"enum": ["a4", "letter"]}, "bulletStyle": {"enum": ["disc", "circle", "square", "dash", "arrow", "check", "decimal", "none"]},
        "headingStyle": {"enum": ["plain", "line", "band"]}, "photoShape": {"enum": ["auto", "circle", "rounded", "square"]},
        "photoPosition": {"enum": ["center", "top", "bottom"]}, "photoSize": {"type": "number", "minimum": 72, "maximum": 128}
      }
    },
    "color": {"type": "string", "pattern": "^#[0-9a-fA-F]{6}$"},
    "libraryEntry": {
      "type": "object",  "required": ["id", "name", "block"],
      "properties": {"id": {"$ref": "#/$defs/text"}, "name": {"type": "string", "minLength": 1, "maxLength": 20000}, "block": {"$ref": "#/$defs/block"}}
    }
  }
}

Folio does not send resume data to an AI service. You choose what file and prompt to share with an assistant.