Platform Changelog - EyevinnOSC/community GitHub Wiki
This page tracks deployed platform functionality, updated daily. It is indexed by the OSC architect RAG system so users can ask "what was recently deployed?" or "when did feature X ship?".
- Explain high availability on the My Apps toggle and show the HA option and Recreate-app copy for Python apps
- Hint that CDN provisioning can take up to 10 minutes
- Show the plan name for your brand on the plan picker and the voucher note when creating a workspace
- Play the Getting started video with sound after pressing play
- List only published skill pages in sitemap.xml
- Clear a stale suspension record after creating an instance or job from the console
- Reserve the page name
edgein create-my-page - Clear a stale suspension record after instances are created through MCP
- Reserve the My Pages name
edge - Restart and rebuild Python My Apps with high availability awareness
- Clear a stale suspension record when creating or recreating My Apps and service instances, and verify live state before a suspend returns 409
- Add the first endpoints for adding customer domains to a CDN site
- Register a gpu-time meter for shared GPU usage, 40 tokens per shared GPU hour billed per minute
- Pick a saved Git Credential in the My Jobs create and edit dialogs, with clearer messages when a credential is not found
- Switch to the right My Apps tab when the tab link changes on the same page
- Point Liivo upgrade links in emails at the your-apps page
- Name the Varnish sub-processor next to Enable CDN before you click
- Enable CDN for instance services on the allowlist
- Place the cookie banner at the top at every window width
- Let create-my-job take a gitCredential so scheduled jobs can clone private repositories
- Add the update-my-job tool to set, change or clear the Git Credential of a job
- Mark create-service-instance without configuration and failed deploy-solution calls as errors
- My Domains refuses names held by a CDN site and other workspaces' recently released names
- Fix orchestrator configuration lookup for owners with hyphenated names
- Fix plan swaps within the billing window so they fall back to the canonical price when the product family lacks the target tier
- Skip the captcha for email-verified users when creating a workspace, and fail closed if the status check errors
- Show CNAME and A-record DNS instructions for My Pages custom domains
- Show the Getting started video first and larger in the onboarding card
- Show a poster thumbnail on the Getting started video
- Keep polling a CDN site until its generated address is renamed to the OSC hostname
- Show the product tour steps centred on narrow windows when the sidebar is hidden
- Fix the low-token email so it no longer says to wait for tomorrow's refill
- Keep polling wait-for-app-ready on transient 502, 503 and 504 answers and report a failed build as FAILED
- Report the measured wait and reset the crash-loop counter per generation in wait-for-app-ready
- Send the plan type to checkout in the upgrade-plan tool
- Use the prod-se host in the architect instructions, secrets guide and skill examples
- List the OSC MCP server in the official MCP Registry
- Parse bring-your-own-domain (BYOD) settings for CDN sites from configuration
- Return the DNS target for My Pages custom domains
- Fix certificate issuance for wildcard domains with long names
- Add use case page on diagnosing and restarting a broken app with an agent
- Add "build with your own AI, run on open source hosted in Sweden" job to the For Builders page
- Link the official MCP Registry listing on the /mcp page
- List Varnish for optional CDN acceleration on the subprocessors page
- Improve readability of primary call-to-action buttons and the mobile stack table on launch pages
- Add Liivo first-deploy emails for day 0, 3 and 7
- Fix wait-for-parameter-store so it keeps polling when the route returns a 404 while starting
- Fix My Apps build status so the ingress default server answer is no longer treated as a ready build
- Expose the instance service allowlist on GET /mycdn/enabled
- Fix the CDN fallback domain zone suffix per environment
- Add a Getting started video to the start page empty state
- Add a root-domain A record option in the My Apps DNS Configuration dialog
- Add View runs entry point with run history and logs for My Jobs
- Add a voucher field under the plan choice when creating a workspace
- Add an Earlier conversation divider for restored inline AI chat messages
- Show an upgrade prompt when a free workspace with zero balance is refused a service action or resume
- Fix token packs so they no longer expire and update the copy
- Fix the Plan changed title for immediate step-downs
- Fix the cookie banner placement on mobile landing pages
- Raise the deploy order timeout so slow deploys no longer show an error
- Add root-domain A-record DNS options to the my-domain MCP tools
- Add custom-domain DNS guidance for root domains to the AI chat
- Fix wait-for-app-ready so ingress default-server answers are not reported as ready
- Fix wait-for-parameter-store retry on transient edge 404 responses
- Fix CouchDB readiness probe when the database URL includes a database name
- Add run history and run logs endpoints for My Jobs (GET /myjobs/:name/runs and /runs/:runId/logs)
- Accept and return gitCredentialRef on POST and PATCH /myjobs
- Add stable OSC hostnames and certificate renewal for My CDN sites
- Fix paid-to-paid downgrade within the billing window
- Allow /pricing for Stripe tenants whose subscription has ended
- Add a voucher preview endpoint for the signup plan step
- Link the migrate-from-managed-PaaS page from the footer
- Add a step down to the next lower paid plan in the Cancel Subscription flow
- Show a free months status panel on the pricing and subscriptions pages
- Add agent-aware sign-in copy when an AI agent connects to OSC
- Add direct Personal plan checkout links on token exhaustion surfaces
- Honour per-workspace token refill overrides
- Fix the Change Secret dialog crash
- Fix secret picker to reference the exact name a workspace secret was created under, with clearer failure messages
- Fix upgrade links in the Create Instance modal and custom domain prompt so they navigate
- Hide the token percentage in the account menu when the balance is zero or negative
- Fix sitemap.xml access and advertise it in robots.txt
- Send Liivo sign-in, welcome and plan-change emails from the Liivo sender
- Fix readiness probing in wait-for-service-ready so a missing instance ends the wait instead of retrying
- Fix My Job runner secret names so long job names no longer collide
- Fix My Pages so an existing MinIO root password secret is not overwritten when a page is created
- Add CDN meter configuration for usage billing
- Fix false 409 conflicts on My Agents with a stale Running status and guard against overlapping manual runs
- Pass the stored runner token and config API key when a My Job is run manually
- Store the config API key per My Job, with fallback to the legacy tenant key
- Add CDN provisioning, traffic caps, plan reconciliation and usage reporting (behind the CDN feature flag)
- Use net runway for low-token and first-deploy customer emails
- Restore the saved conversation in the inline AI chat
- Show generic usage meter rows in the Workspace Usage view
- Request Enterprise in-app from the upgrade dialog instead of opening a mail client
- Exempt My Page file upload tools from the secret-entropy scanner so uploaded site files are no longer blocked
- Serialize HA state for Python My Apps, hide the standby instance from listings and clean it up
- Persist the trial end date on the tenant plan when Stripe Checkout completes
- Preserve the orchestrator ENVIRONMENT on remake and align certificate names with it
- Keep shared service ingresses non-empty
- Link the Keycloak user-migration guide from the /baas page in all five locales
- Replace the Enterprise "Contact Sales" link with a Request Enterprise button on the pricing page
- Keep the Stripe confirmation modal open after the URL parameter is removed
- Show a single Manage tags popover anchored to the Actions icon on My Pages
- Point terms links to www.osaas.io/terms
- Return a brand-aware upgrade link for Liivo sessions from the custom domain plan gate and the mailbox creation refusal
- Wire the shared SFU key for Intercom setup in AI chat and re-verify startup status
- Ask for confirmation in AI chat before restarting instances not created in the conversation
- Preserve the orchestrator environment when a service is remade and align certificate names with it
- Link the Keycloak user-migration guide from /baas in all five locales
- Apply a voucher in the purchase modal and show the active voucher after checkout
- Warn that a failed non-HA My App rebuild leaves the app down
- Correct the Run Logs unavailable copy in Agent Tasks and set log availability from live polling
- Hydrate the inline AI chat from the saved conversation
- Accept any git host in the git credential registration MCP tools
- Rank and cap osc_search_tools query results
- Correct the php-runner memory limit to the measured 512Mi in get-runtime-limits
- Apply My App basic auth to all domain slots, including secondary custom domains
- Apply My Page basic auth to custom domains attached after auth is enabled
- Send Cache-Control private, no-store on basic-auth protected My App and My Page ingresses
- Return 503 instead of 402 when the plan lookup fails on the custom-domain gate
- Remove orphan custom-domain proxies after a failed My App create or build timeout
- Report build status as unknown for a non-signature healthz 500
- Apply a voucher as a Stripe Checkout free trial and add a voucher validation endpoint
- Return 401/403 with a reason for missing or revoked PATs on voucher and Stripe routes
- Add Enterprise plan custom pricing and Enterprise Checkout at the tenant's custom price
- Close open invoice bills when switching from INVOICE to STRIPE checkout
- Add upgrade buttons to the Add Domain and Edit Domain dialogs and to My Page custom-domain attachment when the Professional plan is required
- Accept an access token from any git host on the credential paste page
- Say "free months" instead of "free trial" in dashboard banners, the Token Usage tile and the downgrade feedback modal
- Add checkout return screens to the managed-tenants page
- Infer the Liivo brand from the resource parameter on OAuth authorize
- Return the plan refusal with an upgrade link from the domain MCP tools when custom domains require the Professional plan
- Add an endpoint to set the sub-workspace billing exception without a full plan update
- Require typing the project name to confirm deleting everything in a project
- Gate non-Free sub-workspace creation on delegated Stripe checkout
- Make the Create My App, Jobs and Add Domain dialogs scroll so all fields are reachable
- Point the cookie banner privacy link at www.osaas.io/privacy
- Mask connection-URL passwords in create-database and describe-service-instance responses
- Stop setup-git-repo from echoing the Gitea admin token; push instructions now use a
<GITEA_PUSH_TOKEN>placeholder with a one-time download link (60 minutes, up to 3 downloads) - Gate create-agent-task and create-storage-bucket behind the Free-plan zero-balance check
- Make wait-for-app-ready more reliable with a generation gate and 404 debounce
- Add a swap-primary route for custom domains
- Plan-gate switching a domain to a custom domain, while managed domains stay available on every plan
- Fall back to the secondary domain slot for the My App URL when the primary slot is empty
- Remove secondary custom-domain slots when a My App is suspended
- Surface evicted pod count on the instance health UI
- Scope TagFilterBar tag counts to the correct resource type, fixing a mismatch where a tag chip's count didn't match the filtered list
- Add submit and close buttons to the Manage tags popover
- Give
delete-my-appa neutral orphan message with accurate orphan-check labels - Cap
get-my-app-logsanddiagnose-my-appoutput size by default (defaults to the most recent 300 lines with a byte-size backstop, reportingtruncated: truewhen capped) - Gate
create-my-jobandcreate-databasebehind the FREE-plan zero-balance check
- Scope the storage utilization PromQL selector to the exact namespace and PVC name, fixing cross-instance bleed in reported storage usage
- Fix My Running Services tag-editor popovers to open reliably, both on mobile and desktop and from the overflow dropdown and the Instance Card
- Pin favorited sub-workspaces in the mobile hamburger menu regardless of parent collapse
- Show empty sensitive/list fields as "Not set" in the instance parameters modal
- Add an explicit 60s timeout override to the My App creation request to avoid premature timeouts
- Correct PHP runner upload limits reported by the get-runtime-limits MCP tool
- Raise the setup-parameter-store timeout to 55s and correct its tool description
- Fix the wait-for-parameter-store readiness probe misreporting auth rejections as not-yet-listening
- Fix create-my-domain to no longer duplicate an existing mapping
- Gate the resume-suspended-instance MCP tool behind the FREE-plan zero-balance check
- Add bounded retry to per-runtime instance listing in GET /myapps for resilience against transient runner errors
- Surface per-runtime listing failures via response headers on GET /myapps
- Fix the My Apps health-poll to fail fast only on a genuine runner build failure, not any transient HTTP 500
- Preserve existing origin-path routing when updating a custom domain via PUT /mydomains/:instanceName
- Fix DELETE of a My App to correctly distinguish "already removed" from "never existed" and clean up orphaned secondary-domain resources
- Harden asynchronous My App creation with a shared creation-window record and timeout reconciliation, preventing stuck "building" states
- My App creation now warns, rather than blocks, when a referenced parameter store is unreachable
- Fix ghost/failed My App build records to show the real attempted runtime type instead of defaulting to nodejs
- Instance status now reports "running" only once the container is actually ready, not just scheduled
- Reject instance creation when a {{secrets.X}} reference has no matching Secret
- Fix NodePort Service and UDP gateway re-provisioning when toggling an instance between private and public access
- GET /internal-endpoint/:id now returns 404 when the instance does not exist
- Add a data pipeline stack recipe to the data pipelines page
- Fix pricing page token-pack copy: packs do not expire and require a paid plan
- Thread the memoryMiB config env var into instance service options
- Make Job
activeDeadlineSecondsconfigurable in templates
- Close a PAT revocation bypass in the service delegation endpoint (
POST /delegate/:serviceId)
- Preserve query string on signed-out /dashboard/* redirect fallback
- Surface switch-channel failures and gate modal dismiss during switch
- Round token values displayed on admin tenant pages
- Add admin tenant notification-emails lookup endpoint
- Remove comma-grouping from admin token value display
- Real HTTP redirect for anonymous /browse/:serviceId?create=1 in middleware
- Wire memoryMiB into orchestrator ConfigMap and Deployment env
- Resource tag registry — storage, API, delete hooks, orphan sweep
- Exclude the literal "undefined" string when building switch-channel instance config
- Log storage headroom fetch failures instead of silently hiding all errors
- Wire heroTitle/heroDescription i18n keys for 10 more use-case pages
- Remove hardcoded 14-day free trial badge and modal text
- Fix
verifySuperAdminerror handling in admin catalog actions so failures surface correctly instead of escaping the try block - Add session guard to
getAgentSetupto silence spurious errors when a session is incomplete - Add storage headroom indicator to stateful service instance pages
- Fix account deletion to detect instances across all clusters (previously missed Elastx-hosted instances)
- Simplify the Agent Connector MCP URL shown in Settings → MCP (dropped the
/allsuffix; bare/mcpalready defaults to operator mode)
-
admin-get-tenant-plannow gives actionable not-found guidance on a 404 instead of a generic retry message - Add per-tenant audit stats census and an audit-log truncation signal for admin tooling
- Fix MyApps rebuild to reconcile via a status check before declaring a rebuild create failed, closing a permanent-data-loss path on gateway timeouts
- Run MyApps rebuild's remove+create+poll cycle in a background task so the request returns immediately instead of risking a duplicate rebuild on retry
- Wire media-asset-indexing page H1/subtitle text to existing i18n keys
- Fix invoice plan-type resolution for product-specific Stripe prices, and include the originating OSC product on UTM attribution reporting
- Update the ChatGPT Desktop MCP connector card to a Codex-based connect-prompt flow, replacing the native "Add custom connector" setup (no longer requires a Pro/Team/Enterprise/Edu plan)
- Fix Claude Desktop connector card step copy and add an MCP URL field
- Reorder the AI agent connector picker so ChatGPT appears before Claude
- Round token counts to integers on the usage page and navigation bar
- Resolve the time window before running usage aggregations and validate date inputs
- Warn when tool arguments contain undeclared keys stripped by the schema
- Add
admin-get-tenant-usagetool for running instances and lifetime token usage - Migrate Slack action inputs to v4 API so deploys are no longer gated by notifications
- Replace misleading oversized-file guidance with a
create-storage-buckethint - Add graceful context-window error recovery in
ask-osc-architect
- Gate custom domains to the Professional plan and above
- Add
GET /storage/:serviceId/:instanceIdendpoint for PVC storage utilization
- Publish per-plan resale position across all locales
- Add media pipelines page and stack recipe
- Add
[locale]route segment for homepage locale pages - Add media asset indexing page and stack recipe
- Replace YouTube iframes with web-player HLS streams on demo pages
- Add poster image for hero demo video
- Rename FREE plan display title from "Basic" to "Free"
- Enable tax ID collection on Stripe checkout sessions
- Gate token-pack purchases to paid plans only (Free plan no longer sees the option)
- Add backend support for delegated Stripe checkout sessions and per-tenant billing exceptions (ADR-0055 foundation, not yet exposed in the UI)
- Fix maker job
ERR_REQUIRE_ESMcrash by bumping the job container's Node.js from 18 to 22
- Add Open Intercom welcome email for open-intercom signups
-
create-service-instancenow includes dependency health-check guidance in its description, so the agent warns about missing dependencies before attempting creation -
get-service-apinow probes/api-docs/jsonas an additional OpenAPI discovery path, improving compatibility with more service types
- Accept
Sec-WebSocket-Protocolas a fourth credential source in/authenticate, enabling browser-based WebSocket clients to pass bearer tokens without custom headers
- Add per-instance memory cap via
memoryMiBoption on service orchestrators - Fix NodePort ledger entry release and retry writes on conflict (improves TCP port allocation reliability)
- Add
Access-Control-Allow-Credentialsto CORS preflight ingress (fixes credential-including cross-origin requests)
- Add Open Live welcome email sent to users who sign up for Open Live
- Fix loopback redirect URI comparison to be hostname-agnostic per RFC 8252 (fixes headless OAuth clients connecting from
127.0.0.1vslocalhost)
- Token pack purchase and display are now gated to paid plans (Personal, Professional, Business) — Free plan workspaces no longer see the Buy Token Pack option
- Move the "To beta" channel switch from the instance badge area into the instance dropdown menu
- Fix RFC 8252 loopback-port variance in OAuth authorize flow and tighten ephemeral client TTL
- Move Enterprise section to a dedicated tab for Stripe-billed tenants
- Add favorite workspace pinning in the navigation dropdown — starred workspaces appear at the top of the workspace list
- Preserve OAuth continuation state on sign-in error so the user is redirected back correctly after authenticating
- Fix parsing of comma-separated redirect URIs in the OAuth app modal
-
get-runtime-limitstool now covers My Jobs (python-job-runner) — query memory, CPU, max duration, concurrency policy, and cron timezone - Add
create-workspaceMCP tool for admin workspace provisioning - Storage credential provisioning now polls server-side for readiness before returning, reducing race conditions on fresh MinIO instances
- Custom domains now require the Professional plan (€69/mo) or higher — previously available on all paid plans
- Invalid cron expressions in My Jobs now return a descriptive error message from the cron parser
- Sovereignty launch blog post published in all five locales
- Privacy policy updated to disclose MCP audit logging and conversation storage
- Pricing page updated: paid plans bill from day one (no trial period)
- Add sync-metadata job status endpoint for the service build pipeline
- Fix OAuth sign-in regression that caused new workspace creation to fail for certain signup flows
-
create-service-instancenow returns a clear error when an instance with that hostname already exists, rather than a generic failure -
create-backupandschedule-backupMCP tools now return a plan-limit error when the backup feature is not included in your current subscription -
describe-service-instancenow reports the running image tag (fromdeployedVersion) instead of the latest available tag - New
osc_write_tooldispatcher separates write and destructive MCP operations from read-only calls; read-only MCP surfaces no longer expose tools that modify resources - My Apps runtime options now include Go and .NET — all five runtimes are supported: Node.js, Python, Go, .NET, and WebAssembly
-
create-databasenow defaultspublicAccesstofalse— newly provisioned databases are private unless you explicitly request public access
- Rebuilding a My App now automatically rotates the runner refresh token, preventing service disruptions caused by 365-day token expiry
- Stripe checkout success and cancel URLs are now origin-validated against
app.osaas.io, blocking open-redirect exploitation during plan purchase and workspace creation flows - Trial countdown banners now read
trialEnddirectly from billing instead of computingpurchaseDate + 14 days, fixing incorrect billing dates for voucher-extended and admin-granted trials, and showing the banner for any plan type with a future trial end (not only PERSONAL/BUSINESS) - AI chat streaming rewritten to use
ReadableStream.from(), eliminating a teardown crash that affected long chat sessions - Admin catalog detail page now returns a graceful 404 state for unpublished services instead of crashing to the error boundary
- Home tab suggested services updated to Teleprompter, OGraf Editor, and OGraf Server; assistant CTA promoted above service cards based on click-through data
- AI assistant now proposes a deployment plan on ambiguous questions instead of auto-deploying, reducing unintended service creation
- MCP
initializeinstructions are now tailored to the calling surface (operator vs. full MCP) for clearer tool guidance -
get-service-schema,list-service-instances,describe-service-instance,delete-service-instance, andget-service-endpointsnow return anINVALID_SERVICE_IDsentinel with anextActionhint when the serviceId does not exist, instead of a generic error -
restart-service-instancenow verifies the instance still exists after the restart call, returning a clear error if the deployment was deleted rather than falsely reporting success
- Admin API now accepts
?includeUnpublished=trueonGET /service/:serviceId, allowing internal tooling to read draft and unpublished services without receiving a 404
- Open Live example page added to the marketing site
- Scheduled plan changes now match by plan type instead of Stripe price ID, fixing incorrect upgrade/downgrade detection after a price update
- Agent Tasks table now shows a Credentials column with color-coded status for each task's OSC Access Token (Active/Expired) and Git Token (OK/Rotate Soon/Rotate Recommended), plus a mobile alert icon for tasks with credential issues
- Token expiry warning banner now shows separate rows for expired tokens (red) and tokens expiring within 14 days (yellow), with per-row rotate links
- OAuth Apps registration now includes a redirect URIs field
- Instance settings modal shows the current release channel (normal or beta) as a chip when the image tag is known
- Service browse pages now display token consumption (tokens/day), subscription fee (where applicable), and a "Ready to deploy with just a name" indicator for single-option services
- MCP operator surface (
/mcp/operator) now returns focused initialize instructions matching its narrowed tool set (osc_search_tools,osc_call_tool,ask-osc-architect) rather than the full 180+ tool context
- SVT Encore service instances now expose
ENCORE_PROFILES_URLas a configurable option in the catalog schema
- New
POST /myinstances/:serviceId/:instanceName/restartendpoint for programmatic restart of individual service instances
- SEO fix: removed broken service links from use-case pages that pointed to non-existent catalog entries
- Accessibility fix: standalone link CTAs now meet WCAG 2.2 AA 24px minimum touch target
- Pricing page updated to remove an inaccurate "every tier includes every feature" claim
- i18n parity check now correctly excludes locale-specific contact keys
- Updated pricing page prose to clarify custom domain availability per tier
- Expanded MCP acronym in marketing copy and added section heading over the three-doors use-case navigation block
- Next.js 14 upgraded to 15 to patch CVE-2026-23864
- Add missing-piece build series landing page
- OAuth
redirect_urivalidation errors now include detailed messages describing exactly why the URI was rejected
- Service instance configuration errors now include the service schema inline, showing required and optional fields without a separate tool call
- MCP server now returns a 400 with a migration hint when the retired
?essentials=1parameter is used; unknown?filter=values also return 400 instead of silently returning wrong results -
get-mcp-helptool descriptions updated to reflect current surface and category layout - Job-type services (which run on-demand and terminate) are now correctly excluded from instance listing and deletion; attempting to delete a job-type service instance returns a descriptive error
- Agent Tasks now track which git credential each task is bound to, enabling
list-git-credentialsto showboundAgentTasksrelationships
- Live chat support widget added to the marketing site
- Homepage hero section updated with agent-first messaging and use-case navigation
- OAuth client registration now accepts loopback redirect URIs (
http://localhost,http://127.0.0.1,http://[::1]) per RFC 8252 §7.3, enabling native desktop and CLI app OAuth flows - Low-token digest now calculates net daily drain correctly by accounting for token refill in the denominator
- Analytics provisioning is now non-blocking: analytics setup no longer delays app creation
-
list-git-credentialsnow shows which Agent Tasks are bound to each credential (boundAgentTasks), alongside the existingboundAppsfield -
create-agent-taskandupdate-agent-tasknow validate that the specifiedgitCredentialexists before creating or updating the task, returning an immediate error with the list of available credential names - Reserved site names (
www,app,api, and others) are now blocked when creating a My Page via MCP -
setup-parameter-storenow warns when you attempt to share a single Valkey instance between multiple parameter stores - Parameter store tools now surface server errors gracefully instead of crashing on unexpected HTML or 5xx responses
- Service dependency probes now correctly resolve
{{secrets.X}}references in database and SMB URLs before connectivity checks
- Reserved site names are now blocked at API level when creating My Pages
- HA standby cleanup now runs on both clusters when HA is disabled
- Unknown query parameters in
GET /makerare now rejected with a 400 error instead of being silently ignored
- Token Consumption card label updated to reflect lifetime semantics (total tokens used since account creation, not a rolling window)
- Service instance name input now enforces a 20-character maximum
- OAuth redirect URIs now accept custom URI schemes (e.g.
myapp://callback) per RFC 8252, enabling native app OAuth flows - Cancelled PayPal plans no longer disappear from the Subscriptions tab and receipts list
- Suspended apps list now refreshes automatically on browser tab focus; resuming an app removes it from the Suspended list immediately without a manual reload
- AI chat streaming rewritten as an async generator, eliminating a persistent
ReadableStreamteardown crash in long chat sessions
-
get-mcp-helpnow derives its category list from the live tool registry and includes pagination context, improving accuracy of help responses for MCP clients
- Stage/Prod pipeline provisioning now uses a platform-internal token instead of requiring the tenant's Agent Tasks credentials — enabling Stage/Prod on any paid-plan app even if Agent Tasks has never been configured
- HA disable now cleans up the standby instance on both clusters, preventing ghost secondaries from a prior cross-cluster migration
- Agent Connector page now uses a modal picker: clicking a row in the compact list opens a full connection details modal instead of an expanded inline card
- Workspace switcher retains the last explicitly selected tenant across page navigations
- My Apps Release to Prod button now shows a disabled state with an explanatory tooltip when the current build status prevents a production release
- Service instance status card shows "Restarting" throughout the full 30-second pod teardown window, preventing a premature flip to "Running" during restarts
- Gitea API token creation now retries on 404 before triggering a full instance rebuild, reducing unnecessary rebuilds caused by transient Gitea startup delays
- My Pages now has a web console UI for HTTP Basic Auth: set a username and password from the site detail view, with eye toggle to reveal the password before saving
- Custom domain and wildcard domain types are now available to Basic plan users in the Create Domain and Update Domain modals
- Agent Connector page replaced the expanded card grid with a compact list; clicking a row opens a modal with full connection details
- Parameter inputs in the Manage Parameters modal now have an eye toggle to show or hide the value, and the layout is responsive on mobile
-
publish-static-siteis deprecated; use My Pages tools (create-my-page,upload-my-page-files,publish-my-page) instead -
upload-my-page-files-from-urlnow guards against SSRF by blocking requests to internal network addresses -
systemCanGeneratefields in service schemas are no longer flagged as missing required fields when creating instances -
list-published-skillandget-published-skillnow handle network errors gracefully - Improved accuracy for app readiness checks, HA mode detection, token savings estimates, and orphan diagnosis
-
call-service-endpointno longer false-positives on opaque handles with high-entropy substrings
- My Pages directory URLs (e.g.
/docs/) now resolve todocs/index.htmlwithout a redirect - Non-secure parameter store responses now include the instance URL
- My Pages list now shows a Manage icon (arrow-out-of-box) on each site row, opening the site detail view
- Exceeded-token notification email now accurately reflects limits for paid tenants
- New
set-my-page-authMCP tool: enable HTTP Basic Auth on a My Pages static site (username + password, stored as htpasswd hash) - New
remove-my-page-authMCP tool: disable HTTP Basic Auth on a My Pages static site -
get-my-pagenow returnsauthEnabledandauthUsernamefields when a page is password-protected -
create-service-instanceresponse no longer crashes when the orchestrator omits the instance URL
- Param store Manage button is only enabled after the server confirms the parameter store is ready, preventing premature access to an uninitialized store
- Service instances for services not yet migrated to Elastx are now fetched from their original per-service orchestrator, keeping the dashboard accurate during the migration window
- My Pages is now a top-level navigation entry — create and manage static sites at
*.pages.osaas.iodirectly from the dashboard sidebar - Skills visibility control: choose Draft, Published, or Unlisted when contributing a new skill; toggle between states from the skill card at any time
- Re-upload files to an existing My Page site without recreating it (Update flow with manifest-diff prune)
- Published skills feed now covers the full catalog with additional metadata fields
- New MCP tools for My Pages:
list-my-pages,get-my-page,create-my-page,upload-my-page-files,publish-my-page,delete-my-page -
list-agent-tasks,list-my-domains, andlist-backupsnow supportlimitandhasMorepagination - New
nudge-feedbackMCP tool to remind the team of pending unreviewed feedback items -
list-my-appssupports a newincludeHealthflag for fleet-level app health monitoring
-
osc web publish <name> <dir>now publishes directly to My Pages instead of provisioning a MinIO bucket. This is a breaking change: the previous-sflag and bucket/CDN output are gone, andosc web cdn-createcan no longer be chained afterweb publish. Custom domains/CDN in front of a My Pages site are not yet supported.
- Subscription status checks now account for instances running on both clusters, preventing false stale-subscription detections for multi-cluster workspaces
- Auth rejection errors in the secrets panel are now handled gracefully instead of crashing the page
- Service detail pages no longer show a false "not found" state when the service token check fails
- New MCP admin tools:
admin-list-subscriptionsandadmin-get-tenant-planfor workspace subscription and plan inspection via AI agents
- New mail delivery status endpoint — check whether a workspace mail server has sent messages successfully via
GET /mymail/delivery-status
- Token consumption rates are now snapshotted at the time of use, preventing retroactive price changes from affecting already-incurred charges
- Rate limit errors in the service catalog and transactions UI no longer crash the page — handled gracefully with inline feedback
- Service detail pages now handle token errors without showing a false "not found" state
- AI assistant now enforces CouchDB database isolation for Intercom: reusing the same host and database path across multiple instances is rejected with corrective guidance
- Service secrets can no longer be set to literal
{{secrets.X}}template strings — the AI rejects these before sending to the platform - Before creating a service instance, the AI now validates that the URL scheme (https, rtmp, etc.) matches what the service expects
- After a multi-step setup failure, the AI now offers to clean up any orphaned instances created before the failure
- Developers calling the OSC chat API directly can enable MCP tool access by omitting
?disableMcp=trueand including a validx-pat-jwtheader
- Private database instances now correctly restore their public-access setting when resumed from a suspended state
- AI assistant conversation history panel: browse past conversations and resume any of them directly from the chat card
- Resume AI chat from last saved conversation on page load
- Stage/prod pipeline can now be enabled for GitHub-hosted apps that have no stored git token
- Resolve db-backuper Job cluster by detecting its own domain
- Add MCP tools for static site publishing (
publish-static-site,upload-object-to-bucket,set-storage-bucket-public) - Remove Agentic SDLC precondition from Stage/Prod MCP tools —
enable-app-stage-prodnow requires only a paid plan - After 3 consecutive "starting" status checks, AI agent automatically escalates to fetching instance logs
- OSC URL wiring gate now skips already-declared service associations and supports session-level confirmation for cross-service wiring
- Stage/prod versions endpoint now returns GitHub tags for GitHub-hosted My Apps
- Custom domain responses now include TLS certificate status for secondary cluster
- Stage/Prod pipeline provisioning and release handlers are now deterministic under concurrent requests
- Drop Agentic SDLC precondition for stage/prod activation — paid plan is the only gate
- Day-0 activation emails now include a runway warning for at-risk tenants
- Pricing calculator plan allotments and recommendation thresholds updated
- The Solutions page now shows a loading indicator while Recent Deployments is fetching on initial page load
- Server errors during page refresh after a deployment are now handled gracefully — the page no longer crashes on transient errors
- Member users are now redirected away from Workspace Settings instead of seeing an error
- Activation emails now show raw event counts for each instrumented branch — makes metric-based activation signals clearer
- After setting up a parameter store, the AI agent now proactively guides users to bind it securely to their custom app via
configServiceandconfigApiKey— prevents credentials from being pasted into chat messages where they would be stored in conversation history - The AI now gives clear guidance when a requested capability is not accessible via MCP (e.g. features that require the OSC web console)
- The AI can now answer "what was recently deployed?" and similar recency questions by querying the indexed Platform Changelog — responses are sourced from live data instead of training knowledge
- For video ingest, transcode, and streaming use cases the AI now recommends Open Videocore as the first option before suggesting lower-level components
- Backup credentials (PATs) are now automatically renewed when they are within 14 days of expiry — scheduled backup runs no longer fail silently when the authentication token ages out
- Backup policies now expose a
credentialStatusfield (ok/expired/renewed) showing PAT credential health — visible via thelist-backup-schedulesMCP tool and the My Backups dashboard - Backup scheduler flags now default to enabled on startup — scheduled backup jobs that were silently not running after a restart will now run correctly
- Agent task setup calls now automatically retry on transient TCP-level connection failures — the My Agent Tasks feature is more resilient on brief network hiccups
- Multi-tenant users are now automatically directed to the correct workspace when a Service Access Token expires — eliminates the manual workspace selection step after re-authentication
- The OSC console now sends session keep-alive pings and shows a session-expired banner when the session ends — prevents silent failures on long-running dashboard pages
- The Configure Service modal now exposes a UDP Gateways field for services that require UDP endpoint configuration
- CouchDB connection errors now show actionable recovery steps instead of opaque technical messages — helps users and AI agents diagnose and recover from CouchDB instance issues faster
- MCP instructions now include guidance on Service-to-Service integration using Service Access Token (SAT) exchange for My Apps — makes it easier for AI agents to set up secure inter-service calls
- App configuration updates now surface specific error messages when the container is in a failed state (CrashLoopBackOff, OOMKilled, image pull failures) — previously these returned a generic error
- Rolling restarts now return a partial-success response when some instances restart and others fail, instead of treating the whole operation as a failure
-
create-service-instancenow rejects attempts to override OSC-owned URL fields (such as base URLs for managed services) — prevents misconfiguration - New
find-parameter-keyMCP tool searches across all parameter stores in a workspace to locate a key by name — useful when you do not know which store holds a given config value - Instance naming constraints (alphanumeric only, max 20 characters) are now included in
get-service-schemaresponses — AI agents receive the constraint upfront so they can prompt for a valid name before creation
- Proxy creation no longer duplicates mirror records when a background task wins a race condition
- Partial-success 500 responses now include the
configApiKeyfield — the API key is available even when the instance creation partially succeeded - Locality predicate for proxy operations now uses real geo-routing data
- Team diary date pages are excluded from search indexing and the sitemap — reduces SEO noise from machine-generated content
-
wait-for-app-readynow times out after 50 seconds instead of 120 seconds — agents receive faster feedback when an app does not become ready in time - MCP tool search now supports multi-word queries — searching for "hls monitor" or "media probe" returns relevant results instead of requiring a single keyword
- Parameter store API key reveal now includes a download button that saves the key as a
.envfile — useful as a backup before closing the modal - The Done button on the key reveal dialog stays disabled until you check "I have saved this key securely" — prevents accidentally closing before saving the key
- Same download and acknowledgment flow applies to the credential regeneration modal
- Remove stale service count copy from the OSC landing welcome text
-
create-agent-tasknow acceptsscheduleType: "manual"to create on-demand tasks that never fire automatically — trigger them withrun-agent-taskwhenever you want - New
acknowledge-secret-savedMCP tool creates an audit log entry after a human confirms they have downloaded and saved a parameter storeCONFIG_API_KEYfrom its one-time download link
- Update hero subtitle and portability section title copy
- Long prompts on skill detail pages now wrap correctly instead of overflowing
- Screenshots are now displayed on community skill cards in the skills index
- Skill display names are now projected into the title field on public skill routes — improves search indexing for skills with custom display names
- When binding a Umami analytics instance to an existing app, the platform now automatically registers the app URL as a website in Umami and returns the tracking script in the response — no manual Umami setup required
- Skills now support an optional
displayNamefield in the schema — set a human-readable title without changing the skill identifier
- HTTP 429 rate-limit errors now surface a user-friendly message instead of a technical error code
- MCP tools now reject requests with unknown query parameters — previously unknown fields were silently stripped, which could mask typos in tool arguments
-
get-logs-for-instancenow redirects automatically toget-my-jobwhen called with a MyJob serviceId, returning the correct log format without manual intervention
- Token usage chip now shows a danger state when the daily consumption rate exceeds the daily refill rate — prevents silent budget exhaustion
- Parameter store tab links now use correct URL encoding for tab names with spaces
-
list-community-skillsnow queries the live community catalog — supportsquery,type,tags, andlimitfilters; previously returned a placeholder message -
import-community-skillnew tool — copies a community skill from another tenant into your own workspace; theforkedFromfield in the result records the origin - All
appId-based MCP tools (get-my-app,restart-my-app,diagnose-my-app, etc.) now return a structured error with recovery hints when the app is not found, instead of a generic failure
- Community skills index added: a cross-tenant
PublishedSkillcollection and API enables browsing skills from all OSC workspaces in one place — powers the/skillspublic index page andlist-community-skillsMCP tool
- Skill publish, update, and delete operations now write through to the community catalog index immediately — the
/skillspublic index page and MCP tool reflect changes without a reindex delay
- Attribution cookie removed — referral tracking now uses URL-passthrough only, removing a stale cookie that was occasionally causing checkout errors for returning visitors
- Token count queries now default to today's UTC midnight as the start time when no start date is specified — fixes incorrect zero-count readings during the first hours of the day
- Subscription cancellations now update purchase status to CANCELLED immediately — prevents stale ACTIVE status on cancelled subscriptions
- Published skill pages now support screenshot uploads — images are rendered on the public skill page alongside the description
- Public skill pages now include a copy-prompt button and a direct MCP connect link for one-click onboarding
-
diagnose-my-appnow shows unfiltered startup logs for apps in non-running states (building, failed) instead of error-only logs — makes it much easier to diagnose startup crashes where all output is INFO-level -
get-my-app-logsdetects git credential failures (HTTP 403, authentication errors, and TTY-style "No such device or address" errors) and emits a structured advisory pointing tolist-git-credentialsand the 30-day GitHub PAT expiry -
list-git-credentialsnow reports credential age in days and flags credentials within 5 days of the 30-day GitHub PAT default expiry (HIGH risk) or within 10 days (MEDIUM risk) -
wait-for-app-readynow correctly distinguishes a newly-started app from a restarted one — prevents false "ready" reports when the old pod is still running immediately after a restart is triggered
- Skill API and metadata now support an optional
screenshotUrlfield, enabling screenshot display on public skill pages
- Fix: PKCE OAuth clients that strictly validate
code_challenge_methods_supportedcan now authenticate —plainhas been removed from the supported methods list to comply with the PKCE spec
-
list-available-servicesnow includes astatus: "COMPLETE CATALOG"sentinel in category-filtered responses so AI agents reliably stop re-scanning after receiving the full result set -
getAppnow times out after 5 seconds instead of hanging for up to 13 seconds when an app is not found, giving agents faster failure feedback -
openWorldHintannotations corrected on 8 tools that were incorrectly marked as able to access the open web — MCP clients receive accurate tool metadata
- My Apps in a
REBUILD_CREATE_FAILEDtombstone state now return a409with an explicit recovery message on plain restart attempts — covers an additional failure state beyond the case handled in v7.81.2
- Public skill share pages are now indexed by search engines and social media crawlers — skills can be discovered via Google and Bing
- FREE plan tenants now see a token budget chip on the dashboard showing their remaining token balance as a percentage
- MCP server now correctly negotiates protocol version during the initialize handshake, resolving connection failures with strict MCP clients
- MCP capability advertisement trimmed to only implemented capabilities — clients no longer receive capability claims the server cannot fulfill
-
resources/templates/listhandler added per MCP spec, returning an empty array; previously caused JSON-RPC errors on clients that call it - Cursor-based pagination is now explicitly rejected with an error instead of silently ignored, giving callers actionable feedback
- MCP tool errors (Zod validation, auth failures) now return structured
isErrortool results instead of throwing — prevents clients from treating validation errors as transport failures - Audit stats API now accepts a
tenantIdquery parameter to scope aggregation to a single tenant; all MCP tool calls are now tagged withsource: mcpin audit metadata
- My Apps stuck in a failed rebuild state now return a
409error on restart with the message "App is in a failed rebuild state. Use?rebuild=trueto recover, or DELETE the app and recreate it." — previously the restart would silently fail - PAT validity is now checked before any destructive rebuild operation begins, preventing failed rebuilds due to expired tokens before a single resource is changed
- Fix: backup scheduler now re-mints a non-expiring PAT when a backup policy is enabled, ensuring scheduled backups continue running without token expiry failures
- Builders dashboard empty states now include direct action buttons — "Submit a Service" navigates to the Service Inbox tab, "Contribute a Skill" opens the contribution modal directly
- Default Node.js version for My Apps deployed on the Web Runner (
eyevinn-web-runner) bumped from Node 22 to Node 24 - Apps can now request a different Node.js major via
engines.nodeinpackage.json(18, 20, or 22 are also available; other values fall back to the default) - Apps can now opt in to pnpm or yarn via a Corepack
packageManagerfield inpackage.json, instead of always using npm - Apps without either field are unaffected apart from now running on Node 24 instead of Node 22
- See Eyevinn/web-runner#50
- Add
compare-servicesMCP tool — evaluate multiple services side-by-side to find the best fit for a use case without callingget-service-schemaseparately for each - Restart advisory threshold lowered to two consecutive health-check failures and now returns a structured advisory object — agents receive actionable restart guidance sooner
-
wait-for-app-readytool now polls internally until the app is ready, eliminating the need for callers to build their own polling loops - Fix: AI assistant now correctly advises that
NEXT_PUBLIC_*variables set in the parameter store are available in client-side code — OSC injects them before the build runs - Fix: AI assistant sessions with MCP disabled now exit gracefully when repeatedly blocked by verification prompts instead of looping indefinitely
- Logged-in users can now view public skill pages — previously they were redirected to the Builders dashboard instead of seeing the shared skill
- Published skills now render dynamic Open Graph preview images on social media share links
- Public skill pages now display a git clone URL section with the anonymous HTTPS clone URL for the skill's Gitea repository
- Fix: My Apps now shows a clear error state when a bound parameter store has been deleted, instead of silently failing to load configuration
- Fix: Token Usage bar now correctly resets its daily tracking window at midnight
- Public skill share URLs now route through the deploy-manager JSON endpoint — skill pages load reliably for all clients including headless tools
- Fix
get-published-skillMCP tool to return structured skill content instead of HTML — wraps JSON parsing in a try/catch for graceful error handling
- Published skills now retain their original type (skill/prompt/runbook) and license after creation — previously metadata fell back to defaults after the initial Gitea write
- Skills list supports pagination — tenants with large skill libraries load reliably without truncation
- Token runway estimate ("days until zero") now uses cumulative lifetime consumption instead of today's usage rate, giving a more accurate long-term projection for steady-state accounts
- Public skill pages now include Open Graph meta tags and social share buttons (LinkedIn, X, Bluesky, copy link) — share directly from the skill detail page or the Builders dashboard card
- Builders tab switching on desktop is now reliable — the tab URL parameter is correctly propagated through the tab container
- Token budget warning banner and Usage page now draw from the same projected runway calculation for consistent figures
- AI chat sessions now self-repair when a user asks the same question a second time — the assistant acknowledges the prior answer, identifies what changed, and asks a clarifying question instead of repeating verbatim
- Fix
get-published-skillMCP tool to correctly fetch skill content — previously pointed at the HTML share page instead of the deploy-manager JSON endpoint
- Parameter store provisioning is now idempotent — retrying a failed store creation no longer results in a conflict error
- Public skills share URL now links to the skill detail page on
app.osaas.ioinstead of the internal API endpoint - Skills listing loads faster — Gitea session results are cached per tenant for 5 minutes, reducing repeated authentication overhead on the Builders dashboard
- Fix token budget warning — the Low Token banner and Usage page now use the same projected runway calculation
- Published skills can now be previewed without authentication via
GET /skills/{tenantId}/{skillName}on the AI API — useful for embedding skill metadata in external tools and dashboards - Add
update-published-skillMCP tool — update the content of an existing published skill, prompt, or runbook without deleting and recreating it - Add
delete-published-skillMCP tool — permanently delete a published skill, prompt, or runbook from your workspace
- Manual My Job runs now update
lastRunStatusonce the job completes, matching the behavior of scheduled runs - Skill deletion is now backed by an API endpoint — enables the
delete-published-skillMCP tool to remove the underlying Gitea repository
- Fix stale sidebar menu item permissions after workspace switch
- Send proactive low-balance email before account token balance reaches zero
- Token balance warning now based on overall runway rather than today's consumption ratio
- Workspace secrets are now selectable as OSC access token source when creating agent tasks
- Add
useLatestparameter tocreate-service-instanceMCP tool — deploy the newest available image version without specifying an exact tag - Parameter tool descriptions now remind users to call
list-parameter-storesfirst to get the correct store name -
estimate-service-costnow includes a disclaimer distinguishing nominal (list price) from observed (actual billed) cost
- MyJob manual trigger (
POST /myjobs/{name}/run) now updateslastRunStatusonce the run completes, matching scheduled-run behavior - Block Agentic SDLC auto-merge when a CRITICAL security finding is open — blocked PRs receive a comment explaining the gate
- More reliable Gitea code pushes — 422 errors on file-push now retry up to 3 times before failing
- Add edit job modal — scheduled My Jobs can now be updated in place (cron schedule, source URL, worker command, parameter store binding) from the web console without deleting and recreating the job
- Add git clone 403 credential-flow guardrail to diagnose-my-app — the assistant now automatically detects authentication failures on private repos and walks through the credential registration and linking steps
- Surface credential-to-app mapping in list-my-apps and list-git-credentials — each app shows its bound git credential name; each credential shows which apps are using it
- Generate non-expiring scheduler PAT for MyJob runs — previously short-lived tokens caused auth expiry on long-running or delayed job executions
- Store MyJobs credentials as K8s service secrets with Elastx fan-out — jobs running on Elastx now reliably receive their OscAccessToken and ConfigApiKey at trigger time
- Fan out PAT expiry reminders to all sub-workspace admins — workspace members with admin role now receive personal access token expiry warnings, not just the primary account holder
- Bump hono transitive dep to resolve HIGH severity CVE (GHSA-88fw-hqm2-52qc) — security patch with no user-facing behavior change
- Guard token refill against past_due/unpaid Stripe subscriptions — token top-up requests on accounts with lapsed billing now return a clear error instead of silently failing
- Fix CouchDB connection URL handling in client libraries — Intercom Manager wiring with CouchDB now resolves database URLs correctly
- Fan out GET /admin/myapps to Elastx secondary cluster — the admin MyApps listing now aggregates results from both Linode and Elastx, giving a complete view of all tenant custom apps across clusters
- Reduce Skills service fetch timeout to prevent 30 s server-action-failed errors — the Skills list now returns a clear timeout message instead of an opaque failure when the deploy-manager is slow
- Translate ContainerCreating phase to success in
update-my-app-config— agents receive arestart_in_progressstatus with a prompt to callwait-for-app-readyinstead of an ambiguous error during rolling restarts
- Add workspace secrets to agent task OSC access token selector — workspace secrets stored in your account are now selectable as a reference option alongside runner service secrets when creating agent tasks
- Return RFC 6749 503 on money-manager timeout in /api/connect/token — headless OAuth clients now receive a proper structured error response on timeout
- Include diagnostic snapshot on wait-for-app-ready timeout — timeout responses now include pod health status and HTTP probe results to help diagnose why an app did not become ready
- Return structured not_found envelope on restart-my-app 404 — clients get a clear terminal error instead of a generic failure when the app does not exist
- Pin SDLC bootstrap source ref to commit SHA to survive branch deletion — Agentic SDLC setups no longer break when the source branch used during setup is later deleted
- Enforce 20-character max length on service instance names — names exceeding the limit return a clear error with guidance to choose a shorter name
- Mask parameter values and connection-string passwords in MCP tool results — credential values are redacted before being returned to the AI client
- Change
get-security-reportdefault format from summary to detailed — reports now include full finding details without requiring an explicit format argument - Return
restart_in_progressstatus on transient ContainerCreating phase — agents now get a clear non-terminal status instead of an ambiguous error during rolling restarts - Pre-flight source ref check in
enable-agentic-sdlc— validates that the specified branch exists before attempting to enable Agentic SDLC - Respond to "what's new" and changelog queries with live app health state via
list-my-apps
- Fix My Jobs scheduler to resolve correct job status — jobs no longer show "unknown" status after running
- Add
enableSecretsflag to parameter store creation — parameter stores can now be created with encryption enabled from the start
- Fix stream abort race condition in AI chat — improves reliability when multiple AI responses are in flight simultaneously
- Store PAT identifier instead of raw token in conversation history — reduces credential exposure in stored sessions
- Remove OSC_CONNECT_CLIENT_SECRET startup warning — eliminates a noisy log entry on startup for environments where the OAuth client secret has not been customised