Developer Docs
Everything you need to publish plugins, desktop apps, and games to Solviony Labs, and to integrate with the Solvionyx OS App Store.
Getting started
- Apply. Submit a developer application — tell us what you want to build. Every application is reviewed by our team.
- Get approved. Once approved, you'll be prompted to subscribe.
- Subscribe. A $60/year developer subscription unlocks unlimited plugin, app, and game submissions.
- Submit. From your developer dashboard, create a submission with your app's details, icon, and either a download URL or an uploaded package file.
- Review. Submit for review when it's ready. Our team reviews the listing and the app itself.
- Go live. Once approved, your app appears in the Labs marketplace and the Solvionyx OS App Store feed — immediately if "auto release" was checked, or whenever you hit Publish now if you held it back.
Submission types
Every submission is one of three types, set when you create it:
| Type | Value | Notes |
|---|---|---|
| Plugin | plugin | Extends Solvionyx OS itself. Listed as an "addon" in the AppStream feed. |
| Desktop App | desktop_app | A standalone application for the Solvionyx OS environment. |
| Game | game | Same distribution path as a desktop app, categorized separately. |
Fields
- Title, tagline, description, category, keywords — what people see in the marketplace and search.
- Version — a free-text version string (e.g.
1.2.0). Compared with standard version-comparison rules by the updates endpoint below. - Download URL or package file — provide one. A URL for externally-hosted downloads, or upload a file directly (50MB max) to host it yourself.
- Icon and screenshots — icon is a single image; screenshots supports multiple.
- Support URL, marketing URL, copyright — optional, shown on your app's public page.
- App review information — a reviewer contact email/phone, demo account credentials if your app requires login to test, and any notes for the reviewer. Never shown publicly.
com.solviony.labs.{slug}, where {slug} is generated from your title the first time you save.
Pricing & visibility
Each submission has its own price and visibility, independent of your $60/year developer subscription (which is a publishing fee, not a per-app charge):
- Price — set to
$0.00for a free app. Any other amount requires purchase via the app before it can be downloaded through the API. - Visibility —
publicapps are listed in the marketplace and the AppStream feed.privateapps are reachable only by direct link or granted entitlement — they won't appear in search or browsing.
Review process
A submission moves through these statuses:
| Status | Meaning |
|---|---|
| Draft | Being edited, not yet submitted. |
| Pending review | Submitted — waiting on our team. |
| Approved | Passed review. Live immediately unless you unchecked "auto release," in which case it's held until you publish it yourself from the dashboard. |
| Rejected | Not approved this round. The reason is shown on your dashboard — fix it and resubmit. |
| Unpublished | Was live, automatically taken down because your subscription lapsed. Restored automatically if you resubscribe. |
Beta testing
Each submission has a TestFlight tab for pre-release builds, separate from the published version:
- Upload a beta build with its own version string and release notes.
- Invite testers by email — they're tracked per-app, and you can remove them at any time.
In-app purchases
Define products your app sells after install, from the Distribution tab of an existing submission:
| Type | Value |
|---|---|
| Consumable | consumable |
| Non-consumable | non_consumable |
| Auto-renewable subscription | auto_renewable_subscription |
| Non-renewing subscription | non_renewing_subscription |
Each product has a product_identifier your app uses to reference it, a display name, and a price. Subscription-type products automatically get a matching recurring Stripe Price behind the scenes.
Payouts
Paid apps and in-app purchases are paid out via Stripe Connect. From the Business tab of your dashboard, connect a Stripe Express account — Stripe handles identity verification, tax forms, and bank details directly; we never see or store them.
Solviony ID authentication
The endpoints below marked Bearer require a Solviony ID OAuth 2.0 access token — the same identity provider used across the Solviony ecosystem. It's plain OAuth 2.0 with PKCE, not OpenID Connect: there's no id_token and no /oauth/userinfo, just an access token you exchange for a code, and a REST profile endpoint.
- Register an app. Get a
client_id/client_secretand register yourredirect_uri— see the Solviony ID developer page for the full PKCE walkthrough (generating a code verifier/challenge, etc.). - Send the user to authorize. Redirect to
/oauth/authorizewith yourclient_id,redirect_uri, andresponse_type=code. - Exchange the code. Your app's backend (or the Solvionyx OS App Store client, for install/download/purchase calls) posts to
/oauth/tokenand gets back an access token. - Call the Labs API. Send that token as
Authorization: Bearer <access_token>on any endpoint below marked Bearer. Unauthenticated requests to those return401.
# Step 1: send the user to authorize GET https://solviony.com/oauth/authorize? client_id=YOUR_CLIENT_ID& redirect_uri=https://yourapp.com/callback& response_type=code # Step 2: exchange the code for a token curl -X POST https://solviony.com/oauth/token \ -d "grant_type=authorization_code" \ -d "code=$CODE" \ -d "client_id=$CLIENT_ID" \ -d "client_secret=$CLIENT_SECRET" # Step 3: use it against the Labs API curl "https://solviony.com/api/labs/apps/3/download" \ -H "Authorization: Bearer $ACCESS_TOKEN"
GET /api/user with the same Bearer token — covered on the Solviony ID developer page, along with PHP and Node examples of the full PKCE flow.
API reference
This is the same API the Solvionyx OS App Store client uses. All endpoints are under /api/labs and return JSON.
| Endpoint | Auth | Description |
|---|---|---|
GET/api/labs/apps | — | Paginated list of public, approved, published apps. Supports ?search=, ?category=, ?per_page=. |
GET/api/labs/apps/{id} | — | Full detail for one app, including description, screenshots, and developer info. |
GET/api/labs/apps/{id}/updates | — | Pass ?installed_version= to check if a newer version is available. |
GET/api/labs/apps/{id}/download | Bearer | Returns a download URL. For paid apps, requires an active entitlement — otherwise responds 402. |
POST/api/labs/apps/{id}/install-event | Bearer | Records an install, update, or uninstall event for analytics shown on the developer's Trends tab. |
POST/api/labs/apps/{id}/purchase | Bearer | Creates a Stripe Checkout session for a paid app and returns its URL. |
GET/api/labs/user/entitlements | Bearer | Lists the current user's active purchases. |
Example — list apps
curl "https://solviony.com/api/labs/apps?category=Productivity"
{ "data": [ { "id": 3, "slug": "solviony-hub", "title": "Solviony Hub", "tagline": "See What's Next.", "category": "Entertainment", "type": "desktop_app", "icon_url": null, "version": "1.0.0", "price_cents": 0, "visibility": "public", "download_count": 0 } ], "...standard Laravel pagination fields (current_page, total, etc.)" }
Example — download a free app
curl "https://solviony.com/api/labs/apps/3/download" \ -H "Authorization: Bearer <access_token>"
{ "download_url": "https://solviony.com/storage/labs/files/...", "expires_in": null, "package_format": "deb", "version": "1.0.0" }
Solvionyx OS integration
Every public, approved, published app also appears in an AppStream Collection XML feed at:
https://solviony.com/labs/appstream.xmlThis is the feed the Solvionyx OS App Store (a GNOME Software-based client) consumes via its external-appstream-urls configuration, so approved apps show up in the OS's native app store automatically — no separate submission needed. Price is included as informational metadata only; actual purchase and download access is always enforced through the API above, not the feed.