diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index a6f73af..0000000 --- a/Dockerfile +++ /dev/null @@ -1,46 +0,0 @@ -FROM node:20-alpine AS base - -# Install pnpm -RUN corepack enable && corepack prepare pnpm@latest --activate - -# Install dependencies only when needed -FROM base AS deps -RUN apk add --no-cache libc6-compat -WORKDIR /app - -COPY package.json pnpm-lock.yaml ./ -RUN pnpm install --frozen-lockfile - -# Rebuild the source code only when needed -FROM base AS builder -WORKDIR /app -COPY --from=deps /app/node_modules ./node_modules -COPY . . - -ENV NEXT_TELEMETRY_DISABLED=1 -ENV NODE_ENV=production - -RUN pnpm run build - -# Production image, copy all the files and run next -FROM base AS runner -WORKDIR /app - -ENV NODE_ENV=production -ENV NEXT_TELEMETRY_DISABLED=1 - -RUN addgroup --system --gid 1001 nodejs -RUN adduser --system --uid 1001 nextjs - -COPY --from=builder /app/public ./public -COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ -COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static - -USER nextjs - -EXPOSE 3000 - -ENV PORT=3000 -ENV HOSTNAME="0.0.0.0" - -CMD ["node", "server.js"] diff --git a/app/about/page.tsx b/app/about/page.tsx new file mode 100644 index 0000000..7b90267 --- /dev/null +++ b/app/about/page.tsx @@ -0,0 +1,233 @@ +import { Button } from "@/components/ui/button" +import { Card, CardContent } from "@/components/ui/card" +import { ArrowRight, Users, Heart, Sprout, Network, Sparkles } from "lucide-react" +import Link from "next/link" + +export default function AboutPage() { + return ( +
+ {/* Hero Section */} +
+
+
+ +
+

About CCG 2026

+

+ Six years of thinkering with the promises and paradoxes of crypto and the commons +

+
+
+ + {/* Main Content */} +
+
+
+

A Growing Movement

+

+ What began in 2020 as a modest excuse for then-PhD researcher Felix Fritsch to bring together + crypto-commons thinkers from around the world in his own backyard has since evolved into an annual moment + of (re)connection and reflection for a growing community—and for the many lived practices and experiments + in commoning, degrowth, mutualism, and post-capitalist economic worldbuilding it is linked to. +

+ +

+ Over the years, CCG has welcomed activists, researchers, hackers, builders, artists, game designers, and + others—newcomers and "OGs" alike. It has shaped itself as a convivial and fertile space for people and + projects working across and beyond web3 to cross-pollinate visions, trajectories, and strategies for + realizing regenerative and cooperative infrastructures. +

+ +
+ + +
6th
+

Annual Edition

+
+
+ + +
100+
+

Expected Participants

+
+
+ + +
7
+

Days of Connection

+
+
+
+ +

The 2026 Edition: New Infrastructures

+

+ While remaining an unconference at heart, each edition has reflected the community's shifting priorities + and aspirations. In 2026, the gathering enters its sixth year, presenting not only a space to collectively + take stock of what crypto commons has become and what it still could be, but also a moment for the growing + community to think and organize itself anew. +

+ +
+

What's Evolving in 2026

+
    +
  • + +
    + The Commons Hub has become a full-fledged event hosting + organization, co-led by brothers Felix and Emil Fritsch, with exciting expansion and ecovillage + plans underway. +
    +
  • +
  • + +
    + The Crypto Commons Association, previously stewarded by + Felix Fritsch and Giulio Quarta, is being reimagined as a cooperative vehicle for organizing and + supporting events at the Hub and beyond, introducing peer-production values and frameworks. +
    +
  • +
+
+ +

What to Expect

+ +
+ + +
+ +
+

Gather & Connect

+

+ Meet others in a convivial, off-grid setting in the Austrian countryside, whether you're + reconnecting or arriving for the first time. Form friendships that last a lifetime. +

+
+
+
+
+ + + +
+ +
+

Explore Key Themes

+

+ Engage through participant-led sessions on regenerative and collaborative finance, MycoFi, + community currencies, digital and crypto commons, open source, degrowth, post-capitalism, + ecofeminism, multispecies justice, radical game design, speculative fiction, and more. +

+
+
+
+
+ + + +
+ +
+

Participate Fully

+

+ Experience a fully unconferenced structure where time and sessions are collectively managed. + Bring your ideas for talks, roundtables, workshops, prototyping sessions, board game nights, + LARPs, and more. Immerse yourself, find inspiration, and team up with others. +

+
+
+
+
+ + + +
+ +
+

Co-Create the Future

+

+ If you're interested, contribute to the ongoing co-creation of the Crypto Commons Association as + it transitions into an events-oriented cooperative, a DAO, or something in between. +

+
+
+
+
+
+ +

Spawning New Movements

+

+ CCG has been a catalyst for emerging movements and initiatives. From the gathering, movements like{" "} + #CoFi (Cooperative Finance) and{" "} + #MycoFi (Mycelial Finance) have emerged, embodying the potential + for technologically-enabled commons that leverage network technologies to reclaim ground from state and + corporate control. +

+

+ The solidarity built here has coalesced into new digital public infrastructures, experimental protocols, + and collaborative frameworks that continue to evolve between gatherings. +

+
+
+
+ + {/* Photo Section */} +
+
+

Experience CCG

+
+
+ CCG discussion circle +
+
+ Community gathering +
+
+ Alpine setting +
+
+
+
+ + {/* CTA Section */} +
+
+

Be Part of the Sixth Edition

+

+ Join us August 16-22, 2026 in the Austrian Alps for an unforgettable week of connection, collaboration, and + commons-building. +

+ +
+ + +
+
+
+ + {/* Footer */} + +
+ ) +} diff --git a/app/api/create-checkout-session/route.ts b/app/api/create-checkout-session/route.ts index 2b68b08..faca94a 100644 --- a/app/api/create-checkout-session/route.ts +++ b/app/api/create-checkout-session/route.ts @@ -1,19 +1,9 @@ import { type NextRequest, NextResponse } from "next/server" import Stripe from "stripe" -// Lazy initialization to avoid build-time errors when env vars aren't set -let stripeInstance: Stripe | null = null -function getStripe(): Stripe { - if (!stripeInstance) { - if (!process.env.STRIPE_SECRET_KEY) { - throw new Error("STRIPE_SECRET_KEY is not configured") - } - stripeInstance = new Stripe(process.env.STRIPE_SECRET_KEY, { - apiVersion: "2024-12-18.acacia", - }) - } - return stripeInstance -} +const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, { + apiVersion: "2024-12-18.acacia", +}) const CCG_TICKET_PRICE_ID = "price_1SbokZ8IwXvKSVJpRvkTqePT" const CCG_ACCOMMODATION_PRICE_ID = "price_1Sboq08IwXvKSVJpf8RRSoCy" @@ -60,7 +50,7 @@ export async function POST(request: NextRequest) { paymentMethodTypes = ["customer_balance"] } - const session = await getStripe().checkout.sessions.create({ + const session = await stripe.checkout.sessions.create({ payment_method_types: paymentMethodTypes, line_items: lineItems, mode: "payment", diff --git a/app/api/webhook/route.ts b/app/api/webhook/route.ts index 1b00084..b5b050f 100644 --- a/app/api/webhook/route.ts +++ b/app/api/webhook/route.ts @@ -1,26 +1,11 @@ import { type NextRequest, NextResponse } from "next/server" import Stripe from "stripe" -// Lazy initialization to avoid build-time errors when env vars aren't set -let stripeInstance: Stripe | null = null -function getStripe(): Stripe { - if (!stripeInstance) { - if (!process.env.STRIPE_SECRET_KEY) { - throw new Error("STRIPE_SECRET_KEY is not configured") - } - stripeInstance = new Stripe(process.env.STRIPE_SECRET_KEY, { - apiVersion: "2024-12-18.acacia", - }) - } - return stripeInstance -} +const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, { + apiVersion: "2024-12-18.acacia", +}) -function getWebhookSecret(): string { - if (!process.env.STRIPE_WEBHOOK_SECRET) { - throw new Error("STRIPE_WEBHOOK_SECRET is not configured") - } - return process.env.STRIPE_WEBHOOK_SECRET -} +const webhookSecret = process.env.STRIPE_WEBHOOK_SECRET! export async function POST(request: NextRequest) { try { @@ -30,7 +15,7 @@ export async function POST(request: NextRequest) { let event: Stripe.Event try { - event = getStripe().webhooks.constructEvent(body, signature, getWebhookSecret()) + event = stripe.webhooks.constructEvent(body, signature, webhookSecret) } catch (err) { console.error("[v0] Webhook signature verification failed:", err) return NextResponse.json({ error: "Invalid signature" }, { status: 400 }) diff --git a/app/gallery/page.tsx b/app/gallery/page.tsx new file mode 100644 index 0000000..2744ac1 --- /dev/null +++ b/app/gallery/page.tsx @@ -0,0 +1,115 @@ +import { Button } from "@/components/ui/button" +import { ArrowLeft } from "lucide-react" +import Link from "next/link" + +export default function GalleryPage() { + const photos = [ + { + src: "/images/20220429-145734.jpg", + alt: "Commons Hub venue with Austrian Alps mountains backdrop", + caption: "The Commons Hub nestled in the foothills of the Austrian Alps", + }, + { + src: "/images/20220505-113225.jpg", + alt: "CCG 2022 group photo with all participants", + caption: "The CCG community gathered together in 2022", + }, + { + src: "/images/20220830-104828.jpg", + alt: "Overhead view of unconference discussion circle", + caption: "Unconference discussion circles at CCG", + }, + { + src: "/images/20220503-155430.jpg", + alt: "Ground-level view of discussion circle in courtyard", + caption: "Participant-driven sessions in the Commons Hub courtyard", + }, + { + src: "/images/20220429-145359.jpg", + alt: "Yellow tulips at Hirschwangerhof venue", + caption: "Spring at the Hirschwangerhof venue", + }, + { + src: "/images/image.jpeg", + alt: "Evening bonfire gathering", + caption: "Evening bonfire gathering with the community", + }, + { + src: "/images/image.png", + alt: "Alpine wildflowers with mountain backdrop", + caption: "The natural beauty surrounding the venue", + }, + { + src: "/images/image.jpeg", + alt: "Outdoor discussion session with mountain views", + caption: "Sessions in a circle with the Austrian Alps as backdrop", + }, + { + src: "/images/image.png", + alt: "Hacking session with participants", + caption: "Hands-on building and prototyping sessions", + }, + { + src: "/images/image.jpeg", + alt: "Community meal together", + caption: "Shared meals and convivial moments", + }, + ] + + return ( +
+ {/* Header */} +
+
+ + +

Gallery

+

+ Explore moments from past Crypto Commons Gatherings - from unconference sessions in the Austrian Alps to + community building and lifelong friendships. +

+
+
+ + {/* Photo Grid */} +
+
+
+ {photos.map((photo, index) => ( +
+
+ {photo.alt} +
+
+

{photo.caption}

+
+
+ ))} +
+
+
+ + {/* CTA Section */} +
+
+

Join Us in 2026

+

+ Be part of the next chapter of Crypto Commons Gathering and create new memories in the Austrian Alps. +

+ +
+
+
+ ) +} diff --git a/app/globals.css b/app/globals.css index e478d9d..6af1aa1 100644 --- a/app/globals.css +++ b/app/globals.css @@ -79,6 +79,8 @@ @theme inline { --font-sans: "Geist", "Geist Fallback"; --font-mono: "Geist Mono", "Geist Mono Fallback"; + /* Added spray-paint font for graffiti-style text */ + --font-spray: "Permanent Marker", "Permanent Marker Fallback", cursive; --color-background: var(--background); --color-foreground: var(--foreground); --color-card: var(--card); diff --git a/app/layout.tsx b/app/layout.tsx index d6663da..9e2ea50 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,11 +1,12 @@ import type React from "react" import type { Metadata } from "next" -import { Geist, Geist_Mono } from "next/font/google" +import { Geist, Geist_Mono, Permanent_Marker } from "next/font/google" import { Analytics } from "@vercel/analytics/next" import "./globals.css" const _geist = Geist({ subsets: ["latin"] }) const _geistMono = Geist_Mono({ subsets: ["latin"] }) +const _permanentMarker = Permanent_Marker({ weight: "400", subsets: ["latin"] }) export const metadata: Metadata = { title: "Crypto Commons Gathering 2026 | CCG", diff --git a/app/page.tsx b/app/page.tsx index 0f30821..adb5cbf 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,11 +1,55 @@ +"use client" + +import type React from "react" + import { Button } from "@/components/ui/button" import { Card, CardContent } from "@/components/ui/card" -import { ArrowRight, Calendar, MapPin, Users, Heart, Sprout, Network } from "lucide-react" +import { ArrowRight, Calendar, MapPin, Users, Heart, Sprout, Network, X } from "lucide-react" import Link from "next/link" +import { useState } from "react" export default function HomePage() { + const [selectedImage, setSelectedImage] = useState(null) + + const handleImageClick = (imageSrc: string) => { + setSelectedImage(imageSrc) + } + + const handleCloseModal = () => { + setSelectedImage(null) + } + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === "Escape") { + handleCloseModal() + } + } + return (
+ {selectedImage && ( +
+ + Zoomed view e.stopPropagation()} + /> +
+ )} + {/* Hero Section */}
-

+

+ Join the SIXTH edition of the +

+ +

Crypto Commons
Gathering @@ -28,8 +76,8 @@ export default function HomePage() {

- A hack-ademic confluence of commons praxis and the latest cryptographic technologies, set in the foothills - of the Austrian Alps. + A week-long retreat where genuine desire for postcapitalist change meets blockchain tinkering, commons + building, and radical imagination in the Austrian Alps.

@@ -66,18 +114,35 @@ export default function HomePage() {
-
+
handleImageClick("/images/20220901-085249.jpg")} + > CCG participants in discussion circle
-
- Community meal at CCG +
handleImageClick("/images/20220505-113225.jpg")} + > + CCG 2022 community group photo in the Austrian Alps
-
- Hands-on hacking at CCG +
handleImageClick("/images/20220429-145734.jpg")} + > + Commons Hub venue in the Austrian Alps
@@ -88,21 +153,18 @@ export default function HomePage() {
-

The Best Event in the World

+

What is CCG?

- Join us for an unconference-style gathering where you bring as much as you receive. Friendships are made - that last a lifetime, and solidarity is built that might just coalesce into new digital public - infrastructures. + The Crypto Commons Gathering (CCG) is an annual week-long retreat organised by the Crypto Commons + Association in collaboration with the Commons Hub. To its growing community, it serves as a recurring + temporary refuge from late-capitalism (or something worse) and as a convivium to reimagine how we + organize value, care and meaning for a "post-capitalist world of many worlds".

- CCG has spawned movements like #CoFi and{" "} - #MycoFi, and holds the possibility for a new - technologically-enabled commons that leverages network technologies to regain ground against state and - corporate control. -

-

- What began in 2020 as a modest gathering has evolved into an annual moment of (re)connection and - reflection for a growing community of crypto-commons thinkers from around the world. + 2026 marks the 6th edition of the CCG — six years of bringing together commons builders, token + tinkerers, speculative worldbuilders, artists, complex systems thinkers, degens turned regen, and + everyone curious about the weird futures that emerge when crypto meets genuine international and + intersectional postcapitalist desire.

@@ -148,33 +210,44 @@ export default function HomePage() { {/* Themes Section */}
-

Explore Key Themes

-

- Through participant-led sessions, we collectively explore the intersection of commoning, degrowth, and web3 +

Themes: What to Expect

+

+ Talks, workshops, and spontaneous experiments at CCG cover a wide range of topics. They often start with a + curiosity in using blockchain, tokenization and decentralized governance for the common good, but rarely + stay there exclusively – cooperative, non-crypto alternatives, open source projects, degrowth initiatives, + and other spheres increasingly cross-pollinate here under a decolonial, feminist, queer, + multispecies-attuned frame.

-
- {[ - "Regenerative Finance", - "MycoFi", - "Community Currencies", - "Digital Commons", - "Crypto Commons", - "Open Source", - "Degrowth", - "Post-Capitalism", - "Ecofeminism", - "Multispecies Justice", - "Radical Game Design", - "Speculative Fiction", - ].map((theme) => ( -
-

{theme}

-
- ))} +
+ + +

Regenerative & Collaborative Finance

+

+ ReFi DAO, EthicHub, CoFi Gathering, Regen Network, Circles UBI +

+
+
+ + +

Myco-Economics

+

MycoFi and interconnected economic models

+
+
+ + +

Governance & Mutualism

+

Economic Space Agency, Bread Coop, Holochain

+
+
+ + +

Solarpunk & Radical Games

+

+ pocas, Solar Punk WOW, Futurescraft, economic science fiction +

+
+
@@ -190,21 +263,16 @@ export default function HomePage() {

- What is an Unconference? + Format: How We Explore

- An unconference is a participant-driven event format that emphasizes open, flexible, and spontaneous - discussions rather than traditional pre-planned presentations. Unlike conventional conferences, - unconferences have no predefined agenda or speakers. -

-

- Attendees collaboratively propose topics, sessions, and activities on the spot. Participants vote or - self-organize around topics they find most interesting, forming small groups or breakout sessions where - discussions, workshops, or hands-on activities take place. + CCG follows an open space or "unconference" format. This means the schedule is co-created on-site by all + participants: during the daily morning circle, anyone can propose a session, host a discussion, or start a + collective experiment, and schedule it at one of five sites across the Hub, each with its own affordances.

- Everyone is considered equally qualified to contribute, share insights, and guide conversations. Bring your - ideas for talks, roundtables, workshops, prototyping sessions, board game nights, LARPs, and more. + Workshops, keynotes, rituals, games and evening performances traditionally unfold organically, reflecting + the shared interests, dynamics and projects that emerge over the week.

@@ -216,7 +284,7 @@ export default function HomePage() {
Commons Hub in the Austrian Alps @@ -280,7 +348,6 @@ export default function HomePage() { Financial Transparency
-

Interested in the Crypto Commons Association cooperative? Learn more at the event.

@@ -304,10 +371,12 @@ export default function HomePage() {

Links

  • - + + Gallery + +
  • +
  • + About CCG 2026
  • @@ -372,7 +441,7 @@ export default function HomePage() {
-

© 2026 Crypto Commons Gathering. Built with solidarity for the commons.

+

This website is under Creative Commons license. Built with solidarity for the commons.

diff --git a/app/register/page.tsx b/app/register/page.tsx index 4e148bf..50dc3cf 100644 --- a/app/register/page.tsx +++ b/app/register/page.tsx @@ -29,9 +29,9 @@ export default function RegisterPage() { food: false, }) - const baseTicketPrice = 200 - const accommodationPrice = 227.4 - const foodPrice = 135 + const baseTicketPrice = 80 // Updated to early bird price €80 + const accommodationPrice = 39.2 * 6 // Updated to €39.20/night * 6 nights = €235.20 + const foodPrice = 35 * 3 + 10 * 3 // Updated to reflect catered (€35*3) + self-organized (€10*3) = €135 const calculateTotal = () => { let total = baseTicketPrice if (packages.accommodation) total += accommodationPrice @@ -83,7 +83,9 @@ export default function RegisterPage() { Select Your Packages - Ticket is required. Add accommodation and food as needed. + + Ticket is required (€80 early bird until Dec 31, 2025). Add accommodation and food as needed. +
@@ -93,10 +95,16 @@ export default function RegisterPage() {
CCG 2026 Ticket (Required)
-
Venue rental & infrastructure
+
+ €80 Early bird (until Dec 31, 2025) • €120 Regular (Jan-Jun 2026) • €150 Late (after Jul 1, + 2026) +
+
+ CCA members: Bring two newcomers, get a free ticket! +
- €200.00 + €{baseTicketPrice}.00
{/* Accommodation */} @@ -110,10 +118,13 @@ export default function RegisterPage() { />
- €227.40 + €{accommodationPrice.toFixed(2)} {/* Food */} @@ -127,10 +138,13 @@ export default function RegisterPage() { /> - €135.00 + €{foodPrice.toFixed(2)} {/* Total */} diff --git a/app/transparency/page.tsx b/app/transparency/page.tsx index 2c9e2de..484217f 100644 --- a/app/transparency/page.tsx +++ b/app/transparency/page.tsx @@ -40,18 +40,45 @@ export default function FinancialTransparencyPage() { {/* Ticket Price */} - Ticket Price + Ticket Pricing -
- €200 - per person +
+
+
+ €80 + Early bird +
+ Until Dec 31, 2025 +
+
+
+ €120 + Regular +
+ Jan 1 – Jun 30, 2026 +
+
+
+ €150 + Late +
+ After Jul 1, 2026 +
+ +
+

CCA Members Special:

+

+ Bring two newcomers (who've never attended CCG before) and get a free ticket! If you've already paid, + we'll refund you. +

+
+

- The ticket price is set to cover the venue rental and basic infrastructure, based on expected - attendance. No one from the organizing team is being paid from ticket sales, and all are covering their - own travel, food and accommodation, until more sustainable structures and future sponsorships are in - place. + The ticket price covers venue rental and basic infrastructure. No one from the organizing team is being + paid from ticket sales, and all are covering their own travel, food and accommodation, until more + sustainable structures and future sponsorships are in place.