16e5d2b9d0
<img width="1335" height="570" alt="image" src="https://github.com/user-attachments/assets/85bbe656-7525-4800-9ae6-bc59445ccf48" /> <img width="1512" height="723" alt="image" src="https://github.com/user-attachments/assets/6494c539-a3e0-4e95-9df5-ee7559c098ab" /> <img width="1512" height="813" alt="image" src="https://github.com/user-attachments/assets/4cb6adea-d35b-470a-9bfd-d47b2a514e8c" /> <img width="1512" height="739" alt="image" src="https://github.com/user-attachments/assets/757ea3e0-bff9-4482-9a71-3e75949fd7e7" /> <img width="1468" height="790" alt="image" src="https://github.com/user-attachments/assets/37365c56-47ae-4f08-a40f-32e5600a6c0f" /> ## What Adds a public `/apps` marketplace on twenty-website listing the vetted, Twenty-built apps. Each app card and detail page has a one-click Install button that deep-links to the in-app available-application page (`app.twenty.com/settings/applications/available/:universalIdentifier`), where authentication and permission consent are handled before installing. - New apps directory (`/apps`) and per-app detail pages (`/apps/[slug]`), with a category filter - Routing/sitemap entry for `/apps` and an Apps link in the Resources menu - The catalog is fetched from the Twenty GraphQL API (public `publicMarketplaceApps` / `publicMarketplaceAppDetail` queries), defaulting to `api.twenty.com`, and degrades to an empty state on failure. No app info is duplicated in the website; logos and screenshots come from the catalog's CDN URLs. ## Dependency This is the website half of the split. It consumes the public queries added in the server PR #22647, which should merge first. --------- Signed-off-by: Parship Chowdhury <parshipchowdhury@gmail.com> Co-authored-by: martmull <martin@twenty.com> Co-authored-by: Paul Rastoin <45004772+prastoin@users.noreply.github.com> Co-authored-by: nitin <142569587+ehconitin@users.noreply.github.com> Co-authored-by: Aressand <97886962+Aressand@users.noreply.github.com> Co-authored-by: Brahm Lower <bplower@gmail.com> Co-authored-by: Thomas Trompette <thomas.trompette@sfr.fr> Co-authored-by: Etienne <45695613+etiennejouan@users.noreply.github.com> Co-authored-by: Parship Chowdhury <parshipchowdhury@gmail.com> Co-authored-by: Raphaël Bosi <71827178+bosiraphael@users.noreply.github.com> Co-authored-by: Charles Bochet <charlesBochet@users.noreply.github.com> Co-authored-by: Félix Malfait <felix.malfait@gmail.com> Co-authored-by: Pratik Mahajan <Pratik@mahajan.xyz> Co-authored-by: neo773 <neo773@protonmail.com> Co-authored-by: Deepak kumar maharana <100968930+deep231w@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: github-actions <github-actions@twenty.com> Co-authored-by: Marie <51697796+ijreilly@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: neo773 <62795688+neo773@users.noreply.github.com>
37 lines
1.5 KiB
Bash
37 lines
1.5 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=
|
|
|
|
# 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=
|