Upload App
Upload a new version of an application, including the binary file and relevant metadata. You can specify an updater type for artifact isolation when uploading files for updaters that generate special files.
Endpoint
POST /upload
Authentication
Header | Value |
---|---|
Authorization | Bearer <jwt_token> |
Request Body
The request uses multipart/form-data
format with the following fields:
Field | Type | Required | Description |
---|---|---|---|
file | file | ✅ | App binary file(s) |
app_name | string | ✅ | Name of the application |
version | string | ✅ | Version of the application |
channel | string | ❌ | Channel (e.g., stable, beta) |
publish | boolean | ❌ | Marks the version available for users |
critical | boolean | ❌ | Marks the version as critical |
platform | string | ❌ | Platform (e.g., linux, windows) |
arch | string | ❌ | Architecture (e.g., amd64, arm64) |
changelog | string | ❌ | Changelog in markdown format |
updater | string | ❌ | Updater type for artifact isolation (manual, squirrel_darwin, squirrel_windows, electron-builder, tauri) |
signature | string | ❌ | Cryptographic signature (required for Tauri updater) |
info
The updater
parameter is useful when uploading files for updaters that generate special files (like RELEASES for Squirrel Windows or *.yml for electron-builder). It ensures files are stored in isolated folders specific to that updater.
Example Requests
Single File Upload (Standard)
curl -X POST --location 'http://localhost:9000/upload' \
--header 'Authorization: Bearer <jwt_token>' \
--form 'file=@"/path_to_file/myapp.deb"' \
--form 'data="{\"app_name\":\"myapp\",\"version\":\"0.0.1\",\"channel\":\"stable\",\"publish\":true,\"platform\":\"linux\",\"arch\":\"amd64\",\"changelog\":\"### Changelog\\n\\n- Added new feature X\\n- Fixed bug Y\"}"'
Upload with Updater Parameter (Squirrel Windows)
curl -X POST --location 'http://localhost:9000/upload' \
--header 'Authorization: Bearer <jwt_token>' \
--form 'file=@"/path_to_file/myapp.exe"' \
--form 'file=@"/path_to_file/RELEASES"' \
--form 'data="{\"app_name\":\"myapp\",\"version\":\"0.0.1\",\"channel\":\"stable\",\"publish\":true,\"platform\":\"windows\",\"arch\":\"amd64\",\"updater\":\"squirrel_windows\",\"changelog\":\"### Changelog\\n\\n- Added new feature X\\n- Fixed bug Y\"}"'
Upload with Updater Parameter (Electron Builder)
curl -X POST --location 'http://localhost:9000/upload' \
--header 'Authorization: Bearer <jwt_token>' \
--form 'file=@"/path_to_file/myapp.exe"' \
--form 'file=@"/path_to_file/latest.yml"' \
--form 'data="{\"app_name\":\"myapp\",\"version\":\"0.0.1\",\"channel\":\"stable\",\"publish\":true,\"platform\":\"windows\",\"arch\":\"amd64\",\"updater\":\"electron-builder\",\"changelog\":\"### Changelog\\n\\n- Added new feature X\\n- Fixed bug Y\"}"'
Upload with Updater Parameter (Tauri)
curl -X POST --location 'http://localhost:9000/upload' \
--header 'Authorization: Bearer <jwt_token>' \
--form 'file=@"/path_to_file/myapp.app.tar.gz"' \
--form 'data="{\"app_name\":\"myapp\",\"version\":\"1.0.0\",\"channel\":\"stable\",\"publish\":true,\"platform\":\"darwin\",\"arch\":\"amd64\",\"updater\":\"tauri\",\"signature\":\"dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVUUzIzUGJLcHpQNHdCVEJzTXJjbWFhUUdUVEtaUGRLdGhWdGZJZkF2VmM0TzJGMkdPQUk4V1hzYWJuUUhWbWI2cTFWTkhEZE9lbkVwUERCQmhRPT0K\",\"changelog\":\"### Changelog\\n\\n- Added new feature X\\n- Fixed bug Y\"}"'
Multiple File Upload (Standard)
curl -X POST --location 'http://localhost:9000/upload' \
--header 'Authorization: Bearer <jwt_token>' \
--form 'file=@"/path_to_file/myapp.deb"' \
--form 'file=@"/path_to_file/myapp.rpm"' \
--form 'data="{\"app_name\":\"myapp\",\"version\":\"0.0.1\",\"channel\":\"stable\",\"publish\":true,\"platform\":\"linux\",\"arch\":\"amd64\",\"changelog\":\"### Changelog\\n\\n- Added new feature X\\n- Fixed bug Y\"}"'
Response
Success Response (200 OK)
{
"uploadResult.Uploaded": "6411c7c0ec4ff9a9a9bc18fa"
}
Response Fields
Field | Type | Description |
---|---|---|
uploadResult.Uploaded | string | The unique identifier (ID) of the uploaded version |
Updater-Specific File Organization
When you specify an updater
parameter, files are organized in isolated folders:
File Structure Examples
Standard Upload (No Updater):
/myapp/stable/linux/amd64/
├── myapp-0.0.1.deb
└── myapp-0.0.1.rpm
Squirrel Windows Upload:
/squirrel_windows/myapp/stable/windows/amd64/0.0.1/
├── myapp.exe
└── RELEASES
Electron Builder Upload:
/electron-builder/myapp/stable/windows/amd64/0.0.1/
├── myapp.exe
└── latest.yml
Supported Updater Types
Updater | Generated Files | Use Case | Special Requirements |
---|---|---|---|
manual | None | Standard FaynoSync uploads | None |
squirrel_darwin | None | Squirrel macOS applications | None |
squirrel_windows | RELEASES | Squirrel Windows applications | None |
electron-builder | *.yml | Electron applications | None |
tauri | None | Tauri applications with built-in updater | Requires signature field |
Notes
- You can upload multiple files for different platforms/architectures in a single request
- The
changelog
field supports markdown formatting - Critical versions are typically used for security updates or critical bug fixes
- Published versions are immediately available to end users
- The
channel
field helps organize releases (e.g., stable, beta, nightly) - File uploads support common package formats (.deb, .rpm, .exe, .dmg, etc.)
- Updater Parameter: Use the
updater
parameter when uploading files for updaters that generate special files (RELEASES, *.yml) - Artifact Isolation: Files uploaded with an updater parameter are stored in isolated folders to prevent conflicts
- File Organization: Generated files (RELEASES, *.yml) are properly organized when using updater-specific uploads
- Signature Field: When using Tauri updater, the
signature
field is required for cryptographic verification of updates. This signature is generated by Tauri's build process and ensures update integrity and authenticity.