CLI Reference Guide
After you mastered the basic concepts, you can come back to this page to learn what commands Odevio offers.
You can learn more about individual Odevio commands with odevio COMMAND --help.
odevio
Odevio lets your AI agent build and publish iOS apps for you - no Mac, no Xcode.
How does it work ?
The Odevio tool is composed of :
Odevio-Remote : The pre-configured build machines which handle the setup, build and release of your app
Odevio-cli : The CLI command line that works as an interface to start Odevio-Remote build machines
This reference guide only covers the Odevio-cli features.
Note
Odevio-Remotes are MacOS build machines on which the flutter build of your application is executed.
Usage:
odevio [OPTIONS] COMMAND [ARGS]...
Options
- --version
Show the version and exit.
odevio apikey
Manage your API keys.
API keys are used to authenticate to the Odevio API with external programs.
They also authenticate the CLI itself: set the ODEVIO_API_KEY environment variable and every
command runs without ever asking for credentials, which is what CI pipelines and automated tools need.
The environment variable takes precedence over the locally signed-in account.
Usage:
odevio apikey [OPTIONS] COMMAND [ARGS]...
odevio apikey ls
List your API keys.
Only the first 8 characters of the API key are shown. It is not possible to retrieve the full API key after it has been created.
odevio apikey ls [OPTIONS]
odevio apikey new
Create a new API key.
The key will only be shown once so be sure to copy it.
odevio apikey new [OPTIONS]
odevio apikey rm
Delete an API key.
You only need to provide the first 8 characters of the API key.
odevio apikey rm [OPTIONS] [KEY]
Arguments
- KEY
Optional argument
odevio app
Subcommands to manage your applications on Odevio.
odevio app [OPTIONS] COMMAND [ARGS]...
odevio app attach-build
Points the App Store page of the app with key “KEY” at an uploaded build.
Sending a build and choosing it for a version are two different things. Apple takes between a few minutes and half an hour to examine what was sent, and only then can it be attached — until then the page looks complete but cannot be submitted.
Rather than wait, this command can simply be run again: it either attaches a build or tells you what it is waiting for.
Usage:
odevio app attach-build [OPTIONS] [KEY]
Options
- --version <version>
Version of the build to attach. Defaults to the most recent usable one.
Arguments
- KEY
Optional argument
odevio app categories
Lists the App Store categories the app with key “KEY” can be filed under.
odevio app categories [OPTIONS] [KEY]
Arguments
- KEY
Optional argument
odevio app check-submittable
Asks Apple whether the App Store page of the app with key “KEY” is ready to submit.
This is Apple’s own verdict rather than ours, so it is the one to trust — including which screenshot sizes this particular app has to provide, which Apple states nowhere else.
It leaves a trace, which is why it is separate from store-status. The only way to obtain the
answer is to offer Apple the version, and that opens a review submission which cannot afterwards be
deleted. It is reused rather than duplicated, and becomes the submission the app is released with, so
run it when you mean to finish rather than to check on progress.
Nothing is submitted: the app is only offered for inspection. Sending it for review stays a separate, deliberate act.
Usage:
odevio app check-submittable [OPTIONS] [KEY]
Arguments
- KEY
Optional argument
odevio app import
Imports an app identifier from Apple Developer to Odevio.
odevio app import [OPTIONS]
Options
- --name <name>
Your app identifier name (e.g.: your app’s name)
- --bundle-id <bundle_id>
The bundle ID for your app on Apple (e.g.: com.company.appname)
- --account-key <account_key>
Odevio key to the Apple Developer Account
odevio app link
Links an app identifier to Odevio team with key “KEY”.
Warning
All users who are in a team linked to an Apple Developer Account have full control over it.
odevio app link [OPTIONS] [KEY]
Options
- --team-key <team_key>
Key of the team to link
Arguments
- KEY
Optional argument
odevio app ls
Lists the app identifiers to which the logged in user has access.
Example output:
Usage:
odevio app ls [OPTIONS]
odevio app mk
Creates a new app identifier.
..note: This will also create an app identifier with this bundle ID on your Developer Account. This allows us to verify the validity of your bundle ID
odevio app mk [OPTIONS]
Options
- --name <name>
Your app identifier name (e.g.: your app’s name)
- --bundle-id <bundle_id>
The bundle ID for your app on Apple (e.g.: com.company.appname)
- --account-key <account_key>
Odevio key to the Apple Developer Account
odevio app rm
Deletes the app identifier with key “KEY” from Odevio and on Apple if specified.
odevio app rm [OPTIONS] [KEY]
Options
- --delete-on-apple
Also delete the app identifier on Apple
Arguments
- KEY
Optional argument
odevio app screenshots
Returns a link to the screenshot editor for the app with key “KEY”.
odevio app screenshots [OPTIONS] [KEY]
Arguments
- KEY
Optional argument
odevio app set-metadata
Writes the App Store page of the app with key “KEY”.
Only what you pass is written; everything else is left as Apple holds it. So this can be run again as the text takes shape, rather than having to be complete the first time.
Apple enforces the lengths exactly and refuses the whole request when one is exceeded: 30 characters for the subtitle, 4000 for the description, 100 for all the keywords together, 170 for the promotional text.
Usage:
odevio app set-metadata [OPTIONS] [KEY]
Options
- --description <description>
What the app does, as shown on its App Store page. 4000 characters.
- --description-file <description_file>
Read the description from a file instead. Better for anything with line breaks.
- --keywords <keywords>
Comma separated, 100 characters in total for all of them.
- --name <name>
The public name on the App Store. 30 characters, unique across the store.
- --subtitle <subtitle>
One line under the app name. 30 characters.
- --promotional-text <promotional_text>
170 characters, changeable without a new version.
- --support-url <support_url>
A page where people can get help. Apple checks that it answers.
- --marketing-url <marketing_url>
The app’s own web page, if it has one.
- --privacy-policy-url <privacy_policy_url>
A page saying what the app does with people’s data.
- --copyright <copyright>
For example “2026 Acme”.
- --contact-first-name <contact_first_name>
Given name of whoever Apple should contact about the review.
- --contact-last-name <contact_last_name>
Family name of the same person.
- --contact-email <contact_email>
Their email. Apple wants all four contact options together.
- --contact-phone <contact_phone>
With the country code, for example “+32 496 00 00 00”.
- --demo-account-name <demo_account_name>
Login Apple’s reviewer should use, if the app needs one.
- --demo-account-password <demo_account_password>
Its password. Apple refuses an app it cannot get into.
- --uses-third-party-content <uses_third_party_content>
Whether the app contains anything made by someone else.
- --category <category>
Apple category the app is filed under. See ‘odevio app categories’.
- --free
Make the app free. Apple requires a price even when it is none.
- --age-rating
Answer the age rating questionnaire as containing nothing objectionable.
Arguments
- KEY
Optional argument
odevio app store-status
Shows what the App Store listing of the app with key “KEY” still needs.
The answer is read from Apple every time rather than remembered, so it stays right even when the listing was edited in App Store Connect since the last run, or from another machine. Filling an App Store page rarely happens in one sitting, and this is what makes it possible to stop and come back.
One thing cannot be checked: Apple offers no way to read the App Privacy answers, so they are always listed as something to confirm rather than reported as done or missing.
Usage:
odevio app store-status [OPTIONS] [KEY]
Arguments
- KEY
Optional argument
odevio app submit
Sends the App Store page of the app with key “KEY” to Apple for review.
The point of no return. A human at Apple looks at the app from here, and nothing on the page can be changed until they answer, which usually takes a day or two.
--confirm is required rather than a question being asked, so that this can never happen as a
side effect of a script and never depends on a terminal being there to answer.
Apple is asked once more whether the version is acceptable before it goes, so an incomplete page is reported back instead of being sent.
Usage:
odevio app submit [OPTIONS] [KEY]
Options
- --confirm
Required. Sending for review cannot be undone, so it is never implied.
Arguments
- KEY
Optional argument
odevio app unlink
Links or unlinks an app identifier to Odevio team with key “KEY”.
odevio app unlink [OPTIONS] [KEY]
Options
- --team-key <team_key>
Key of the team to link
Arguments
- KEY
Optional argument
odevio apple
Subcommands to manage Apple specific settings for Odevio.
Access to an Apple developer account makes it possible for Odevio to retrieve and/or create all information necessary to create a build of your application that you will be able to publish on the app store.
A number of Apple specific objects is linked to each developer account and make it possible for Odevio to build iOS apps :
Certificates : The certificates resource represents the digital certificates you use to sign your iOS or Mac apps for development and distribution. These are managed automatically by Odevio.
Profiles : A provisioning profile is a collection of digital entities that uniquely ties developers and devices to an authorized iPhone Development Team and enables a device to be used for testing. These are managed automatically by Odevio.
Identifiers : Uniquely identifies your app throughout the Apple eco-system. These are imported or created in Odevio through command : $ odevio app
Devices : List of devices on which you want to be able to test your builds prior to release on the App Store. At least one device should be added to the device list for Odevio to be able to build apps.
These can be added, modified or deleted through https://developers.apple.com.
Danger
Deletion or modification of Certificates, Profiles or Identifiers managed by Odevio through https://developers.apple.com may break Odevio.
Usage :
odevio apple [OPTIONS] COMMAND [ARGS]...
odevio apple add
Add access to an Apple developer account for Odevio.
Warning
Once the developer account has been created there is no way to retrieve the private key from Odevio.
Note
We have no way to verify your developer account’s ID on Apple. In case of error, your builds will fail.
odevio apple add [OPTIONS]
Options
- --apple-id <apple_id>
Required ID of your developer account on Apple
- --name <name>
A user friendly name for Odevio
- --key-id <key_id>
Required API key “Key ID” on App Store Connect
- --issuer-id <issuer_id>
Required Issuer ID on App Store Connect
- --private-key <private_key>
Required Path to the private key downloaded from App Store Connect
- --team <team>
Key of the team to add the account to. Can be specified multiple times
odevio apple detail
Gets detailed information about your Apple Developer Account with key “KEY” on Odevio.
Returned information :
General information
Devices
Certificates
Provisioning profiles
Note
Odevio updates Apple Developer Account information automatically when starting a build with Odevio.
Example output :
Usage :
odevio apple detail [OPTIONS] [KEY]
Arguments
- KEY
Optional argument
odevio apple edit
Edit properties of a developer account linked to Odevio.
Note
We have no way to verify your developer account’s ID on Apple. In case of error, your builds will fail.
odevio apple edit [OPTIONS] [KEY]
Options
- --apple-id <apple_id>
ID of your developer account on Apple
- --name <name>
A user friendly name for Odevio
Arguments
- KEY
Optional argument
odevio apple link
Links the developer account with key “KEY” to an Odevio team.
By default a newly added Apple Developer Account created on Odevio is only linked to the user having created it. When using this command you can link the Apple Developer Account directly to one of your teams on Odevio giving full access to your team members.
Warning
All users who are in a team linked to an Apple Developer Account have full control over it.
Note
Once the developer account has been created, there is no way to retrieve the private key from Odevio. Making it impossible for team members to “steal” your Apple Developer account.
odevio apple link [OPTIONS] [KEY]
Options
- --team-key <team_key>
Key of the team to link
Arguments
- KEY
Optional argument
odevio apple ls
Lists Apple Developer Accounts to which you have access.
Example output :
Usage :
odevio apple ls [OPTIONS]
odevio apple refresh-devices
Synchronizes the list of devices on Odevio with the Apple Developer account
This command is used when you have just added or removed a new device from your Apple Developer account and you need it on Odevio.
odevio apple refresh-devices [OPTIONS] [KEY]
Options
- -q, --quiet
Flag to know if the refreshed list of devices should be hidden or not
Arguments
- KEY
Optional argument
odevio apple rm
Removes access to Apple Developer account with key “KEY” for Odevio.
This does not remove the Apple Developer account from Apple, it only removes the link between Odevio and Apple.
- ..note::
This will also remove every application, every build, every devices, every certificate, every profile and every objects related to that Apple Developer account on Odevio (it will not remove these from Apple).
odevio apple rm [OPTIONS] [KEY]
Options
- --yes
Confirm the action without prompting.
Arguments
- KEY
Optional argument
odevio apple unlink
Unlinks the developer account with key “KEY” from an Odevio team.
odevio apple unlink [OPTIONS] [KEY]
Options
- --team-key <team_key>
Key of the team to unlink
Arguments
- KEY
Optional argument
odevio build
Subcommands to build an app and track builds.
When starting a new project commands are mostly executed in this order :
odevio build start --build-type="configuration [DIRECTORY]"to create an Odevio-Remote with the right environment for your application.
odevio build connectto get your connection settings and access the Appolo Remote on which you can test and setup your application with XCode.
odevio build stopto stop your Appolo Remote when you’re done editing your settings.
odevio build patchto retrieve the changes made on the Odevio-Remote.
git apply odevio.patchto apply the changes locally.
odevio build start [OPTIONS] [DIRECTORY]to build your app with Flutter and generate an IPA or to publish your app on the App Store.
Usage:
odevio build [OPTIONS] COMMAND [ARGS]...
odevio build connect
Get the connection information for an Odevio-Remote linked to a build.
This command will start an Odevio-Remote and return connection settings and credentials for you to connect with a remote desktop client to the Odevio-Remote.
Note
Odevio-Remotes are active for 1 hour before being closed automatically.
Note
Odevio-Remotes are MacOS build machines on which the flutter build of your application is executed.
Note
The connection uses the VNC protocol, your Remote Desktop client must support it to allow you to use an Odevio-Remote.
odevio build connect [OPTIONS] [KEY]
Options
- --tunnel-port <tunnel_port>
Start a reverse SSH tunnel, forwarding to this port. Note: this only applies to configuration builds
- --tunnel-host <tunnel_host>
If –tunnel-port is specified, this is the host to forward to (defaults to localhost)
- --tunnel-remote-port <tunnel_remote_port>
If –tunnel-port is specified, this is the port on the VM (defaults to the same port, except for 22 and 5900)
- -y, --yes
Automatically create an Odevio Remote if your build was not setup for remote desktop
Arguments
- KEY
Optional argument
odevio build detail
Fetches detailed information of a build.
Returns the location of the logs and application artifacts.
odevio build detail [OPTIONS] [KEY]
Arguments
- KEY
Optional argument
odevio build download
Get the modified source code of a build.
odevio build download [OPTIONS] [KEY]
Options
- -o, --output <output>
Output filename (default: source.zip)
Arguments
- KEY
Optional argument
odevio build flutter-versions
Lists the Flutter versions available on Odevio.
odevio build flutter-versions [OPTIONS]
odevio build ipa
Get the ipa file of a build.
odevio build ipa [OPTIONS] [KEY]
Arguments
- KEY
Optional argument
odevio build logs
Outputs the logs of a build
Note
Logs are printed only when a command has finished its execution. In particular, Flutter logs are only printed when the flutter command execution has ended.
odevio build logs [OPTIONS] [KEY]
Arguments
- KEY
Optional argument
odevio build ls
Lists builds on Odevio.
odevio build ls [OPTIONS]
Options
- -a, --all
shows your builds and the builds from your teams
odevio build patch
Retrieve a patch that gathers all changes made to the source code of a build.
Note
The patch was made on a blank Git repo.
odevio build patch [OPTIONS] [KEY]
Options
- -o, --output <output>
Output filename (default: odevio.patch)
Arguments
- KEY
Optional argument
odevio build rm
Deletes a build and its corresponding Odevio-Remote.
Note
Odevio-Remotes are MacOS build machines on which the flutter build of your application is executed.
odevio build rm [OPTIONS] [KEY]
Arguments
- KEY
Optional argument
odevio build start
Start a new build from scratch
DIRECTORY : Home directory of the flutter project. If not provided, gets the current directory.
The Odevio tool is composed of:
Odevio-Remote : The pre-configured build machines which handle the setup, build and release of your app
Odevio-cli : The CLI command line that works as an interface to start Odevio-Remote build machines
odevio build start [DIRECTORY] --build-type <build-type> creates an Odevio-Remote and builds the app
either for development, ad-hoc, distribution, validation or publication
Configuration: launch an Odevio-Remote to allow you to configure your project on XCode
Development : builds the app for testing on an iOS simulator.
Ad-hoc : Build an .ipa file for testing on the devices listed in your developer account. For the list of devices check
odevio apple detail <apple-dev-account-key>.Distribution : Build an .ipa file that can be distributed on any device.
Validation : Build an .ipa file and validates that it can be released on the App Store.
Publication : Build an .ipa file and publish it on the App Store. Once this build succeeds you have to go on the App Store to complete information and screenshots related to your new application version.
Killing this command will not stop the build. You can check the progress of all your Odevio-Remotes by running
odevio build ls or get detailed information by running odevio build detail and selecting your build.
To avoid having to specify all the parameters each time, you can create a .odevio file in the directory where the command is run. Each parameter is specified on a line in the form PARAM=VALUE. For example:
app-key=123
flutter=3.0.0
minimal-ios-version=11.0
All files and directories in the provided directory will be uploaded, except:
build/
windows/
linux/
.dart_tool/
.pub-cache/
.pub/
.git/
.gradle/
source.zip
.app.zip
odevio.patch
You can also specify additional files and directories in a .odevioignore file, with each files and directories you want to ignore on separate lines, with directories ending with ‘/’
odevio build start [OPTIONS] [APP_KEY] [DIRECTORY]
Options
- --build-type <build_type>
Build type
- Options
configuration | development | ad-hoc | distribution | validation | publication
- --flutter <flutter>
Flutter version for your build (example “2.8.1”). Use odevio build flutter-versions to see all available versions
- --minimal-ios-version <minimal_ios_version>
Minimal iOS version for you application (example “9.0”)
- --app-version <app_version>
App version to set for this build (for example “1.3.1”). If not set, the version in pubspec.yaml will be used
- --build-number <build_number>
Build number to set for this build (the number after ‘+’ in the version in pubspec.yaml). If not set, the build number in pubspec.yaml will be used
- --mode <mode>
Mode to build the app in. Defaults to release
- Options
release | profile | debug
- --target <target>
The main entry-point file of the application. Defaults to lib/main.dart
- --flavor <flavor>
Custom app flavor
- --post-build-command <post_build_command>
Command to run after the build has finished. Can be specified multiple times.
- --tunnel-port <tunnel_port>
Start a reverse SSH tunnel when the build is started, forwarding to this port. Note: this only applies to configuration builds
- --tunnel-host <tunnel_host>
If –tunnel-port is specified, this is the host to forward to (defaults to localhost)
- --tunnel-remote-port <tunnel_remote_port>
If –tunnel-port is specified, this is the port on the VM (defaults to the same port, except for 22 and 5900)
- --no-progress
Do not display the progress and exit the command immediately.
- --no-flutter-warning
Do not display a warning if no flutter version is specified and the local flutter version does not match the build version.
Arguments
- APP_KEY
Optional argument
- DIRECTORY
Optional argument
odevio build stop
Stops a running build
odevio build stop [OPTIONS] [KEY]
Arguments
- KEY
Optional argument
odevio build tunnel
Create a reverse ssh tunnel between this computer and the VM
This allows you to access a port of this computer or any host accessible frow this computer, from the VM.
For example if you have a web server running on port 8000, type the command
odevio build tunnel –port 8000
and your web server will be accessible on the VM at localhost:8000, which will enable you to run your app in the simulator while connecting to your local web server.
odevio build tunnel [OPTIONS] [KEY]
Options
- --port <port>
Required Port to forward to
- --remote-port <remote_port>
Port on the VM (defaults to the same port, except for 22 and 5900)
- --host <host>
Host to forward to (defaults to localhost)
Arguments
- KEY
Optional argument
odevio privacy
Work out what to answer in Apple’s App Privacy questionnaire.
Apple requires every app to declare what data it collects before it can be submitted, and refuses to let that declaration be filled in by API — it has to be done on the App Store Connect website. What stops most people is not the clicking, it is knowing what to answer.
Since May 2024 Apple requires every third-party library to ship a PrivacyInfo.xcprivacy file
declaring what it collects. Those files are machine readable, so most of the answer is already sitting
in the project.
Usage:
odevio privacy [OPTIONS] COMMAND [ARGS]...
odevio privacy scan
Read the privacy manifests in the project and report what they declare.
The report is meant to be read side by side with the App Privacy questionnaire: every data type is given under the exact heading Apple uses, together with whether it is linked to the user and whether it is used for tracking, which are the two questions Apple asks about each one.
Dependencies that ship no manifest are listed separately. Their silence is not a promise: it means nothing can be concluded about them and they have to be checked by hand.
What the project’s own code collects is never in a manifest unless it was written by hand, so it is always asked rather than guessed.
odevio privacy scan [OPTIONS]
Options
- --directory <directory>
The Flutter project to scan. Defaults to the current directory.
odevio profile
Profile of the logged in user.
Example output :
The top part displays the user account information and the location of the Odevio config.ini file on your system.
The bottom part either :
Displays the list of Teams to which the logged in user has access. The Admin field is shown in green if the logged in user is the admin of the team.
Is not shown if the logged in user has no teams or has not been added to any teams.
Usage :
odevio profile [OPTIONS]
Options
- --ini
Highlight config.ini path
odevio screenshot
Take App Store screenshots from a simulator on an Odevio machine.
The App Store needs screenshots, and taking them normally means owning an iPhone. These commands run the app in a simulator on one of our Macs instead, and photograph it there.
The picture is taken from the simulator itself rather than from the remote desktop, so it comes out at exactly the pixel size Apple asks for, with no window borders and no rescaling.
You navigate your own app during the session and say when to capture. That is deliberate: reaching the screens worth showing means signing in, having some data on screen and knowing where to tap, and nothing does that better than the person who wrote the app.
Usage:
odevio screenshot [OPTIONS] COMMAND [ARGS]...
odevio screenshot capture
Photographs what the simulator is showing, for the build with key “KEY”.
Run this once per screen you want on your App Store page: navigate to a screen, capture, navigate to the next, capture again. Apple takes up to ten per device size and needs at least one.
The device is named rather than left to chance. A build machine usually has more than one simulator running — Xcode opens one of its own — and asking for “the booted one” then picks whichever it happens to find, which can quietly photograph the wrong phone.
The image is kept with your app, ready to be sent to the App Store.
odevio screenshot capture [OPTIONS] [KEY]
Options
- --device <device>
Simulator to photograph. Defaults to the one ‘start’ was given.
Arguments
- KEY
Optional argument
odevio screenshot devices
Lists the simulators available on the machine of the build with key “KEY”.
odevio screenshot devices [OPTIONS] [KEY]
Arguments
- KEY
Optional argument
odevio screenshot push
Sends the screenshots of the app with key “KEY” to its App Store page.
Whatever is already on the App Store page for those device sizes is replaced, so the page ends up matching what you have here rather than holding both.
odevio screenshot push [OPTIONS] [KEY]
Arguments
- KEY
Optional argument
odevio screenshot start
Starts a simulator on the machine of the build with key “KEY”, with your app on it.
Booting takes a moment, and the command waits for it: a screenshot taken too early catches a black screen or the boot logo, which Apple accepts happily and a human reviewer refuses much later.
Your app is then built for the simulator, installed and launched, which takes a few minutes.
Connect to the machine with odevio build connect to see the simulator and use your app.
odevio screenshot start [OPTIONS] [KEY]
Options
- --device <device>
Simulator to start, as named by ‘devices’. Chosen for you if omitted.
- --ipad
Choose an iPad rather than an iPhone.
- --no-app
Only start the simulator, without building and installing.
Arguments
- KEY
Optional argument
odevio signin
Logs in to your Odevio account.
Login is based on e-mail and password. This command stores the connection token for future commands in
a config.ini file. To get the location of the config.ini file run odevio profile --ini once connected.
odevio signin [OPTIONS]
Options
- --email <email>
- --password <password>
odevio signout
Log out of your Odevio account.
This command deletes the connection token from the config.ini file associated with Odevio. To get the location of
the config.ini file run odevio profile --ini
odevio signout [OPTIONS]
odevio signup
Creates an Odevio user account.
E-mail, username and password are required
odevio signup [OPTIONS]
Options
- --email <email>
- --username <username>
- --password <password>
odevio skill
Install the Odevio skill for AI agents.
The skill teaches an AI agent such as Claude Code how to take a Flutter project all the way to an iPhone through Odevio: Apple setup, remote iOS build, automatic fixing of build failures, and delivery to TestFlight.
Usage:
odevio skill [OPTIONS] COMMAND [ARGS]...
odevio skill install
Install the Odevio skill.
By default the skill is installed for the whole machine, in ~/.claude/skills/odevio/, and
becomes available as /odevio in every project. That path is where Claude Code looks, so this
command configures Claude Code specifically. The skill itself follows the open Agent Skills standard, so
other agents read the same files: pass --agent codex, --agent cursor or
--agent gemini to install into theirs (only Claude Code also gets its commands pre-approved). For
an agent not listed, --to <its skills directory> places the files anywhere. Pass
--project to install inside one project’s skills folder instead, to commit it with the repository.
The skill is linked rather than copied, so upgrading Odevio upgrades the skill with it. This is the default because the alternative fails quietly: a copy goes on answering with the instructions it was installed with, and nothing about the assistant’s behaviour reveals that it is out of date. A broken link, by contrast, is obvious at once.
--copy takes a copy instead, which survives the Python environment being moved or removed.
A copy left behind by an upgrade is refreshed automatically the next time Odevio updates itself, so
it does not silently rot either. --project always copies, since a link would be meaningless
to anyone else who clones the repository.
The command also adds allow rules for the skill’s commands to the matching
settings.json, unless --no-permissions is given. Without them the assistant asks
for approval before nearly every command: a skill’s own allowed-tools only covers the one
turn that invokes it, and the grant is gone as soon as you reply, so a conversation that waits for
a build or a decision loses it immediately. Four commands are left out on purpose and always ask -
starting a build, sending screenshots to Apple, opening a submission, and sending an app for review.
Existing rules and settings are kept: the allow list is only ever added to, so running this again is harmless.
The command is non-interactive so it can be used in a script. An existing installation is left
untouched unless --force is given.
odevio skill install [OPTIONS]
Options
- --project
Install for a single project instead of the whole machine. Use this to commit the skill with a repository.
- --directory <directory>
With –project, the project to install into. Defaults to the current directory.
- --copy
Copy the skill instead of linking it. It then stays as it is until you install again.
- --force
Replace an existing installation.
- --no-permissions
Do not pre-approve the skill’s commands. Every one of them will then ask for approval.
- --agent <agent>
Which AI agent to install for. Claude Code also gets its commands pre-approved; the others place the same skill and follow their own approval rules.
- Default
claude-code
- Options
claude-code | codex | cursor | gemini
- --to <to_dir>
Install into an explicit skills directory, for any Agent Skills-compatible agent not covered by –agent. Copies the standard files there; auto-approval is skipped.
odevio team
Subcommands to manage teams and corresponding users.
A user can be part of multiple teams. Each team has only one admin. The admin can add or remove users based on their username.
The team system is used in case a user wants to share access to his Apple Developer Account, his app identifiers or his builds to other developers with whom he collaborates.
Warning
If an object (App or Apple Developer Account) is linked to a team then all members of this team have full control over the object.
Usage :
odevio team [OPTIONS] COMMAND [ARGS]...
odevio team ls
Lists the teams to which the logged in user has access.
Returns a list with :
General team information
List of team members
List of app identifiers in the team
List of Apple Developer accounts to which the team has access
Example output :
Usage :
odevio team ls [OPTIONS]
odevio team member
Commands to manage team members.
odevio team member [OPTIONS] COMMAND [ARGS]...
odevio team member add
Adds a user to a team.
odevio team member add [OPTIONS] [KEY]
Options
- --username <username>
username of the new team member
Arguments
- KEY
Optional argument
odevio team member rm
Removes a user from a team.
odevio team member rm [OPTIONS] [KEY]
Options
- --username <username>
username of the team member to remove
- --yes
Confirm the action without prompting.
Arguments
- KEY
Optional argument
odevio team mk
Creates a team and sets the logged in user as team admin.
odevio team mk [OPTIONS]
Options
- --name <name>
odevio team rm
Deletes a team.
odevio team rm [OPTIONS] [KEY]
Options
- --yes
Confirm the action without prompting.
Arguments
- KEY
Optional argument