on master help sign in
Merge pull request #1940 from urbit/gc/communities

Community Ecosystem pages

commit0d525650dee1904759ec5ae6392666c09c774e05 authorthomasurbit <99678438+thomasurbit@users.noreply.github.com> dateFri 6 Jan 2023, 14:59 (4 years ago) parent091d20c93c1f89
20 files changed+284−324
components/ecosystem/BasicPage.js+1−1 components/ecosystem/EcosystemSidebar.js+8 components/ecosystem/Post.js+9 content/applications/~fabnev-hinmur/escape.md+1−1 content/communities/urbit-austin.md+11 content/communities/urbit-berlin.md+16 content/communities/urbit-cph.md+11 content/communities/urbit-dc.md+19 content/communities/urbit-ny.md+11 content/communities/urbit-seattle.md+14 content/communities/urbit-sf.md+15 content/community/_index.md−5 content/community/community-grants.md−14 content/community/governance.md−25 content/community/hosting-a-meetup.md−82 content/community/meetups.md−49 package.json+1−2 pages/communities/[slug].js+87 pages/community/[[...slug]].js−121 pages/ecosystem/index.js+80−24
components/ecosystem/BasicPage.js+1−1
@@ -45,7 +45,7 @@ export default function BasicPage({
4545 <div className="flex items-center space-x-4">
4646 <img src={post.image} className="w-36" />
4747 <div className="flex flex-col pl-2">
48− <h1 className={classnames({ "text-3xl": section === "Podcast" }, { "text-3xl": section === "Article" })}>
48+ <h1 className="text-3xl">
4949 {post.title}
5050 </h1>
5151 <p>{section}</p>
components/ecosystem/EcosystemSidebar.js+8
@@ -30,6 +30,13 @@ export default function EcosystemSidebar() {
3030 >
3131 Spotlight
3232 </ActiveLink>
33+ <ActiveLink
34+ currentPath={currentPath}
35+ className="type-ui"
36+ href="/ecosystem?type=communities"
37+ >
38+ Communities
39+ </ActiveLink>
3340 <ActiveLink
3441 currentPath={currentPath}
3542 className="type-ui"
@@ -37,6 +44,7 @@ export default function EcosystemSidebar() {
3744 >
3845 Organizations
3946 </ActiveLink>
47+
4048 <ActiveLink
4149 currentPath={currentPath}
4250 className="type-ui"
components/ecosystem/Post.js+9
@@ -74,6 +74,15 @@ export default function Post({ post }) {
7474 </Link>
7575 )}
7676
77+ {post[feat].type === "Community" && (
78+ <Link href={href || "#"} passHref>
79+ <a class="button-sm text-white flex-col bg-green-400 cursor-pointer pr-4 w-fit">
80+ More about {post[feat].title}
81+ </a>
82+ </Link>
83+ )}
84+
85+
7786 {post[feat].type === "Marketplace" && (
7887 <Link href={href || "#"} passHref>
7988 <a class="button-sm text-white flex-col bg-green-400 cursor-pointer pr-4 w-fit">
content/applications/~fabnev-hinmur/escape.md+1−1
@@ -6,7 +6,7 @@ description = "EScape from Eternal September. The UI from Uqbar."
66license = "MIT"
77website = "https://uqbar.network"
88bgColor = "#f2f3ef"
9−image = "https://escape-app-dist.s3.us-east-2.amazonaws.com/uqbar-logo.png"
9+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/organizations/uqbar.png"
1010+++
1111
1212EScape is a fully-integrated social management and DAO Tooling system. EScape provides a simple, intuitive, and unified interface for managing groups, messaging ships, receiving notifications, and interacting with other Urbit apps.
content/communities/urbit-austin.mdnew file+11
@@ -0,0 +1,11 @@
1++++
2+title = "Urbit Austin"
3+description = ""
4+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/communities/urbit-austin.png"
5++++
6+
7+Curious about Urbit? Questions about Hoon syntax? Fed up with the current state of the internet? Join us to talk about the internet's future.
8+
9+––
10+
11+[Meetup page](https://www.meetup.com/Urbit-Austin/)
content/communities/urbit-berlin.mdnew file+16
@@ -0,0 +1,16 @@
1++++
2+title = "Urbit Berlin"
3+description = ""
4+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/communities/urbit-berlin.png"
5++++
6+
7+If you are sick of the current state of the web, of handing over your data and entire online presence to a handful of American corporations, of a web fueled with ads, then Urbit might be for you.
8+
9+Are you curious about Urbit and want to try it? Are you an Urbit OG looking to find to find others? Do you want to build your own peer-to-peer apps and leave the centralized web behind?
10+
11+We meet regularly in Berlin, and we try to have a theme or presentation for each meetup.
12+
13+
14+––
15+
16+[Meetup page](https://www.meetup.com/urbit-berlin/)
content/communities/urbit-cph.mdnew file+11
@@ -0,0 +1,11 @@
1++++
2+title = "Urbit København"
3+description = ""
4+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/communities/urbit-cph.png"
5++++
6+
7+~norsyr-torryn/nordics
8+
9+––
10+
11+[Twitter](https://twitter.com/UrbitCPH)
content/communities/urbit-dc.mdnew file+19
@@ -0,0 +1,19 @@
1++++
2+title = "DC Metro Urbit Meetup Group"
3+description = ""
4+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/communities/urbit-dc.png"
5++++
6+
7+This is a DC/Northern Virginia/Southern Maryland Urbit discussion group.
8+
9+It is for Urbit users or the urbit-curious or people who like to think and talk about decentralization, independence, and freedom on the internet.
10+
11+We will socialize, discuss urbit and related topics, and support lab and learning activities.
12+
13+Find us on urbit chat at ~tillys-fasryp/nova-urbit-meetup-lobby-3347
14+
15+––
16+
17+[Meetup page](https://www.meetup.com/dc-urbit-meetup-group/)
18+
19+[Twitter](https://twitter.com/dcurbit)
content/communities/urbit-ny.mdnew file+11
@@ -0,0 +1,11 @@
1++++
2+title = "Urbit NY"
3+description = ""
4+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/communities/urbit-ny.png"
5++++
6+
7+We love experimenting with Urbit & tinkering with Arvo, Hoon, & Nock
8+
9+––
10+
11+[Meetup page](https://www.meetup.com/Urbit-New-York/)
content/communities/urbit-seattle.mdnew file+14
@@ -0,0 +1,14 @@
1++++
2+title = "Urbit Seattle"
3+description = ""
4+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/communities/urbit-seattle.png"
5++++
6+
7+Urbit is a simple, durable computer that you own 100% and forever. In this group, we'll discuss ongoing project developments, technical details, and how to use Urbit. With occasional speakers that will present on various topics.
8+
9+
10+––
11+
12+[Meetup page](https://www.meetup.com/urbit-seattle/)
13+
14+[Twitter](https://twitter.com/SeattleUrbit)
content/communities/urbit-sf.mdnew file+15
@@ -0,0 +1,15 @@
1++++
2+title = "Urbit SF"
3+description = ""
4+image = "https://storage.googleapis.com/media.urbit.org/site/ecosystem/communities/urbit-sf.png"
5++++
6+
7+Want to own and control the server side? Your digital identity, data and computation?
8+
9+So do we — so we're building Urbit. We set this group up for anyone excited about this kind of stuff, even those who think we're totally crazy.
10+
11+Come join us to talk about what the future of the internet might look like.
12+
13+––
14+
15+[Meetup page](https://www.meetup.com/urbit-sf/)
content/community/_index.mddeleted−5
@@ -1,5 +0,0 @@
1−+++
2−title = "Community"
3−sort_by = "weight"
4−template = "list.html"
5−+++
content/community/community-grants.mddeleted−14
@@ -1,14 +0,0 @@
1−+++
2−title = "Community Grants"
3−description = "Select Urbit address space grants for your group or community."
4−weight = 3
5−[extra]
6−hideprevious = "true"
7−hidenext = "true"
8−+++
9−
10−Interested in getting your community on Urbit? We are currently accepting applications for select groups to get started on Urbit together using an [invite pool](/using/id/creating-an-invite-pool).
11−
12−To get started, fill out the application below. Any information you share will be held privately, and only for the purpose of consideration for the grant.
13−
14−<iframe src="https://docs.google.com/forms/d/e/1FAIpQLSf_uD5fUw6xqoxtzUhSwURFYO57XQl067N3vEdy7_rTD8T2VQ/viewform?embedded=true" width="640" height="1394" frameborder="0" marginheight="0" marginwidth="0">Loading…</iframe>
content/community/governance.mddeleted−25
@@ -1,25 +0,0 @@
1−+++
2−title = "Governance"
3−description = "On the governance of the project, including both the senate of galaxies and the core developers."
4−aliases = ["/governance"]
5−weight = 4
6−[extra]
7−hideprevious = "true"
8−hidenext = "true"
9−+++
10−
11−Our goal is to design Urbit simply, such that as many decisions as possible are made by the architecture of the system itself – that is, code should be law whenever possible. Code can’t anticipate every eventuality, however, and so the system design must include mechanisms that allow decisions to be made outside of the code.
12−
13−Within Urbit, this form of governance is conducted by two groups: the senate of galaxies, and the body of core developers. The senate of galaxies is empowered to make changes to the solidity contracts which define Azimuth, Urbit’s PKI, by majority vote. This process is defined by the contracts themselves.
14−
15−An owner of a galaxy (or a delegate) can propose a new iteration of the contract logic. The proposal can then be voted on for a period of thirty days. Once that period is over, if at least a quarter of the galaxies has voted, and the majority is in favor, the old logic contract will hand over the reigns to the new one.
16−
17−In a similar process, document hashes can be proposed. While their off-chain documents can't be "technically enforced", this mechanism is useful for the Senate to record more abstract decisions.
18−
19−For off-chain process around proposals, as suggested by core developers, please see [senate.md](https://github.com/urbit/azimuth/blob/master/senate).
20−
21−The group of core developers manages Urbit’s [GitHub repository](https://github.com/urbit/), which controls Arvo, Urbit’s operating system. Changes and upgrades are decided upon by consensus.
22−
23−You can participate in the governance of the senate by acquiring a galaxy. If you would like to be involved with the governance of Arvo, check out our [developer guide](/docs/development/develop) to learn how you can contribute to core development.
24−
25−
content/community/hosting-a-meetup.mddeleted−82
@@ -1,82 +0,0 @@
1−+++
2−title = "Hosting a Meetup"
3−description = "Best practices for hosting your Urbit meetups."
4−weight = 2
5−[extra]
6−flatten_pagination = "true"
7−hidenext = "true"
8−hide_previous_title = "true"
9−+++
10−
11−There are already [a few](/community/meetups) Urbit meetups that take place in cities around the United States. Want to start a meetup in your home town? Consider these best practices.
12−
13−### Create the Meetup Group Online
14−
15−The most straightforward way to start a meetup group online, like on [meetup.com](www.meetup.com). Services like this offer messaging, calendaring, payments, discussion boards, and basic group profiles.
16−
17−There are other options available but, regardless of what you choose, there should be a public place on the Web for people to access the group.
18−
19−Group suggestions:
20−
21−- Meetup.com
22−- Google groups
23−- Dedicated Website
24−
25−### Spread the word
26−
27−It’s not much fun if people don’t actually show up, so it’s important to get the word out. Use your existing network to tell people about your event. Remember it takes time to build a community, so don’t be discouraged if only a few people show up at first. Post to social media and email your friends. Also, be sure to email [support@urbit.org](mailto:support@urbit.org), and we'll promote your meetup.
28−
29−Outreach methods:
30−
31−- Post to social media
32−- Email your friends
33−- Put up signs
34−
35−### Format
36−
37−Meetups are about sharing ideas and meeting like-minded people. There are a few formats that can help achieve this goal. As the organizer, take the lead and prepare ahead of time. Think of some topics for the group to discuss, and try to ensure that the conversation isn’t dominated by one or two people.
38−
39−Presentations and guided group discussions are great ways to share ideas. If you have a speaker for your event, coordinate ahead of time and make sure they have everything they will need to make a great presentation and ask them to arrive early to the event. If you have a speaker, be sure to record the talk so that it can be posted online.
40−
41−Format considerations:
42−
43−- Guided group discussion
44−- Presentation
45−
46−### Venue
47−
48−Your meeting location can determine the success of your event. Ideally, you’d want to be away from congested areas and find locations with good parking and transit options nearby. However, this isn’t always possible, so just do your best to accommodate. It’s also a good idea to locate the event near bars or restaurants so people can continue the conversation after the event officially ends.
49−
50−Location considerations:
51−
52−- Easily reachable
53−- Consider parking and distance to transit
54−- Check out public libraries
55−- Coworking spaces
56−- [peerspace.com](https://www.peerspace.com/)
57−
58−### Date and time
59−
60−Most people are able to attend meetups after work on non-holiday weekdays, between about 6-8pm. This isn’t true for everyone but it’s a good rule of thumb. It’s also a good idea to avoid holidays and days when there are large sporting events happening.
61−
62−Date considerations:
63−
64−- Weekdays
65−- Between 6pm and 8pm
66−- Avoid holidays and weekends
67−
68−### Stay consistent
69−
70−Like basically anything worth doing, meetups take time, patience, and consistency. Come prepared to engage with people and have a good time. The more often you can meet the stronger the community can become, so schedule meetups regularly.
71−
72−### Bonus
73−
74−Here are a few tips and tricks to consider with hosting a meetup. You don’t have to have all these things at your first meeting, but try adding them in as you go.
75−
76−- Names tags
77−- Door signs
78−- Projector
79−- Extension cords and power strips
80−- Video camera
81−- Lapel microphone
82−- Bring your own internet
content/community/meetups.mddeleted−49
@@ -1,49 +0,0 @@
1−+++
2−title = "Meetups"
3−aliases = ["/meetups"]
4−description = "Information on Urbit meetups and other community-led, Urbit IRL groups."
5−weight = 1
6−[extra]
7−flatten_pagination = "true"
8−hideprevious = "true"
9−hide_next_title = "true"
10−+++
11−
12−![](https://media.urbit.org/site/meetup1.jpg)
13−
14−Turns out that getting Urbit fans together in one room is pretty fun. Here's an incomplete list of community-led Urbit IRL groups. These events are generally informal and very approachable – feel free to dive in.
15−
16−Interested in hosting an Urbit event of your own? Follow our [guide to meetup best-practices](/community/hosting-a-meetup). Send an email to [support@urbit.org](mailto:support@urbit.org) and we'll list your meetup on this page.
17−
18−### Asia
19−
20−| Location | Contact information |
21−| :--------- | :------------------------------------------------ |
22−| Moscow, RU | [Timepad](https://urbitmoscow.timepad.ru/events/) |
23−
24−### Europe
25−
26−| Location | Contact information |
27−| :------------- | :---------------------------------------------------------------------------------------------- |
28−| Copenhagen, DK | [Twitter](https://twitter.com/UrbitCPH), [Meetup.com](https://www.meetup.com/Urbit-Copenhagen/) |
29−| Berlin, DE | [Meetup.com](https://www.meetup.com/urbit-berlin/) |
30−
31−### North America
32−
33−| Location | Contact information |
34−| :---------------- | :----------------------------------------------------------------------------------------------- |
35−| Phoenix, AZ | [Twitter](https://twitter.com/UrbitPHX), [Meetup.com](https://www.meetup.com/urbit-phx/) |
36−| San Francisco, CA | [Meetup.com](https://www.meetup.com/urbit-sf/) |
37−| New York, NY | [Meetup.com](https://www.meetup.com/Urbit-New-York/) |
38−| Toronto, ON | [Twitter](https://twitter.com/UrbitToronto), [Meetup.com](https://www.meetup.com/Urbit-Toronto/) |
39−| Eugene, OR | [Twitter](https://twitter.com/EugeneUrbit) |
40−| Austin, TX | [Meetup.com](https://www.meetup.com/Urbit-Austin/) |
41−| Denton, TX | [Twitter](https://twitter.com/UrbitDFW) |
42−| Seattle, WA | [Twitter](https://twitter.com/SeattleUrbit), [Meetup.com](https://www.meetup.com/urbit-seattle/) |
43−| DC/NoVA/MD | [Twitter](https://twitter.com/dcurbit), [Meetup.com](https://www.meetup.com/dc-urbit-meetup-group/) |
44−
45−### Oceania
46−
47−| Location | Contact information |
48−| :--------- | :------------------------------------------------ |
49−| Sydney, AU | [Meetup.com](https://www.meetup.com/Urbit-Sydney) |
package.json+1−2
@@ -7,8 +7,7 @@
77 "build": "next build",
88 "export": "npm run prebuild && next build && next export",
99 "start": "next start",
10− "prebuild": "npm run cache-posts && npm run rss && npm run glossary && npm run community-tree && npm run getting-started-tree && npm run overview-tree",
11− "community-tree": "node lib/buildPageTree community weight",
10+ "prebuild": "npm run cache-posts && npm run rss && npm run glossary && npm run getting-started-tree && npm run overview-tree",
1211 "getting-started-tree": "node lib/buildPageTree getting-started weight",
1312 "overview-tree": "node lib/buildPageTree overview weight",
1413 "cache-posts": "node lib/cache.js",
pages/communities/[slug].jsnew file+87
@@ -0,0 +1,87 @@
1+import BasicPage from "../../components/ecosystem/BasicPage";
2+import {
3+ Markdown,
4+ getAllPosts,
5+ getPostBySlug,
6+ getPostSlugs,
7+} from "@urbit/foundation-design-system";
8+import Link from "next/link";
9+
10+export default function Community({
11+ post,
12+ markdown,
13+ search,
14+ index,
15+ spotlights = [],
16+}) {
17+ return (
18+ <BasicPage
19+ section="Community"
20+ post={post}
21+ markdown={markdown}
22+ search={search}
23+ index={index}
24+ >
25+ {spotlights.length > 0 && (
26+ <p>
27+ Featured in{" "}
28+ {spotlights.map((e, i) => (
29+ <>
30+ {i ? ", " : ""}
31+ <Link href={`/ecosystem/spotlight/${e.slug}`}>{e.title}</Link>
32+ </>
33+ ))}
34+ </p>
35+ )}
36+
37+ <p>––</p>
38+ <p>Interested in starting an Urbit meetup? <a href="/grants/community-meetups">Learn more here</a>.</p>
39+ </BasicPage>
40+ );
41+}
42+
43+export async function getStaticProps({ params }) {
44+ const post = getPostBySlug(
45+ params.slug,
46+ ["title", "description", "slug", "image", "content"],
47+ "communities"
48+ );
49+
50+ const spotlights = getAllPosts(
51+ ["title", "slug", "featured-1", "featured-2", "featured-3"],
52+ "ecosystem/spotlight"
53+ ).filter(
54+ (e) =>
55+ e?.["featured-1"]?.title === post.title ||
56+ e?.["featured-2"]?.title === post.title ||
57+ e?.["featured-3"]?.title === post.title
58+ );
59+
60+ let { index } = post?.extra || { index: null };
61+
62+ if (index === undefined) {
63+ index = null;
64+ }
65+
66+ const markdown = JSON.stringify(Markdown.parse({ post }));
67+ return {
68+ props: { post, markdown, spotlights, index },
69+ };
70+}
71+
72+export async function getStaticPaths() {
73+ const posts = getPostSlugs("communities");
74+
75+ const slugs = posts.map((e) => e.slice(0, -3));
76+
77+ return {
78+ paths: slugs.map((post) => {
79+ return {
80+ params: {
81+ slug: post,
82+ },
83+ };
84+ }),
85+ fallback: false,
86+ };
87+}
pages/community/[[...slug]].jsdeleted−121
@@ -1,121 +0,0 @@
1−import Head from "next/head";
2−import Link from "next/link";
3−import { useRouter } from "next/router";
4−import classnames from "classnames";
5−import { join } from "path";
6−import Meta from "../../components/Meta";
7−import { Markdown, getPage } from "@urbit/foundation-design-system";
8−import ContentArea from "../../components/ContentArea";
9−import Sidebar from "../../components/DocsSidebar";
10−import communityTree from "../../cache/community.json";
11−
12−const breadcrumbs = (posts, paths) => {
13− const results = [
14− <Link href="/">Urbit</Link>,
15− <span className="px-1">/</span>,
16− <Link href="/community">Community</Link>,
17− ];
18− let thisLink = "/community";
19− for (const path of paths) {
20− posts = posts.children[path];
21− thisLink = join(thisLink, path);
22− results.push(
23− <span className="px-1">/</span>,
24− <Link href={thisLink}>{posts.title}</Link>
25− );
26− }
27− return results;
28−};
29−
30−const childPages = (thisLink, children, level = 0) => (
31− <ul className="pl-1">
32− {children?.map((child) => (
33− <li>{pageTree(join(thisLink, child.slug), child, level)}</li>
34− ))}
35− </ul>
36−);
37−
38−const pageTree = (thisLink, tree, level = 0) => {
39− const router = useRouter();
40−
41− const isThisPage = router.asPath === thisLink;
42−
43− const pageItemClasses = classnames({
44− "pl-4 text-wall-600 text-base hover:text-green-400": level === 0,
45− "pl-8 text-wall-600 text-base hover:text-green-400": level === 1,
46− "pl-12 text-wall-600 text-base hover:text-green-400": level === 2,
47− "dot relative": isThisPage,
48− "text-green-400": isThisPage,
49− });
50−
51− return (
52− <>
53− <Link href={thisLink}>
54− <a className={`${pageItemClasses} cursor-pointer`}>{tree.title}</a>
55− </Link>
56− </>
57− );
58−};
59−
60−export default function UsingLayout({ posts, data, markdown, params, search }) {
61− return (
62− <>
63− <Head>
64− <title>{data.title} • Community</title>
65− {Meta(data)}
66− </Head>
67− <div className="flex h-screen min-h-screen w-screen sidebar">
68− <Sidebar search={search}>
69− {childPages("/community", posts.pages)}
70− </Sidebar>
71− <ContentArea
72− breadcrumbs={breadcrumbs(posts, params.slug?.slice(0, -1) || "")}
73− title={data.title}
74− search={search}
75− section={"Community"}
76− params={params}
77− >
78− <div className="markdown">
79− <Markdown.render content={JSON.parse(markdown)} />
80− </div>
81− </ContentArea>
82− </div>
83− </>
84− );
85−}
86−
87−export async function getStaticProps({ params }) {
88− const posts = communityTree;
89−
90− const { data, content } = getPage(
91− join(process.cwd(), "content/community", params.slug?.join("/") || "/")
92− );
93−
94− const markdown = JSON.stringify(Markdown.parse({ post: { content } }));
95−
96− return { props: { posts, data, markdown, params } };
97−}
98−
99−export async function getStaticPaths() {
100− const posts = communityTree;
101−
102− const slugs = [];
103−
104− const allHrefs = (thisLink, tree) => {
105− slugs.push(thisLink, ...tree.pages.map((e) => join(thisLink, e.slug)));
106− allHrefsChildren(thisLink, tree.children);
107− };
108−
109− const allHrefsChildren = (thisLink, children) => {
110− Object.entries(children).map(([childSlug, child]) => {
111− allHrefs(join(thisLink, childSlug), child);
112− });
113− };
114−
115− allHrefs("/community", posts);
116−
117− return {
118− paths: slugs,
119− fallback: false,
120− };
121−}
pages/ecosystem/index.js+80−24
@@ -32,7 +32,8 @@ export default function Ecosystem({
3232 marketplaces,
3333 organizations,
3434 podcasts,
35− articles
35+ articles,
36+ communities
3637}) {
3738 const router = useRouter();
3839
@@ -53,6 +54,9 @@ export default function Ecosystem({
5354 case "applications":
5455 title = "Applications • Ecosystem";
5556 break;
57+ case "communities":
58+ title = "Communities • Ecosystem";
59+ break;
5660 case "applications":
5761 title = "Groups • Ecosystem";
5862 break;
@@ -124,10 +128,9 @@ export default function Ecosystem({
124128 {/* Ecosystem type layouts */}
125129 <div
126130 className={classnames("grid gap-12 w-full", {
127− "grid-cols-2 md:grid-cols-3": type == "organizations" || type == "marketplaces",
128131 "grid-cols-1": type === "podcasts" || type === "articles",
129132 "grid-cols-1 md:grid-cols-1 lg:grid-cols-1 xl:grid-cols-2":
130− type === "applications" || type === "groups",
133+ type === "applications" || type === "groups" || type === "communities" || type === "organizations" || type === "marketplaces",
131134 hidden: spotlight,
132135 })}
133136 >
@@ -138,6 +141,9 @@ export default function Ecosystem({
138141 {type === "applications" &&
139142 <Applications dir={applications} />
140143 }
144+ {type === "communities" &&
145+ <Communities dir={communities} />
146+ }
141147 {type === "groups" &&
142148 <Groups dir={groups} />
143149 }
@@ -161,16 +167,6 @@ export default function Ecosystem({
161167 );
162168}
163169
164−const Organizations = ({ dir }) => {
165− return dir.map((org) => (
166− <Link href={`/organizations/${org.slug}`}>
167− <div className="flex flex-col space-y-4 items-center cursor-pointer hover:opacity-90">
168− <img className="w-36 rounded-xl" src={org.image} />
169− <p className="text-center font-bold">{org.title}</p>
170− </div>
171− </Link>
172− ))
173−}
174170
175171const Applications = ({ dir }) => {
176172 return dir.map((app) => (
@@ -230,16 +226,6 @@ const Groups = ({ dir }) => {
230226 ))
231227}
232228
233−const Marketplaces = ({ dir }) => {
234− return dir.map((market) => (
235− <Link href={`/marketplaces/${market.slug}`}>
236− <div className="flex flex-col space-y-4 justify-center items-center cursor-pointer hover:opacity-90">
237− <img className="w-36 rounded-xl" src={market.image} />
238− <p className="text-center font-bold">{market.title}</p>
239− </div>
240− </Link>
241− ))
242−}
243229
244230const Podcasts = ({ dir }) => {
245231 return dir.map((pod) => (
@@ -279,6 +265,74 @@ const Articles = ({ dir }) => {
279265 ))
280266}
281267
268+const Communities = ({ dir }) => {
269+ return dir.map((community) => (
270+ <Link href={`/communities/${community.slug}`}>
271+ <div className="flex space-x-4 items-center cursor-pointer hover:opacity-90">
272+ <div className="h-36 w-36 rounded-xl items-center justify-center shrink-0 overflow-hidden">
273+ <img
274+ className="items-center h-36 w-36"
275+ src={community.image}
276+ />
277+ </div>
278+ <div className="">
279+ <p className="text-left font-bold">{community.title}</p>
280+ <p className="text-left text-wall-400 font-light">
281+ {community.description}
282+ </p>
283+ </div>
284+ </div>
285+ </Link>
286+ ))
287+}
288+
289+
290+const Marketplaces = ({ dir }) => {
291+ return dir.map((market) => (
292+ <Link href={`/marketplaces/${market.slug}`}>
293+ <div className="flex space-x-4 items-center cursor-pointer hover:opacity-90">
294+ <div className="h-36 w-36 rounded-xl items-center justify-center shrink-0 overflow-hidden">
295+ <img
296+ className="items-center h-36 w-36"
297+ src={market.image}
298+ />
299+ </div>
300+ <div className="">
301+ <p className="text-left font-bold">{market.title}</p>
302+ <p className="text-left text-wall-400 font-light">
303+ {market.description}
304+ </p>
305+ </div>
306+ </div>
307+ </Link>
308+ ))
309+}
310+
311+const Organizations = ({ dir }) => {
312+ return dir.map((org) => (
313+ <Link href={`/organizations/${org.slug}`}>
314+ <div className="flex space-x-4 items-center cursor-pointer hover:opacity-90">
315+ <div className="h-36 w-36 rounded-xl items-center justify-center shrink-0 overflow-hidden">
316+ <img
317+ className="items-center h-36 w-36"
318+ src={org.image}
319+ />
320+ </div>
321+ <div className="">
322+ <p className="text-left font-bold">{org.title}</p>
323+ <p className="text-left text-wall-400 font-light">
324+ {org.description}
325+ </p>
326+ </div>
327+ </div>
328+ </Link>
329+ ))
330+}
331+
332+
333+
334+
335+
282336
283337export async function getStaticProps() {
284338 const posts = getAllPosts(
@@ -292,6 +346,7 @@ export async function getStaticProps() {
292346 "date"
293347 )[0]);
294348 const marketplaces = getAllPosts(["title", "image", "slug"], "marketplaces");
349+ const communities = getAllPosts(["title", "image", "slug", "description"], "communities");
295350 const podcasts = getAllPosts(
296351 ["title", "image", "date", "podcast", "slug"],
297352 "podcasts",
@@ -354,7 +409,8 @@ export async function getStaticProps() {
354409 marketplaces,
355410 podcasts,
356411 organizations,
357− articles
412+ articles,
413+ communities
358414 },
359415 };
360416}