-
Notifications
You must be signed in to change notification settings - Fork 23
Expand file tree
/
Copy pathEtherpadEcosystem.tsx
More file actions
140 lines (135 loc) · 5.47 KB
/
Copy pathEtherpadEcosystem.tsx
File metadata and controls
140 lines (135 loc) · 5.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
import Link from "next/link";
import type {IconDefinition} from "@fortawesome/fontawesome-svg-core";
import {
faCubes,
faPlug,
faDesktop,
faTerminal,
faShieldHalved,
faNetworkWired,
faDatabase,
faHouse,
faCalculator,
faKeyboard,
faRobot,
} from "@fortawesome/free-solid-svg-icons";
import {ETHERPAD_ORG} from "../Constants.ts";
type EcosystemProject = {
name: string,
url: string,
icon: IconDefinition,
description: string,
// Internal routes (e.g. /plugins) use next/link for client-side
// navigation; everything else opens the external project in a new tab.
internal?: boolean,
}
// Curated, user-facing companion projects and resources from the Etherpad
// Foundation, surfaced alongside the core editor on the homepage.
const PROJECTS: EcosystemProject[] = [
{
name: "Plugins",
url: "/plugins",
icon: faPlug,
description: "Hundreds of community plugins add features, themes and integrations. Browse the directory and extend your Etherpad however you like.",
internal: true,
},
{
name: "Desktop & Mobile App",
url: `${ETHERPAD_ORG}/etherpad-desktop`,
icon: faDesktop,
description: "Run Etherpad as a native app on Windows, macOS, Linux, Android and iOS — collaborate without opening a browser.",
},
{
name: "Command-line Client",
url: `${ETHERPAD_ORG}/etherpad-cli`,
icon: faTerminal,
description: "Create, read and edit pads straight from your terminal. Great for scripting and automating your Etherpad instance.",
},
{
name: "pad — Terminal Editor",
url: `${ETHERPAD_ORG}/pad`,
icon: faKeyboard,
description: "A nano-class terminal text editor. Edit files locally, or join any pad to collaborate in real time — your edits and everyone else's sync live, right in your terminal.",
},
{
name: "Printing Press",
url: "https://printingpress.dev",
icon: faRobot,
description: "Agent-native Etherpad tooling — a Go CLI, a Claude Code skill and an MCP server, generated from a spec so AI agents can drive Etherpad.",
},
{
name: "Etherpad Scanner",
url: "https://scanner.etherpad.org",
icon: faShieldHalved,
description: "Security-focused scanner for public Etherpad instances — check whether an instance is healthy, correctly configured and up to date.",
},
{
name: "Socket.IO Proxy",
url: `${ETHERPAD_ORG}/etherpad-proxy`,
icon: faNetworkWired,
description: "A reference proxy for Etherpad's real-time Socket.IO traffic — a starting point for inspecting or routing pad messages.",
},
{
name: "Scale Calculator",
url: "https://scale.etherpad.org",
icon: faCalculator,
description: "Estimate the CPU, memory and number of instances your deployment needs for a target number of concurrent users.",
},
{
name: "ueberDB",
url: `${ETHERPAD_ORG}/ueberDB`,
icon: faDatabase,
description: "The database abstraction layer that powers Etherpad — one API over MySQL, PostgreSQL, Redis, MongoDB, SQLite and more.",
},
{
name: "Home Assistant Add-on",
url: `${ETHERPAD_ORG}/home-assistant-addon-etherpad`,
icon: faHouse,
description: "Self-host Etherpad on your Home Assistant box in a couple of clicks — collaborative notes for your smart home.",
},
]
const CARD_CLASS = "group flex flex-col h-full p-5 rounded-lg border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-700 transition-shadow hover:shadow-md focus:shadow-md no-underline"
const CardBody = ({project}: {project: EcosystemProject}) => <>
<div className="flex items-center mb-2">
<FontAwesomeIcon icon={project.icon} className="text-2xl text-primary mr-3"/>
<span className="text-lg font-bold text-gray-800 dark:text-white group-hover:text-primary">
{project.name}
</span>
</div>
<span className="text-sm text-gray-600 dark:text-gray-300 leading-relaxed">
{project.description}
</span>
</>
export const EtherpadEcosystem = () => {
return <div className="content wrap">
<h2 className="text-3xl text-primary font-bold mb-4 mt-16 flex items-center">
<FontAwesomeIcon icon={faCubes} className="mr-4"/>
More from Etherpad
</h2>
<p className="dark:text-gray-400">
Etherpad is more than the editor. The Foundation maintains a family of official
apps, clients and tools — plus a large plugin ecosystem — to help you extend, run,
embed and scale Etherpad.
</p>
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 mt-6">
{PROJECTS.map((project) => (
project.internal ? (
<Link key={project.url} href={project.url} className={CARD_CLASS}>
<CardBody project={project}/>
</Link>
) : (
<a
key={project.url}
href={project.url}
target="_blank"
rel="noopener noreferrer"
className={CARD_CLASS}
>
<CardBody project={project}/>
</a>
)
))}
</div>
</div>
}