Skip to content

Commit 001d6ed

Browse files
committed
Add constitution
1 parent 3ed3eec commit 001d6ed

File tree

6 files changed

+153
-2
lines changed

6 files changed

+153
-2
lines changed

web/pages/about.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {LovePage} from 'web/components/love-page'
22
import {ReactNode} from "react";
3+
import Link from "next/link";
34

45

56
export const AboutBlock = (props: {
@@ -58,8 +59,8 @@ export default function About() {
5859

5960
<AboutBlock
6061
title="Democratic"
61-
text={<span>Governed by the community, while ensuring no drift through our <a href="/constitution"
62-
className="text-blue-600 dark:text-blue-400">constitution</a>.</span>}
62+
text={<span>Governed by the community, while ensuring no drift through our <Link href="/constitution"
63+
className="text-blue-600 dark:text-blue-400">constitution</Link>.</span>}
6364
/>
6465

6566
<AboutBlock

web/pages/constitution.tsx

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import React from 'react';
2+
import ReactMarkdown from 'react-markdown';
3+
import {LovePage} from "web/components/love-page";
4+
import {Col} from "web/components/layout/col";
5+
6+
import fs from 'fs';
7+
import path from 'path';
8+
9+
export async function getStaticProps() {
10+
const filePath = path.join(process.cwd(), 'public', 'md', 'constitution.md');
11+
const content = fs.readFileSync(filePath, 'utf8');
12+
return { props: { content } };
13+
}
14+
15+
type Props = { content: string };
16+
17+
export default function Constitution({ content }: Props) {
18+
return (
19+
<LovePage trackPageView={'test'}>
20+
<Col className="items-center">
21+
<Col className={'bg-canvas-0 w-full rounded px-3 py-4 sm:px-6 space-y-4'}>
22+
<ReactMarkdown>{content}</ReactMarkdown>
23+
</Col>
24+
</Col>
25+
</LovePage>
26+
);
27+
}

web/pages/privacy.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {supportEmail} from "../../old/lib/client/constants";
22
import {LovePage} from "web/components/love-page";
33

4+
// TODO: convert to MarkDown for better readability during modifications?
45
export default function PrivacyPage() {
56
return (
67
<LovePage

web/pages/terms.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {supportEmail} from "../../old/lib/client/constants";
22
import {LovePage} from "web/components/love-page";
33

4+
// TODO: convert to MarkDown for better readability during modifications?
45
export default function TermsPage() {
56
return (
67
<LovePage

web/public/md/constitution.md

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
# Constitution of the Compass Community
2+
3+
## Preamble
4+
We, the community of Compass, commit to building and maintaining this project in the public interest, ensuring it remains open, collaborative, and resistant to centralized capture. We adopt this constitution to govern ourselves democratically, protect the integrity of the project, and ensure fair participation.
5+
6+
7+
## Article I: Purpose and Values
8+
9+
1. **Purpose** — To develop and maintain Compass as an open-source project for the benefit of its users and contributors.
10+
2. **Core Values** — Openness, transparency, collaboration, democratic participation, anti-capture safeguards.
11+
12+
13+
## Article II: Membership Levels
14+
15+
1. **Definition**
16+
1. A *User* is any individual who has an account.
17+
2. A *Member* is any individual who meets and maintains the eligibility criteria defined in this Article.
18+
3. An *Administrator* is a specific type of *Member* which has more power and write access to the code.
19+
2. **Eligibility**
20+
1. To become a Member with voting rights, an individual must:
21+
- Have a 1:1 with a current member.
22+
- Contribute meaningfully to the project (code, documentation, design, outreach, community moderation) for a minimum of 20 hours.
23+
- Be approved by the Membership Committee (see Article IV) by a **supermajority vote**.
24+
- To become an Administrator, all current Administrators must unanimously vote for them to have the role.
25+
3. **Provisional Members** — New participants can join discussions but cannot vote until they have met the criteria.
26+
4. **Loss of Membership** — Members may be removed for:
27+
- Sustained inactivity (e.g., less than 10 hours of contribution for 12 months).
28+
- Proven bad-faith conduct (vote manipulation, harassment, sabotage). Removal requires a **2/3 vote** of Members.
29+
30+
31+
## Article III: Governance Structure
32+
33+
### Section 1: Interim Governance
34+
- Until the community reaches **5 voting members**, governance decisions shall be made by **unanimous agreement** of the *Founding Maintainers*.
35+
- The Founding Maintainers may appoint temporary coordinators for specific tasks.
36+
- Once the community reaches **5 voting members**, leadership positions will be filled via community election as described below.
37+
38+
### Section 2: Democratic Governance
39+
1. **Voting Power** — One Member = one vote.
40+
2. **Quorum** — At least **40%** of active Members must participate for a vote to be valid.
41+
3. **Decision Thresholds**:
42+
- **Simple majority (50%+1)** — Day-to-day operational decisions.
43+
- **Supermajority (2/3)** — Constitutional amendments, membership approvals/removals, major funding decisions, and changes to project scope.
44+
4. **Deliberation Period** — All proposals must be open for discussion for at least **7 days** before voting begins.
45+
5. All administrators have veto power on votes.
46+
6. Users can submit feedback and vote on our Feedback Form but this is not an official vote, it is for Members and Administrators to consider.
47+
48+
49+
## Article IV: Committees
50+
51+
1. **Membership Committee** — Reviews applications, handles disputes over eligibility.
52+
2. **Technical Committee** — Oversees code quality, ensures open-source compliance.
53+
3. **Governance Committee** — Maintains the constitution, moderates community votes, investigates governance concerns.
54+
4. **Elections** — Committees are elected annually by Members once the community reaches 5 voting members.
55+
56+
57+
## Article V: Anti-Capture Safeguards
58+
59+
1. **Contribution Thresholds** — Voting rights are earned through sustained contribution, not just joining.
60+
2. **Probation Period** — New Members gain voting rights only after 1 month.
61+
3. **Identity Verification** — Each voting Member must have a unique, verifiable identity to prevent sockpuppets.
62+
4. **Conflict of Interest Disclosure** — Any Member with a direct financial interest in a competing or controlling entity must disclose before voting.
63+
64+
65+
## Article VI: Transparency
66+
67+
1. **Public Records** — All meeting minutes, code changes, and governance votes must be publicly available.
68+
2. **Open Deliberations** — Discussions take place in accessible public channels.
69+
70+
71+
## Article VII: Amendments
72+
73+
1. **Proposal** — Amendments require co-signature by at least **10%** of Members.
74+
2. **Approval** — A **2/3 majority vote** in favor. Any administrator can veto the vote.
75+
3. **Deliberation** — A minimum 7-day discussion period before voting.
76+
77+
78+
## Article VIII: Dissolution
79+
80+
If the project is dissolved, the platform will be shut down and made unavailable. The source code will always be publicly available on GitHub. The funds will be donated to a charity voted by the Members.
81+
82+
83+
*Adopted on: August 11, 2025*
84+
*Founding Maintainers: Martin, Emily*

web/styles/globals.css

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,3 +222,40 @@
222222
text {
223223
font-family: icomoon, var(--font-main), emoji, sans-serif;
224224
}
225+
226+
/* Style all headings globally */
227+
h1, h2, h3, h4, h5, h6 {
228+
font-family: 'Inter', sans-serif; /* Clean modern font */
229+
font-weight: 600; /* Semi-bold for clarity */
230+
/*color: #111827; !* Near-black text for readability *!*/
231+
line-height: 1.25;
232+
margin-top: 1.5rem;
233+
margin-bottom: 0.5rem;
234+
}
235+
236+
/* Size scaling */
237+
h1 {
238+
font-size: 2rem; /* ~32px */
239+
}
240+
h2 {
241+
font-size: 1.5rem; /* ~24px */
242+
}
243+
h3 {
244+
font-size: 1.25rem; /* ~20px */
245+
}
246+
h4 {
247+
font-size: 1.125rem; /* ~18px */
248+
}
249+
h5 {
250+
font-size: 1rem; /* ~16px */
251+
}
252+
h6 {
253+
font-size: 0.875rem; /* ~14px */
254+
color: #374151; /* Slightly lighter for subheadings */
255+
}
256+
257+
ul {
258+
list-style: disc;
259+
padding-left: 1.25rem;
260+
margin-top: 0.5rem;
261+
}

0 commit comments

Comments
 (0)