Skip to content

The project file

A project can have a tessel.toml next to its code. It says which version of Tessel the project uses, and what the app says about itself: its name, version and author, its icon, and the kinds of files it opens. Tessel puts that wherever an app shows it: in the app bundle on macOS, in the .exe on Windows, in the About panel, and in appInfo() for the app’s own use.

tessel = "0.1.35"
[app]
name = "Tally"
id = "com.example.tally"
version = "1.2.0"
build = "42"
description = "Spreadsheets for surveyors"
author = "Example Surveys"
copyright = "© 2026 Example Surveys"
icon = "assets/icon.png"
category = "productivity"
[[app.documents]]
name = "Tally Workbook"
extensions = ["tly"]
[[app.documents]]
name = "Comma-separated values"
extensions = ["csv"]
role = "viewer"

Every part is optional; a project without a tessel.toml works as before. tessel new starts a project with one. Tessel looks for the file next to the program, then in the folders above it, so a project’s subfolders share it. Commit it with the code.

tessel = "0.1.35" makes the project use that version of Tessel, whatever version is installed: commands and editors hand the project’s work to it, installing it the first time. tessel pin writes this line for you, keeping the rest of the file.

The [app] table says what the app says about itself:

KeyWhat it isDefault
nameThe app’s name, as people see it: the app bundle’s and its menu’s name on macOS, the product name on Windows, the window’s title. It may have spaces.The app’s name in the code
idA name no other app has, written like a reversed web address: com.example.tally. macOS tells apps apart by it, so keep it the same from one version to the next.dev.tessel. and the name
versionThe version people see, like 1.2.0.1.0
buildA build number, for telling builds of one version apart.The version
descriptionWhat the app is, in a few words. Windows shows it in the file’s Details.—
authorWho makes the app: a person or a company.—
copyrightThe copyright notice, like © 2026 Example Surveys.—
iconA square PNG, relative to tessel.toml. See the app’s icon.icon.png next to the code
categoryWhere the App Store and Finder file the app: business, developer-tools, education, entertainment, finance, games, graphics-design, healthcare-fitness, lifestyle, medical, music, news, photography, productivity, reference, social-networking, sports, travel, utilities, video or weather.—

On macOS, tessel build --bundle writes these into the bundle’s Info.plist (and names the bundle after the app). On Windows, tessel build puts them in the .exe, where its Properties show them. The About panel (from the app’s menu on macOS) shows the name, version and copyright.

An [android] table names the key that signs the app’s Android packages:

[android]
keystore = "upload.jks"
key = "upload"

keystore is the keystore’s path, relative to tessel.toml, and key is the name (alias) of the key in it. Its password comes from the environment, never from this file. See Publishing on Google Play.

Each [[app.documents]] is a kind of file the app opens: its extensions (without the dot), a name for the kind, and its role: "editor" (the default) for files the app changes, "viewer" for ones it only shows. On macOS, Finder then offers the app for those files, and opens them with it; they come to the app’s .onOpenFile. Extensions listed in the code’s app Name(documentTypes: […]) are added to these.

appInfo() gives the app’s name, identifier, version, build, description, author and copyright, with the same defaults, for an About box of its own, or for telling a server which version is asking:

app Tally {
state about = false
VStack {
Button("About") { about = true }
if about {
let info = appInfo()
Text("{info.name} {info.version}")
Text(info.copyright)
}
}
}

A key Tessel doesn’t know, or a value it can’t use, is an error in every command, with where it is:

tessel: tessel.toml: TOML parse error at line 3, column 1
|
3 | verison = "1.0"
| ^^^^^^^
unknown field `verison`, expected one of `name`, `id`, `version`, `build`, …