Add TypeContent to your project
TypeContent is open source. You own the code: copy it, customize it, connect your own storage later. No hosted service required.
Option 1: CLIComing with the CLI package
npx typecontent init npx typecontent add editor
init detects your package manager, TypeScript and React, then writes typecontent.config.ts. add copies source into your project and never overwrites existing files unless you pass --force.
typecontent.config.ts
export default {
componentsDir: "./src/components/typecontent",
contentTypesDir: "./src/content-types",
blocksDir: "./src/components/typecontent/blocks",
};Option 2: PackagesPlanned — not on npm yet
npm install @typecontent/editor @typecontent/core
- @typecontent/core — Content model, domain types, adapter interfaces and an in-memory adapter.
- @typecontent/markdown — Dependency-free Markdown parser, serializer and editing commands.
- @typecontent/blocks — Block registry, built-in blocks and the callout custom block.
- @typecontent/seo — Deterministic SEO analyzer — no AI, no network.
- @typecontent/content-types — Blog, Page, Docs, Knowledge Base, Changelog, Course and defineContentType().
- @typecontent/editor — ContentEditor, toolbar, preview, slash commands, SEO and metadata panels.
Option 3: Copy source
Copy the editor source into your application. Everything runs on the client — no server-only modules, no Node APIs — so it works in Vite, Next.js and Cloudflare apps.
Blog integration
import { useState } from "react";
import { ContentEditor } from "@typecontent/editor";
import { blog } from "@typecontent/content-types";
export function BlogEditor() {
const [content, setContent] = useState({ title: "", markdown: "" });
// SEO analyzer runs live in the side panel
return (
<ContentEditor
contentType={blog}
value={content}
onChange={setContent}
showTypeSwitcher={false}
/>
);
}Docs integration
import { useState } from "react";
import { ContentEditor } from "@typecontent/editor";
import { docs } from "@typecontent/content-types";
export function DocsEditor() {
const [content, setContent] = useState({ title: "", markdown: "" });
// SEO analyzer runs live in the side panel
// Table of contents / navigation come from the content type's metadata
// Version + release date fields are enabled
return (
<ContentEditor
contentType={docs}
value={content}
onChange={setContent}
showTypeSwitcher={false}
/>
);
}Create your own content type
Six types ship built in. Case studies, recipes, job posts, FAQs — define anything with defineContentType. The editor stays the same; only configuration changes.
import { defineContentType } from "@typecontent/content-types";
import { ContentEditor } from "@typecontent/editor";
const caseStudy = defineContentType({
id: "case-study",
name: "Case Study",
features: { seo: true, featuredImage: true, author: true, publishDate: true },
metadataGroups: [
{
id: "project",
label: "Project",
fields: [
{ key: "client", label: "Client", kind: "text", feature: "author" },
{ key: "industry", label: "Industry", kind: "text", feature: "author" },
],
},
],
});
<ContentEditor contentType={caseStudy} showTypeSwitcher={false} />Connect storage
const adapter: ContentAdapter = {
create, get, update, delete: remove, list, publish, unpublish,
};Open source · License: TBD
TypeContent