{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"$schema":{"type":"string"},"version":{"default":1,"type":"number","const":1},"siteName":{"type":"string","minLength":1,"maxLength":120},"siteUrl":{"description":"Public URL of the blog, e.g. https://example.com","type":"string","maxLength":300,"format":"uri"},"contentDir":{"description":"Folder that holds the .mdx posts, relative to the repo root, e.g. content/blog","type":"string","minLength":1,"maxLength":200},"niche":{"description":"What the blog covers, in 1-3 sentences.","type":"string","minLength":1,"maxLength":2000},"audience":{"description":"Who the posts are written for.","type":"string","minLength":1,"maxLength":500},"domainTerms":{"description":"Product names and terms the AI must spell exactly.","maxItems":50,"type":"array","items":{"type":"string","minLength":1,"maxLength":120}},"voice":{"type":"object","properties":{"stance":{"description":"A concrete opinion the blog holds, written in first person.","type":"string","minLength":1,"maxLength":4000},"vocabulary":{"description":"Signature phrases the posts use.","maxItems":30,"type":"array","items":{"type":"string","minLength":1,"maxLength":120}},"persona":{"type":"string","enum":["expert","rebel","neighbor","enthusiast","professor","skeptic"]}}},"categories":{"description":"Category values the site already uses, exactly as they appear in frontmatter.","maxItems":200,"type":"array","items":{"type":"string","minLength":1,"maxLength":120}},"articleTypes":{"description":"Recurring article formats, e.g. How-to, Comparison, Deep dive.","maxItems":10,"type":"array","items":{"type":"string","minLength":1,"maxLength":120}},"coverStyle":{"type":"string","enum":["editorial_photo","minimal_illustration","bold_graphic","cinematic_atmosphere","hand_drawn","3d_render"]},"items":{"description":"Set only when posts recommend or compare things. Omit for editorial-only blogs.","type":"object","properties":{"kind":{"type":"string","enum":["products","games","tools","places","services","features","other"],"description":"Use features when posts document your own product."},"collectionName":{"type":"string","minLength":1,"maxLength":60,"description":"Plural name, e.g. Tools or Product features."},"source":{"description":"Where the items live in this repo. A .ts/.json/.csv file (add #exportName to pick one export), or dir/*.ts for one file per item. NichePressa imports it and re-syncs daily.","type":"string","minLength":1,"maxLength":300}},"required":["kind","collectionName"]},"frontmatter":{"description":"Map of frontmatter key to meaning, e.g. { \"publishedAt\": \"date\", \"heroImage\": \"coverUrl\" }.","type":"object","propertyNames":{"type":"string","pattern":"^[A-Za-z_][A-Za-z0-9_-]*$"},"additionalProperties":{"type":"string","enum":["title","description","date","category","tags","author","coverUrl","coverAlt","articleFormat"]}},"components":{"description":"MDX components the AI may use in articles.","maxItems":40,"type":"array","items":{"type":"object","properties":{"tag":{"type":"string","pattern":"^[A-Z][A-Za-z0-9]*$","description":"The JSX tag exactly as registered in the site's MDX components map."},"description":{"type":"string","minLength":1,"maxLength":2000,"description":"When the AI should use this component."},"usageGuidance":{"description":"Placement or frequency rules, e.g. 'At most one per article'.","type":"string","maxLength":1000},"props":{"default":[],"maxItems":30,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","pattern":"^[A-Za-z_][A-Za-z0-9_]*$"},"type":{"default":"string","type":"string","enum":["string","number","boolean","json","enum"]},"required":{"default":false,"type":"boolean"},"description":{"type":"string","minLength":1,"maxLength":500,"description":"What this prop controls."},"enumValues":{"description":"Allowed values when type is enum.","maxItems":50,"type":"array","items":{"type":"string","minLength":1,"maxLength":80}}},"required":["name","description"]}}},"required":["tag","description"]}}},"$id":"https://nichepressa.com/nichepressa.config.schema.json","title":"NichePressa repository config","description":"Tells NichePressa how this blog is set up. Docs: https://nichepressa.com/docs/agent-setup"}