All notable changes to Crove Post (formerly Postiz app fork) will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Customer-Facing UI, SDK and MCP Announcing Upstream Infrastructure (Upstream Endpoint Leaks):
- Root cause: the Branding Guard scanned only AGPL attribution (repo, image, author), so it reported "0 strict branding leaks" while runtime endpoints still pointed at upstream infrastructure.
- The Developers page rendered
export POSTIZ_API_KEY=<real key>with noPOSTIZ_API_URL, so the upstream CLI sent Crove credentials toapi.postiz.comand posted to the wrong account;postiz auth:loginran a device flow againstcli-auth.postiz.com, signing customers into the upstream cloud. - The rebranded
@crove/nodeSDK still defaulted_pathtoapi.postiz.comand its README documented the old@postiz/nodepackage name; the MCP server announced itself as "Postiz MCP" on every OAuth path, including/mcp-oauth-dynamicwhich DOSClaw uses. - Remediated by adding a RUNTIME pattern family to the guard (upstream endpoints, connector keys, install commands), bringing
apps/sdk/into STRICT scope, reporting per-match line numbers, and recording deliberate upstream references via visiblebranding-guard-allow:comments. "Add to Claude" and the Affiliate menu now fail closed untilBRAND_CLAUDE_DIRECTORY_URL/BRAND_AFFILIATE_URLare set; Docs links resolve throughBRAND_DOCS_URL.
- Mobile OAuth Callback Handing Authorization Codes to an Upstream Scheme:
- Root cause:
GET /oauth-mobile-callbackredirected a live OAuth authorization code toMOBILE_APP_SCHEME || 'postiz://auth/callback'. Deployments that never set the variable (Crove leaves it empty) handed this instance's codes to whichever app on the device registered the upstreampostiz://scheme. - Now returns 501 when the variable is unset. The frontend derives its deep link from the same variable (
getMobileAppScheme) instead of hardcodingpostiz://integrations, and omitsredirectUrlentirely when no scheme is configured. Documented in.env.examplethat the value must stay empty unless a mobile app ships.
- Root cause:
- Build CI Gate Red on Every Push Since 2026-09-10 (PRs #33-#36):
- Root cause: the bootstrap / OAuth-consent suites throw
'Use isolated local test services'unlessDATABASE_URLpoints at127.0.0.1:15491andREDIS_URLat127.0.0.1:16391; CI provided neither, sobeforeAllthrew,prismastayed undefined, andafterAllfailed withCannot read properties of undefined (reading 'oAuthAuthorization')— surfacing as 42 failed / 11 passed of 53. - Added Postgres 17 + Redis 7.2 service containers on exactly those ports, a
prisma db pushstep, and--runInBand. Verified in CI:Test Suites: 5 passed, 5 total,Tests: 53 passed, 53 total. The ESLint workflow remains red (eslint 8.57 cannot consume the flateslint.config.mjs); fixing it needs eslint 9 plus@typescript-eslint8.
- Root cause: the bootstrap / OAuth-consent suites throw
- Beta Runtime: DOS-Me First-Party Bootstrap 401 & Facebook Connect
client_id=undefined:- Root cause: the Beta runtime (
crove-post-betaoncrove-server) had noCROVE_POST_CLIENT_ID/CROVE_POST_CLIENT_SECRETconfigured, soBootstrapGuardfailed closed with 401 before HMAC verification;FACEBOOK_APP_ID/FACEBOOK_APP_SECRETwere also missing, producingclient_id=undefinedin the Connect Facebook URL. - Remediated by configuring
CROVE_POST_CLIENT_ID=pca_dosclaw_beta_7ef5e5f1,CROVE_POST_CLIENT_SECRET(existing OAuth client secret, no rotation) and copyingFACEBOOK_APP_ID/FACEBOOK_APP_SECRETfrom the prod env file into the Beta env file on the VM (gitignored by design viascripts/*.env). - Verified with a signed request differential: signed bootstrap → HTTP 400 (guard passed, validation rejected the test body) vs unsigned → HTTP 401 (fail-closed). No OAuth app was recreated and no token was rotated.
- Beta container recreated with the same immutable image digest; a one-off boot hang after recreate (backend blocked pre-Nest with no network sockets) was cleared by a plain
docker restart.
- Root cause: the Beta runtime (
- MCP Client Icons & Onboarding Enhancements (Upstream Sync):
- Added Nanoclaw and other third-party MCP client icons support in Public API.
- Upgraded onboarding experience and interactive modal walkthroughs.
- Post Workflow v1.1.2:
- Enhanced background workflow with automatic retry on heartbeat timeouts when no heartbeat details are present.
- Frontend & Media Modernization Roadmap:
- Expanded
ROADMAP.mdwith Crove OS visual design standards, workspace switcher overhaul, and R2 direct upload pipeline.
- Expanded
- DOS.Me Organization -> Teams Hierarchy & JIT Token Claims:
- Integrated
teamsscope (openid profile email organizations teams offline_access) into OAuth authorization links. - Added parsing for
active_org_id,organizations: [{ id, name, slug, role }], andteams: [{ id, org_id, name, slug, role }]claims inOauthProvider.getUser(). - Added documentation for Zero-Latency JIT Token Claims and Organization/Teams hierarchy in
docs/sso-architecture.md.
- Integrated
- OpenAI-Compatible API Gateway Support:
- Added dynamic configuration support for
OPENAI_BASE_URL,OPENAI_MODEL_NAME, andOPENAI_IMAGE_MODELacrossOpenaiService,CopilotController,AgentGraphService, andAutopostService.
- Added dynamic configuration support for
- Cross-Platform Chrome Extension Build System:
- Added Node.js cross-platform build script (
apps/extension/build.mjs) supporting Windows PowerShell and Linux/macOSzip. - Updated Chrome Extension Manifest V3 with expanded host permissions and externally connectable domains (
*.crove.com,*.crove.io,*.dos.me).
- Added Node.js cross-platform build script (
- Multi-Provider Subscription Architecture:
- Added
providercolumn (@default("stripe")) toSubscriptionmodel to support multi-provider billing engines (e.g. RevenueCat).
- Added
- JIT Organization Synchronization in
AuthService.checkExists():- Fixed returning users missing claim/org updates by centralizing
syncUserOrganizations()incheckExists()before issuing JWT. - Enabled canonical
orgIdinheritance during initial user/org creation increateOrgAndUser().
- Fixed returning users missing claim/org updates by centralizing
- Database Catalog & Schema Stability:
- Cleaned up orphaned dynamic Mastra catalog entries from PostgreSQL.
- Optimized database connection pool strings with
connection_limit,pool_timeout, andconnect_timeout.
- Upstream Sync:
- Merged upstream Postiz changes including Post Workflow v1.1.1, RevenueCat subscriptions, and Seedance video provider.
- Centralized DOS.Me SSO & PKCE Bridge Integration:
- Configured Generic OAuth 2.0 client authentication pointing to
https://api.dos.me/oauth/*(Production) andhttps://beta-api.dos.me/oauth/*(Beta). - Added support for dynamic
POSTIZ_OAUTH_SCOPEenvironment variable (openid profile email organizations offline_access). - Added OIDC UserInfo claim enrichment parsing (
sub,email,name,picture, andorganizations: [{ id, name, slug, role }]).
- Configured Generic OAuth 2.0 client authentication pointing to
- Autonomous AI Agent Connectivity (DOSClaw):
- Added built-in platform OAuth application support for DOSClaw agent connectors on Beta (
pca_dosclaw_beta_7ef5e5f1) and Production (pca_dosclaw_prod_18790ccb). - Implemented standard OAuth 2.0 Token Revocation endpoint (
POST /oauth/revoke, RFC 7009) withOAuthService.revokeToken(token)to invalidatepos_*tokens when agents disconnect.
- Added built-in platform OAuth application support for DOSClaw agent connectors on Beta (
- Two-Phase Hybrid Identity & Organization Sync:
- Implemented Phase 1 (JIT Organization Provisioning): Automatically provisions local workspace and assigns user roles during first-time OIDC login.
- Implemented Phase 2 (Real-Time Webhook Synchronization): Added
POST /api/webhooks/dos-org-synccontroller with HMAC-SHA256 signature verification (X-DOS-Signature) handlingorg.created,org.updated,org.deleted,org.member_added, andorg.member_removedevents.
- Database Multi-Schema Connection Pooling:
- Configured
directUrl = env("DATABASE_DIRECT_URL")inschema.prismato support Supabase/PgBouncer connection pooling. - Fully synchronized all 41 Prisma models into the dedicated
postschema on Supabase.
- Configured
- Brand Assets & UI Styling:
- Added official DOS logo SVG asset at
/icons/dos.svgand unified OAuth provider display button. - Added comprehensive English technical architecture documentation in
docs/architecture.md.
- Added official DOS logo SVG asset at
- Authentication UX & Security:
- Streamlined auth flow: Automatically display single-touch DOS ID login button when generic OAuth is active.
- Removed local email/password registration form when SSO is enforced across the ecosystem.
- CI/CD & Deployment Workflows:
- Upgraded GitHub Actions container workflows to auto-build beta images on
devpush and restrict production image builds to published tags/releases. - Standardized all deployment and automation PowerShell scripts (
scripts/*.ps1) with English comments and logs. - Updated
sync-upstream.ymlto accurately compareorigin/mainagainstupstream/mainfor automated upstream PR creation.
- Upgraded GitHub Actions container workflows to auto-build beta images on
- Legacy Web3 Wallet:
- Removed deprecated Solana Web3 wallet provider (
@solana/wallet-adapter) from login and registration interfaces in favor of the unified DOS ID embedded account-abstraction smart wallet.
- Removed deprecated Solana Web3 wallet provider (
- Standalone Cloudflare SSO Workers:
- Deprecated separate Cloudflare Worker proxies (
sso.crove.com,beta-sso.crove.com) in favor of the central PKCE Bridge embedded inapi.dos.me.
- Deprecated separate Cloudflare Worker proxies (
- Streamed media uploads pipeline.
- Duplicate-post protection mechanisms.
- Dynamic MCP registration and tool filtering.