Jace

A simple CMS for the JSON in your repository

Add one file to your GitHub repository. Jace turns the content it lists into forms for you and your clients, and every save is a commit. No schema, no database, and your clients don't need GitHub.

Hello World

The post shown at the top of the blog.

content/posts/hello-world.json

No
reactdesign
Opened pull request #41
The change goes live once it's merged on GitHub.
View

How it works

One file in the repository decides what is editable. Everything after that happens in forms.

Add jace.json

Put jace.json at the root of the repository and list the folders and files people can edit.

Edit in forms

Each entry opens as a form. Fields come from the data itself, so there is no schema to write.

Save to GitHub

Review the diff and save. It lands as a commit, or as a pull request if the project asks for one.

What's included

Nothing to host and nothing to migrate. Your repository stays the source of truth.

Invite links

Share a link that expires after 1, 7 or 30 days. People sign in with Google, and you approve each one.

Scoped access

Collaborators see only what jace.json lists, and nothing else in the repository.

Commits or pull requests

Commit straight to the branch or open a pull request, set separately for you and for collaborators.

Reviewed changes

Edited fields stay marked until you save, and every save shows its diff first.

Keyboard first

⌘K opens every action. J and K move through lists.

History

Every edit and access change is logged per project, linked to its commit or pull request.

Why Jace

Compared with a hosted CMS, a git-based editor built into the site, or editing JSON on GitHub by hand.

  • Nothing is added to your site. Git-based editors usually ship an admin page, a build plugin or an SDK with the site. Jace is a separate app that reads one file, jace.json. Delete that file and the site is exactly as it was.
  • Your JSON stays your JSON. A save writes the data back with the indentation, line endings and final newline it had, so the diff shows the change and nothing else. A number too large to keep exact stops the save instead of being rounded.
  • No schema to write, or to keep in step. Fields come from the data itself. An empty list learns what it holds from the entries beside it. Rename a field in the JSON and the form follows.
  • Clients never see the whole repository. An invite link that expires, a Google sign-in, your approval. Collaborators reach the paths jace.json lists and no others, and the server checks that on every request, not just the interface.
  • Git stays in charge. Commit to the branch or open a pull request, chosen separately for you and for collaborators. A protected branch is reported as one. Every change is credited and logged, and conflicts are merged field by field.
  • Nothing to host, little to trust. Jace keeps accounts, projects, access and an activity log, and that is all. Your content lives in the repository only, so there is nothing to export when you leave.

jace.json

Commit it at the root of the repository. It lists what people can edit, and they see nothing else. Paths are relative to the root.

jace.json
{
"collections": [
{ "name": "Posts", "path": "content/posts" }
],
"files": [
{ "name": "Site settings", "path": "data/site.json" }
]
}
What your team sees

collections

A folder where every JSON file is one entry, like posts.

files

A single JSON document, like site settings.

Questions

The short version of how access and storage work.

Do the people I invite need a GitHub account?

No. They open your invite link, sign in with Google, and wait for you to approve them.

Where is my content stored?

In your repository, as the JSON files you already have. Jace keeps accounts, projects, access and an activity log.

Which repositories can I use?

Any repository you own on GitHub, or are an admin of in an organisation. Add it as a project and commit a jace.json at its root.

How is this different from Decap, Tina or Keystatic?

Those live inside your site: an admin route, a config file and often a build step. Jace is a separate app that reads one file. Nothing is added to the site's code, and it keeps working if you remove jace.json.

What happens if I stop using Jace?

Nothing changes. Your content was always in the repository as plain JSON. Remove jace.json, revoke Jace on GitHub, and you are done.

Start with one repository

Sign in with GitHub, add a project, and commit a jace.json.