Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,2 +1,13 @@
# The Graph (optional — falls back to hardcoded values)
THEGRAPH_API_KEY=

# TinaCMS — required for the /admin editor and production build
# Get these from your project at https://app.tina.io
# Copy this block into `.env` (NOT `.env.local`). Tina's CLI only auto-loads `.env`.
NEXT_PUBLIC_TINA_CLIENT_ID=
TINA_TOKEN=
# Branch Tina edits commit to. Locally usually "main"; Vercel auto-sets per deploy.
NEXT_PUBLIC_TINA_BRANCH=main
# Search indexer token (different token type from TINA_TOKEN). Create via
# Tokens → New Token → Search in the Tina dashboard.
NEXT_PUBLIC_TINA_SEARCH_TOKEN=
12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,15 @@ img/
.vscode/
*.code-workspace
.playwright-mcp/

# tinacms — commit only the schema artifacts Tina Cloud reads from main.
# `client.ts` and `types.ts` embed the build-time TINA_TOKEN, so leave them
# uncommitted; they regenerate on every `tinacms dev` / `tinacms build`.
/tina/__generated__/*
!/tina/__generated__/_graphql.json
!/tina/__generated__/_lookup.json
!/tina/__generated__/_schema.json
!/tina/__generated__/frags.gql
!/tina/__generated__/queries.gql
!/tina/__generated__/schema.gql
/public/admin/
1 change: 1 addition & 0 deletions .npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node-linker=hoisted
2 changes: 2 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
pnpm-lock.yaml
tina/__generated__/
public/admin/
2 changes: 1 addition & 1 deletion components/ecosystem/EcosystemDetail.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ export default function EcosystemDetail({ app, html }: Props) {
<div className="flex h-20 w-20 shrink-0 items-center justify-center overflow-hidden rounded-2xl border border-white/[0.08] bg-white/[0.06]">
{app.logo ? (
<img
src={`/ecosystem/${app.logo}`}
src={app.logo}
alt={`${app.name} logo`}
className="h-14 w-14 rounded-lg object-contain"
style={
Expand Down
2 changes: 1 addition & 1 deletion components/ecosystem/EcosystemListingClient.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ export default function EcosystemListingClient({
<div className="flex h-14 w-14 items-center justify-center overflow-hidden rounded-xl bg-white/[0.06]">
{app.logo ? (
<img
src={`/ecosystem/${app.logo}`}
src={app.logo}
alt={`${app.name} logo`}
className="h-10 w-10 rounded-lg object-contain"
style={
Expand Down
2 changes: 1 addition & 1 deletion content/ecosystem/blueclaw.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ description: OpenAI-compatible inference for autonomous agents — flat-rate pri
categories:
- Agents
- API
logo: blueclaw.webp
logo: /ecosystem/blueclaw.webp
order: 4
madeBy: OpenClaw
twitter:
Expand Down
2 changes: 1 addition & 1 deletion content/ecosystem/daydream.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ categories:
- AI Video
- Generative
- API
logo: daydream.svg
logo: /ecosystem/daydream.svg
order: 1
madeBy: Livepeer Inc
twitter: https://x.com/DaydreamLiveAI
Expand Down
2 changes: 1 addition & 1 deletion content/ecosystem/embody.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ description: Open-source network for embodied AI avatars — real-time tutoring,
categories:
- AI Video
- Agents
logo: embody.svg
logo: /ecosystem/embody.svg
order: 7
madeBy: DeFine + Dane
twitter:
Expand Down
2 changes: 1 addition & 1 deletion content/ecosystem/flipsuite.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ categories:
- Community
- Agents
- API
logo: flipsuite.png
logo: /ecosystem/flipsuite.png
order: 6
madeBy: Flipsuite
twitter: https://x.com/flipsuitexyz
Expand Down
2 changes: 1 addition & 1 deletion content/ecosystem/frameworks.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ categories:
- Streaming
- Self-hosted
- API
logo: frameworks.svg
logo: /ecosystem/frameworks.svg
order: 2
madeBy: DDVTech
twitter: https://x.com/GetFrames
Expand Down
2 changes: 1 addition & 1 deletion content/ecosystem/higher.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ categories:
- Streaming
- Community
- Decentralized
logo: higher-zip.svg
logo: /ecosystem/higher-zip.svg
order: 10
madeBy:
twitter: https://x.com/higheronchain
Expand Down
2 changes: 1 addition & 1 deletion content/ecosystem/livepeer-studio.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ description: Real-time interactive streaming platform — live video, VOD, and t
categories:
- Streaming
- API
logo: livepeer-studio.png
logo: /ecosystem/livepeer-studio.png
order: 5
madeBy: Livepeer Inc
twitter: https://twitter.com/livepeerstudio
Expand Down
2 changes: 1 addition & 1 deletion content/ecosystem/nytv.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ description: Independent 24/7 live television station streaming culture and prog
categories:
- Streaming
- Community
logo: nytv-live.jpg
logo: /ecosystem/nytv-live.jpg
order: 11
madeBy:
twitter: https://twitter.com/NYTV_
Expand Down
2 changes: 1 addition & 1 deletion content/ecosystem/spritz.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ categories:
- Streaming
- Community
- Decentralized
logo: spritz.svg
logo: /ecosystem/spritz.svg
order: 13
madeBy: Spritz
twitter: https://x.com/spritzchat
Expand Down
2 changes: 1 addition & 1 deletion content/ecosystem/streamplace.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ categories:
- Streaming
- Decentralized
- API
logo: stream-place.png
logo: /ecosystem/stream-place.png
order: 3
madeBy: Aquareum Inc
twitter:
Expand Down
2 changes: 1 addition & 1 deletion content/ecosystem/thelotradio.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ description: Independent 24/7 online radio broadcasting live DJ sets from a ship
categories:
- Streaming
- Music
logo: thelotradio.svg
logo: /ecosystem/thelotradio.svg
logoBg: "#FFFFFF"
order: 8
madeBy: The Lot Radio
Expand Down
2 changes: 1 addition & 1 deletion content/ecosystem/tribesocial.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ description: Custom branded community apps with courses, live calls, and payment
categories:
- Streaming
- Community
logo: tribesocial.webp
logo: /ecosystem/tribesocial.webp
order: 9
madeBy: Tribe Social
twitter: https://twitter.com/TribeSocialApp
Expand Down
2 changes: 1 addition & 1 deletion content/ecosystem/ufo.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ categories:
- Streaming
- Music
- Community
logo: ufo-fm.svg
logo: /ecosystem/ufo-fm.svg
order: 12
madeBy:
twitter:
Expand Down
10 changes: 9 additions & 1 deletion eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,15 @@ const compat = new FlatCompat({
});

const eslintConfig = [
{ ignores: [".next/", "node_modules/", "next-env.d.ts"] },
{
ignores: [
".next/",
"node_modules/",
"next-env.d.ts",
"tina/__generated__/",
"public/admin/",
],
},
...compat.extends("next/core-web-vitals", "next/typescript", "prettier"),
{
rules: {
Expand Down
10 changes: 9 additions & 1 deletion lib/ecosystem.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,14 @@ function normalize(value: unknown): string | undefined {
return trimmed.length > 0 ? trimmed : undefined;
}

// Tina's image field writes a full public path (e.g. /ecosystem/foo.svg).
// Older entries store just the filename. Return the full URL path for both.
function normalizeLogo(value: unknown): string | undefined {
const v = normalize(value);
if (!v) return undefined;
return v.startsWith("/") ? v : `/ecosystem/${v}`;
}

export function getAppSlugs(): string[] {
return fs
.readdirSync(ECOSYSTEM_DIR)
Expand Down Expand Up @@ -63,7 +71,7 @@ export function getAppBySlug(slug: string): EcosystemApp {
hostname,
description: data.description ?? "",
categories: Array.isArray(data.categories) ? data.categories : [],
logo: normalize(data.logo),
logo: normalizeLogo(data.logo),
logoBg: normalize(data.logoBg),
madeBy: normalize(data.madeBy),
twitter: normalize(data.twitter),
Expand Down
6 changes: 6 additions & 0 deletions next.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@ const nextConfig: NextConfig = {
};
return config;
},
async rewrites() {
return [
// Serve the Tina admin SPA at /admin (file lives at public/admin/index.html)
{ source: "/admin", destination: "/admin/index.html" },
];
},
async redirects() {
return [
// Old livepeer.org routes → new site equivalents
Expand Down
10 changes: 8 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@
"private": true,
"packageManager": "pnpm@10.33.0",
"scripts": {
"dev": "next dev",
"build": "next build",
"dev": "tinacms dev -c \"next dev\"",
"dev:next": "next dev",
"build": "tinacms build && next build",
"start": "next start",
"lint": "eslint . --max-warnings 0",
"typecheck": "tsc --noEmit --incremental false",
Expand All @@ -14,6 +15,7 @@
"build:brand-kit": "node scripts/build-brand-kit.mjs"
},
"dependencies": {
"@tinacms/cli": "^2.3.1",
"framer-motion": "^11.15.0",
"gray-matter": "^4.0.3",
"lucide-react": "^1.6.0",
Expand All @@ -26,6 +28,7 @@
"rehype-stringify": "^10.0.1",
"remark-parse": "^11.0.0",
"remark-rehype": "^11.1.2",
"tinacms": "^3.8.1",
"unified": "^11.0.5"
},
"devDependencies": {
Expand All @@ -41,5 +44,8 @@
"prettier": "^3.8.1",
"tailwindcss": "^4.0.0",
"typescript": "^5.7.0"
},
"pnpm": {
"onlyBuiltDependencies": ["better-sqlite3", "esbuild", "sharp"]
}
}
Loading