Files
twenty/packages/twenty-website/.env.example
T
martmull 8d84a0b9f3 feat(app): allow non-admin developers to claim and list marketplace apps (#22621)
## Context

Follow-up to #22609. Lets a non-admin developer claim ownership of a
public Twenty app they published to npm, then request a marketplace
listing that a server admin reviews. Marketplace state is per-instance
for now.

## Claiming

- Developer tab gets a **Claim an application** section: look up an
unclaimed npm app by package name or universal identifier.
- Ownership is proven with GitHub OAuth against the package's npm
provenance (trusted publishing): the connected account must own the
GitHub account or organization the package was published from.
- Errors from the GitHub callback come back as a code and are shown
inline with a link to the relevant documentation.
- The old one-click claim stays admin-only.
- A **Sync catalog** button triggers a catalog refresh instead of
waiting for the hourly cron.
- Gated behind the `IS_APP_CLAIMING_ENABLED` feature flag.

## Listing requests

- Catalog-synced apps are created **unlisted**; a data migration unlists
previously auto-listed unclaimed npm apps (owned or vetted rows are left
untouched).
- Owners request a listing from the Distribution tab (logo + description
required); a server admin approves or rejects it from a **Listing
requests** section in the Admin Panel.

## Screenshots

<img width="1512" height="829" alt="image"
src="https://github.com/user-attachments/assets/788d4362-97c4-4e42-810c-ef1f11517bec"/>
<img width="1512" height="829" alt="image"
src="https://github.com/user-attachments/assets/d6246190-c82a-4f64-87be-3bb668527645"/>
<img width="1512" height="828" alt="image"
src="https://github.com/user-attachments/assets/21a8dad4-610b-4d1f-8948-b9acab40d373"/>
<img width="1512" height="829" alt="image"
src="https://github.com/user-attachments/assets/58246130-41f7-451e-ae7f-57bd21d04bb6"/>

---------

Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-07-20 15:43:40 +00:00

46 lines
1.8 KiB
Bash

# Public site URL — canonical origin used by metadataBase, sitemap, robots,
# OG/Twitter card URLs, Stripe checkout success URL, and the billing portal
# return URL. No trailing slash. Defaults to https://twenty.com when unset.
NEXT_PUBLIC_WEBSITE_URL=
# Partner application — the form POSTs to /api/partner-application, which
# forwards the payload to this webhook with the secret as a bearer credential.
PARTNER_APPLICATION_WEBHOOK_URL=
PARTNER_APPLICATION_SECRET=
# Client brief — the form POSTs to /api/client-brief, which forwards the payload
# to this webhook with the secret as X-Application-Secret.
CLIENT_BRIEF_WEBHOOK_URL=
CLIENT_BRIEF_SECRET=
# Partners marketplace — the Twenty workspace the partner directory reads from
# (server-side only) via the /s/partners REST endpoint.
TWENTY_PARTNERS_API_URL=
TWENTY_PARTNERS_API_KEY=
# Apps marketplace — the apps directory reads the vetted marketplace catalog
# from the Twenty GraphQL API (public publicMarketplaceApps query), server-side.
# Defaults to https://api.twenty.com when unset.
TWENTY_MARKETPLACE_API_URL=
# Stripe — self-hosted enterprise checkout & subscription APIs.
STRIPE_SECRET_KEY=
STRIPE_ENTERPRISE_MONTHLY_PRICE_ID=
STRIPE_ENTERPRISE_YEARLY_PRICE_ID=
# RS256 key pair used to sign and verify enterprise license JWTs
# (use literal \n for newlines in the PEM values).
ENTERPRISE_JWT_PRIVATE_KEY=
ENTERPRISE_JWT_PUBLIC_KEY=
# Optional: enterprise validity token lifetime in days (default 30).
# ENTERPRISE_VALIDITY_TOKEN_DURATION_DAYS=
# Shared secret guarding the internal enterprise key reissue endpoint
# (POST /api/enterprise/reissue), used to regenerate an enterprise key.
ENTERPRISE_ADMIN_API_SECRET=
# Optional: GitHub Claim
# APP_CLAIM_GITHUB_CLIENT_ID=
# APP_CLAIM_GITHUB_CLIENT_SECRET=