The project file
A game you make here is yours, and so is the file it is kept in. Whole project, under Export & import in the editor, downloads all of it as a zip: the cards, how they are laid out, and every picture and font they use. This page says what is in that zip, so that a game can be printed, read by a script or taken to another tool without Card-a-mon. The examples are from the pond game the other guides follow.
What is in the zip
| project.json | The cards, their layouts and fields, the card size, the game's rules, and the list of the files below. The rest of this page is about it. |
|---|---|
| images/ | Every picture in the project's image library, in the format it was uploaded, drawn or picked in. |
| fonts/ | The fonts uploaded to the project, as TTF, OTF or WOFF files. |
| fonts/catalogue/ | The faces of Card-a-mon's own typefaces that the cards are set in, so that they can be drawn without Card-a-mon's font server. |
| emoji/ | The pictures of any emoji in the cards' text, as Twemoji SVGs. |
| print.html | A page that draws the cards into images for a print shop, from the zip, in any browser, with no connection. |
Printing without Card-a-mon
Open print.html, from the zip or after unzipping it, in a browser, and open the project's zip in it, or drop the zip on the page. It draws every card into images at the resolution you pick, with the same code the editor's image export uses, and it needs nothing but the browser: the code that draws the cards is inside the page, and the pictures and fonts are in the zip. A game kept as a zip can still be printed years from now, whether Card-a-mon is there or not.
project.json
project.json is the project exactly as the editor keeps it, with nothing made up for the export: what the file says is all there is to the cards. It is UTF-8 JSON. The pond game's starts like this, with some cards and fields left out (…):
{
"format": "card-a-mon-project",
"version": 2,
"name": "Who Eats Whom? Pond Chain",
"exportedAt": "2026-10-23T06:09:13.801Z",
"cardSet": {
"width": 63.5,
"height": 88.9,
"bleed": 3.175,
"isTwoSided": true,
"cardsAllIds": ["card-1", "card-2", "card-3", …, "card-13"],
"cardsById": {
"card-1": { "id": "card-1", "count": 2 },
"card-11": { "id": "card-11", "count": 1, "layoutId": "layout-4" },
…
},
"layouts": [
{
"id": "default",
"name": "Plant cards",
"fieldsAllIds": ["background", "cost", "title", "art", "type",
"rules", "flavour", "back", "back-title"]
},
…
{
"id": "layout-4",
"name": "Rules",
"fieldsAllIds": ["text", "page"],
"width": 88.9, "height": 127, "cut": "square", "isTwoSided": false
}
],
"fieldsAllIds": ["background", "cost", "title", …, "text", "page"],
"fields": {
"card-1": {
"title": {
"id": "title", "type": "text", "value": "Duckweed",
"x": 15.35, "y": 8.0375, "width": 46.65, "height": 4.125, "angle": 0,
"fontFamily": "Cinzel", "fontVariant": "700", "fontSize": 3.6,
"lineHeight": 1.1, "color": "#ffffff", "align": "left",
"isOnBack": false, "locked": true
},
"art": {
"id": "art", "type": "image",
"name": "duckweed.jpg",
"x": 6.95, "y": 15.65, "width": 55.95, "height": 36.138, "angle": 0,
"imageWidth": 1264, "imageHeight": 816,
"zoom": 0.0442867, "cx": -0.0142353, "cy": 0,
"description": "tiny floating green duckweed leaves covering a patch of still pond water",
"isOnBack": false, "locked": true
},
…
},
…
},
"game": {
"description": "A quick classroom card game about life in a pond. …",
"rules": "Competitive, 2 to 4 players, 10 minutes, ages 8 to 11.\n\n## Goal\n…"
}
},
"images": [
{
"name": "duckweed.jpg",
"file": "images/duckweed.jpg"
},
…
],
"fonts": [
{ "family": "Cinzel", "variant": "700", "file": "fonts/catalogue/Cinzel-700.ttf", "catalogue": true },
…
],
"emoji": []
}Units
- Lengths are in millimetres: the card size, the bleed, where fields are and their font sizes.
- A field's
xandyare its top-left corner, measured from the top-left corner of the card with its bleed. On a 63.5 × 88.9 mm card with 3.175 mm of bleed, a frame covering the whole printed area is at 0, 0, and is 69.85 × 95.25 mm. - Angles are in radians, clockwise, about the field's middle;
xandyare where its corner is before it is turned. - Colours are CSS hex colours, such as
#1a1a1a.
The top level
| format | Always card-a-mon-project. |
|---|---|
| version | 2. Version 1 had no fonts/catalogue/ and no emoji/; it imports the same. |
| name | The project's name. |
| exportedAt | When it was downloaded, as an ISO 8601 time. |
| cardSet | The cards: see below. |
| images | Every picture in the zip: its name, which the cards refer to it by, and its file in the zip. A picture from the icon library has credit: its author and licence. A picture marked as made with AI, as those drawn in Card-a-mon before it stopped drawing them were, has ai: the model and the prompt it was drawn from. |
| fonts | Every font in the zip: its family, its variant (regular, italic, 700, 700italic and so on) and its file. One with catalogue: true is one of Card-a-mon's own typefaces, there to draw the cards with; the others were uploaded to the project. |
| emoji | The emoji in the cards' text, each with the file of its picture. |
cardSet
| width, height | The cards' size where they are cut, in mm. |
|---|---|
| bleed | The margin printed round each card and cut away, in mm. The safe area for text is as far in from the cut. |
| cut | The cards' shape: none for rounded corners, or square, circle, hex or octagon. |
| isTwoSided | Whether the cards have backs. |
| snapStep | The editor's snapping grid in mm, when it is not the one picked for the size; 0 for none. |
| cardsAllIds | The cards' ids, in order. |
| cardsById | Each card by its id: its count, how many copies to print, and its layoutId when it is not of the first layout. |
| layouts | The designs the cards are of: see below. |
| fieldsAllIds | Every layout's fields' ids, each once. |
| fields | Each card's fields, by the card's id and then the field's: see below. |
| game | The game's brief: what it is about (description) and its rules (rules, in Markdown). |
Layouts
A layout has an id, a name and fieldsAllIds, its fields in the order they are drawn, bottom first. A card with no layoutId is of the one whose id is default, or else the first. A layout of another size than the project's — the pond game's rules pages — has its own width, height, bleed, cut and isTwoSided; without them it is the project's.
Fields
Every card has its own copy of each field of its layout, so fields holds a field once for each card. The editor keeps a field's place and style the same on every card of a layout, and lets each card have its own words or picture. A back is no separate thing: a field with isOnBack: true is on the back.
| Every field | |
|---|---|
| id | The field's id, the same on every card, and the column it is in a CSV of the cards. |
| type | text or image. |
| x, y, width, height | Where it is and how big, in mm from the corner of the bleed. |
| angle | How far it is turned, in radians. |
| isOnBack | Whether it is on the card's back. |
| locked | Kept from being moved, resized or deleted in the editor. |
| frozen | A background: clicked through in the editor, and changed only in what it shows. |
| shared, own | A shared field says or shows the same on every card of its layout; one with own is a card's own in a shared field. |
| A text field | |
|---|---|
| value | The card's words, as HTML. Bold is <b> and italic <i>; a new line is <br>, or <div> when it is aligned on its own; a colour is <font color>. A picture from images set among the words is written as its name in braces: Deal 2 {sword.svg}. |
| fontFamily, fontVariant | The typeface, from fonts or Card-a-mon's own, and its weight and style. |
| fontSize | The size of the text, in mm. |
| lineHeight | The space from line to line, as a multiple of the size. |
| color, align | Its colour, and left, center or right. |
| fontSizeOverride | This card's size, when it is not the field's: set by hand, or by shrinking to fit. |
| shrinkToFit, minFontSize | Whether the text shrinks on the cards it does not fit, and how far, in mm. |
| An image field | |
|---|---|
| name | The picture on this card, by its name in images; none for an empty field. |
| imageWidth, imageHeight | The picture's size in pixels. |
| zoom, cx, cy | How it is cropped. The picture is drawn zoom mm to a pixel, with its top-left corner cx, cy mm from the field's; what falls outside the field is not shown. |
| shape, cornerRadius | What the picture is seen through: none for the field's box, or rounded (with its corner radius in mm), ellipse, circle, hex or octagon. |
| description | The picture note: what the card's picture shows, or should, for whoever draws it. |
Reading it in a script
Nothing but a JSON reader is needed. In Python, the pond game's cards with their copies and titles:
import json
with open("project.json") as f:
project = json.load(f)
cards = project["cardSet"]
for card_id in cards["cardsAllIds"]:
title = cards["fields"][card_id].get("title", {}).get("value", "")
print(card_id, cards["cardsById"][card_id]["count"], title)card-1 2 Duckweed
card-2 2 Pondweed
card-3 2 Water Lily
card-4 2 Water Snail
…Download JSON only, beside Download zip, gives project.json on its own: small and readable, to keep in version control and compare from one version to the next.
Bringing it back
A zip, or a project.json with its pictures and fonts, imports into Card-a-mon again: as a new project with Import a project on your projects page, or over an open one in the Whole project dialog. A project.json changed by a script imports the same way, and so does the cardSet on its own, with no images or fonts listed. See the whole project as a file.
Where next
- Cards in a spreadsheet: Fill the cards in from a CSV file or a linked Google Sheet, and keep them there.
- Share and keep your work: A link that shows the cards to anybody, the history of every version, and the whole project as a file of your own.
All the guides. Questions or ideas: info@cardamon.lt.