Author SHA1 Message Date
Danny Spitzberg 96a8b1f759 Upload files to "static/img/banners"
upload/add these files and delete previous files with same filenames
2026-09-17 18:17:52 +00:00
ntnsndr 0029a0e4d1 Corrected typo on Are.na 2026-09-17 17:38:38 +00:00
ntnsndr 448829b65f Created Public Evaluation of Public Benefit 2026-09-01 18:05:20 +00:00
ntnsndr bb30b6de1f Update E2C Cookbook download link 2026-08-26 19:21:15 +00:00
ntnsndr fe989a70b7 updated coding agent credits 2026-08-26 16:30:39 +00:00
ntnsndr aa704f71b2 Add content/resources/how_to_e2c_blockchain.md 2026-08-26 16:29:39 +00:00
Nathan Schneider aa0ad1bed3 Added Merk case studies + author field 2026-08-19 09:56:46 -06:00
ntnsndr 3f072a7fc3 Added Ground Works policy guide 2026-07-17 19:44:11 +00:00
Nathan Schneider 2db22ca3bb harmonized external_url variable, removed url_external 2025-11-14 10:14:33 -07:00
ntnsndr 1be22cba70 Changed "Website" to "Visit Website" 2025-11-14 17:06:23 +00:00
Nathan Schneider 37c156fb6f Fixed error on visibility of website link on snippets 2025-11-12 15:43:40 -07:00
Nathan Schneider 5f1dd685f8 Oops, fixed legal-snippet file naming 2025-09-19 12:47:32 -06:00
Nathan Schneider 0312ed7932 Fixed tag issue on legal-snippets 2025-09-19 12:44:30 -06:00
Nathan Schneider 0bc9d26ad0 UX adjustments to the contact buttons on main page 2025-08-03 23:12:35 -06:00
Nathan Schneider d7d68f874a Small UX tweaks 2025-07-31 16:35:53 -06:00
ntnsndr 1d964277b2 Added E2CC support link to footer 2025-07-28 20:37:55 +00:00
Nathan Schneider 49e8196fe8 Various UX improvements to index and dropdowns 2025-07-21 21:25:24 -06:00
ntnsndr afee96c7a2 Added Matomo tracking code 2025-07-21 00:05:06 +00:00
ntnsndr 4ce406d3de Moved domain to e2c.how 2025-07-20 23:43:46 +00:00
Nathan Schneider 0bf0e02f40 Aesthetic adjustments throughout 2025-07-20 00:06:09 -06:00
Nathan Schneider 57cd3fe19b Moved JS from baseof 2025-07-19 21:49:44 -06:00
Nathan Schneider e7d02211a3 Moved CSS from baseof 2025-07-19 21:46:51 -06:00
Nathan Schneider 0060c18793 Improvements to responsiveness on menu and index page 2025-07-19 21:41:38 -06:00
ntnsndr e8fac6be10 Deleting misspelled file 2025-07-19 15:19:17 +00:00
ntnsndr 1cd7ee77a0 Spelling Signalise right on banner filename! 2025-07-19 15:19:02 +00:00
ntnsndr ee4bc3a3eb Replaced Signalese banner 2025-07-19 15:17:48 +00:00
Nathan Schneider 7480231a58 Fixes to h2 headers caused by Action Network form handling 2025-06-27 21:37:43 -06:00
Nathan Schneider d2cd3e6c24 Added favicon and got Action Network forms working 2025-06-27 14:19:17 -06:00
ntnsndr 91356f7a0b Updated README development and deployment wording 2025-06-27 16:45:10 +00:00
ntnsndr d78abae61f Adjusted color of h2 in intro section on main page 2025-06-27 16:08:38 +00:00
Nathan Schneider aea2038ba5 Added featured cases to index, other improvements 2025-06-26 11:34:30 -07:00
Nathan Schneider dfda606591 Various improvements to directories and design 2025-06-25 21:20:28 -07:00
Nathan Schneider 975158ad0c Resources are now real 2025-06-25 16:44:42 -07:00
Nathan Schneider deb7b4f1b8 Fixed main page typo 2025-06-25 13:17:03 -07:00
Nathan Schneider 9648921133 Adjusted main page bullet points 2025-06-25 13:07:33 -07:00
Nathan Schneider 4e00b0d93e Increased logo size for visibility 2025-06-25 13:05:36 -07:00
Nathan Schneider 70131b40a5 Now publishes on commit to main branch 2025-06-25 13:00:31 -07:00
119 changed files with 2602 additions and 1132 deletions
+3 -3
View File
@@ -8,7 +8,7 @@ variables:
# Tells GitLab Runner to initialize and update submodules recursively
GIT_SUBMODULE_STRATEGY: recursive
# TODO: the Surfer server base url (ex: "https://www.example.com/")
SURFER_SERVER: "https://e2c.medlab.host/"
SURFER_SERVER: "https://e2c.how/"
stages:
- build # Added build stage
@@ -30,7 +30,7 @@ build_site:
# Define when this job runs (e.g., only on the main branch)
# Adjust 'only' or 'rules' as needed for your workflow
only:
- publish # the script will only run on the branch 'publish'
- main # the script will only run on the branch 'main'
# Job to deploy the built site using cloudron-surfer
deploy_site:
@@ -58,5 +58,5 @@ deploy_site:
public/* /
- echo "Deployment completed successfully"
only:
- publish # Example: Run only on the main branch
- main # Example: Run only on the main branch
+13 -7
View File
@@ -1,23 +1,29 @@
# Exit to Community Hugo Site
# E2C.how website
**An informational website by the Exit to Community Collective.**
This is a Hugo static site that migrated content from a Notion database to create the Exit to Community documentation site.
This is a Hugo static site that migrated content from the earlier site that was built with a Notion database, with assistance from various coding agents.
## Project Overview
The site documents case studies, legal snippets, and resources related to "Exit to Community" - the practice of converting startups into community-owned cooperatives.
The site documents case studies, legal snippets, and resources related to "Exit to Community"the practice of converting startups into community ownership and governance.
## How to contribute
To contribute to this project, use the contact form at E2C.how to request edit access to the repository. With such access, the public site automatically updates whenever changes are pushed to the `main` branch of this repository. Changes may be pushed either by:
* Editing files directly via the GUI edit tools at `https://git.medlab.host/e2c/e2c-how/`
* Pushing from a local clone via git
## Key Technical Details
### Site Structure
- **Hugo static site generator** with custom layouts
- **No CMS** - Decap CMS was removed due to login issues
- **Content in Markdown** with YAML frontmatter
- **Custom CSS styling** with E2C yellow branding (#F4D03F)
### Content Types
- **Case Studies** (`/content/case-studies/`) - 24 case studies with logos and descriptions
- **Case Studies** (`/content/case-studies/`) - Case studies with logos and descriptions
- **Legal Snippets** (`/content/legal-snippets/`) - Legal documents and frameworks
- **Resources** (`/content/resources/`) - Media, education, and primer content
- **Main Pages** - Homepage, contact, add-your-story with integrated forms
@@ -69,7 +75,8 @@ The site documents case studies, legal snippets, and resources related to "Exit
4. Visit http://localhost:1313
### Deployment
Set up deployment following: https://git.medlab.host/dhorn/medlab-hugo-template
To deploy changes, simply push them to the `main` branch and they should automatically publish. Deployment occurs through GitLab and Surfer on the MEDLab server, making use of Drew Hornbein's [template](https://git.medlab.host/dhorn/medlab-hugo-template).
## External Dependencies
- Hugo static site generator
@@ -81,4 +88,3 @@ Set up deployment following: https://git.medlab.host/dhorn/medlab-hugo-template
- Content updates should maintain the clean YAML structure
- New case studies should follow the established pattern with logos
- Consider adding search functionality if the content grows significantly
- Form submissions need backend integration for actual processing
-8
View File
@@ -1,8 +0,0 @@
{
"permissions": {
"allow": [
"WebFetch(domain:actionnetwork.org)"
],
"deny": []
}
}
+18 -29
View File
@@ -7,52 +7,41 @@ hero_alt: "Exit to Community concept illustration"
<div class="hero-section">
<div class="hero-content">
<img src="/img/Frame_1_(6).png" alt="Exit to Community concept illustration" class="hero-image" />
<div class="hero-text">
<h1>Stories and strategies for community ownership</h1>
</div>
<img src="/img/Frame_1_(6).png" alt="Exit to Community concept illustration" class="hero-image" />
</div>
</div>
<div class="intro-section">
<h2>What is Exit to Community?</h2>
<p>Most startups aim for one of two "exit" options: an acquisition by another company or a public stock offering. Both often pit founders and investors against the communities they claim to serve.</p>
Most startups aim for one of two "exit" options: an acquisition by another company or a public stock offering. Both often pit founders and investors against the communities they claim to serve.
<p>Exit to Community is a search for another way—a path where organizations can mature toward accountability and shared prosperity.</p>
Exit to Community is a search for another way—a path where organizations can mature toward accountability and shared prosperity.
<ul>
<li>Business purpose can align with ownership</li>
<li>Founding can teams let go at the right time</li>
<li>Communities can grow the business they value</li>
<li>Allies in consulting, policy, and academia can help advance economic democracy</li>
<li>Founders and investors can let go when they need to</li>
<li>Communities can protect the businesses they value</li>
</ul>
<p>This is a strategy that we are exploring together. Here, you can find cases and documents about experiments with E2C so far.</p>
</div>
<div class="main-sections">
<h2>Explore E2C</h2>
<div class="primary-cards">
<div class="primary-card">
<h3>Case Studies</h3>
<p>Real examples of companies that have attempted or achieved community ownership transitions</p>
<a href="/case-studies/" class="button">Explore Cases</a>
</div>
<div class="primary-card">
<h3>Legal Snippets</h3>
<p>Legal documents and frameworks for implementing community ownership structures</p>
<a href="/legal-snippets/" class="button">View Legal Resources</a>
</div>
<div class="primary-card">
<h3>Resources</h3>
<p>Educational materials, primers, and guides for Exit to Community transitions</p>
<a href="/resources/" class="button">Access Resources</a>
</div>
<div class="featured-cases-section">
<div class="featured-cases-grid" id="featuredCasesGrid">
<!-- Featured cases will be loaded here -->
</div>
<div style="text-align: center; margin-top: 2rem;">
<a href="/case-studies/" class="btn">View All Case Studies</a>
</div>
</div>
<div style="text-align: center; margin: 3rem 0;">
<img src="/img/Screenshot_2023-12-13_at_1.55.04_PM.png" alt="Partnership handshake illustration" class="partnership-image" />
</div>
@@ -60,16 +49,16 @@ hero_alt: "Exit to Community concept illustration"
<div class="secondary-actions">
<h3>Get Involved</h3>
<div class="secondary-cards">
<div class="secondary-card">
<h4>Plan Your E2C</h4>
<p>Connect with our team to discuss your organization's future</p>
<a href="/contact/" class="secondary-button">Get in Touch</a>
</div>
<div class="secondary-card">
<h4>Share Your Story</h4>
<p>Help others learn by contributing your organization's E2C experience</p>
<a href="/add-your-story/" class="secondary-button">Add Your Story</a>
</div>
<div class="secondary-card">
<h4>Get in Touch</h4>
<p>Connect with the Exit to Community project team</p>
<a href="/contact/" class="secondary-button">Contact Us</a>
</div>
</div>
</div>
+14 -6
View File
@@ -8,10 +8,17 @@ We're curating stories from founding teams and allies to help people learn from
Help us share it with people who can benefit from its lessons.
<div class="contact-form-container">
<form class="e2c-contact-form" action="#" method="post">
<!-- Action Network Form Embed -->
<link href='https://actionnetwork.org/css/style-embed-v3.css' rel='stylesheet' type='text/css' />
<script src='https://actionnetwork.org/widgets/v3/form/e2c-website-story-form?format=js&source=widget&clear_id=true'></script>
<div id='can-form-area-e2c-website-story-form' style='width: 100%'></div>
<!-- Fallback form for cases where JS is disabled -->
<noscript>
<form class="e2c-contact-form" action="https://actionnetwork.org/forms/e2c-website-story-form" method="post">
<div class="form-group">
<label for="country">Country *</label>
<select id="country" name="country" required>
<select id="country" name="person[country]" required>
<option value="">Select your country</option>
<option value="US">United States</option>
<option value="CA">Canada</option>
@@ -40,19 +47,19 @@ Help us share it with people who can benefit from its lessons.
</div>
<div class="form-group">
<label for="email">Email *</label>
<input type="email" id="email" name="email" required>
<input type="email" id="email" name="person[email]" required>
</div>
<div class="form-group">
<label for="name">Name</label>
<input type="text" id="name" name="name">
<input type="text" id="name" name="person[given_name]">
</div>
<div class="form-group">
<label for="organization">Organization</label>
<input type="text" id="organization" name="organization">
<input type="text" id="organization" name="person[employer]">
</div>
<div class="form-group">
<label for="role">Role</label>
<input type="text" id="role" name="role">
<input type="text" id="role" name="person[occupation]">
</div>
<div class="form-group">
<label for="experience_description">Briefly describe your experience with community ownership</label>
@@ -83,5 +90,6 @@ Help us share it with people who can benefit from its lessons.
</div>
<button type="submit" class="submit-btn">Submit</button>
</form>
</noscript>
</div>
+1
View File
@@ -1,5 +1,6 @@
---
title: "Case Studies"
description: "Real examples of companies that have attempted or achieved community ownership"
author: ""
---
+49
View File
@@ -0,0 +1,49 @@
---
title: Aave
date: '2026-04-14'
draft: false
description: "A decentralized lending protocol that transitioned to DAO governance but has faced centralization tensions as founding entities retain control over key infrastructure."
status: ongoing
tags:
- crypto
- ongoing
external_url: https://aave.com/
image: /img/logos/aave.png
banner: /img/banners/aave.png
author: "Tara Merk"
---
### Summary
Aave is a decentralized lending protocol that transitioned to community governance in 2020 via token-based voting. While initially successful, recent tensions between the DAO and Aave Labs over revenue control and brand ownership reveal how decentralization remains fragile -- especially when founding teams retain control of key infrastructure like frontends, IP, and communication channels.
### Motivation and Readiness
Aave has always aimed to be decentralized and already promised to move to DAO governance in the ETHLend whitepaper. As such, progressive decentralization has been part of the projects strategy since inception. In terms of readiness, Aave had been in development for over three years before granting its community governance rights via the Aave token. By this time, it had already established itself as a leading decentralized lending protocol. Furthermore, Aaves transition towards community governance needs to be understood in terms of its temporal context: the launch of Aave Governance V2 came amongst a boom of DAO transitions within the DeFi space at the time. As such, the transition can also be understood as a move to keep up with competitors as well as maintain the projects attractiveness and legitimacy vis-a-vis the blockchain ecosystem and its users.
### Process and Tensions
The process of transitioning to Aave Governance v2 went relatively smoothly at the time. The project also incentivized Aave users to stake their tokens to the projects security module, by rewarding them with more Aave (and thus voting power) for doing so. As such, the transition towards decentralized governance directly contributed to the protocols security. Two years after the transition, Aave began entering the cross-chain decentralized lending space. To accommodate for the added complexity of governing a multi-chain ecosystem, the DAO adopted [Aave Governance V3](https://github.com/aave-dao/aave-governance-v3/blob/main/README.md) in 2023.
Tensions arose in late 2025, as the DAO and Aave Labs began renegotiating power arrangements between them publicly. The tension began over protocol revenues from decentralized exchanges being funnelled to Aave Labs, rather than the DAO. Aave has long integrated with decentralized exchanges, to allow users to swap different cryptocurrencies on Aave without leaving the application. Previously, this integration was done with ParaSwap, a specific decentralized exchange, which in return for Aave sending new customers its way, sent a portion of the fees it took per swap back to the Aave DAO. In early December 2025, Aave Labs announced a new partnership with CowSwap, who would be the new main decentralized exchange users would access when using Aave through the frontend application maintained by Aave Labs. Following this switch, the DAO quickly realized that it meant that referral fees (likely around $10 million per year) were now flowing to wallets controlled by Aave Labs, rather than the DAO treasury. This unilateral move by Aave Labs triggered a more [widespread (and very heated!) debate](https://rekt.news/aave-winter-of-discontent) within the community concerning the relationship between Aave Labs and the DAO. Several proposals were made by the DAO to transfer ownership over the project's IP and communications channels to the DAOs which could then contract Aave Labs with maintaining these assets. In turn Aave Labs argued that anyone was welcome to build a competing frontend to the protocol, and that these fees were generated by a product built on Aave, rather than the protocol itself and that Aave Labs therefor had the right to take these fees, which it proposed sharing with the DAO.
Nevertheless, following this episode, debates over ownership and control between the DAO and Aave Labs are ongoing in the ecosystem. Discontent was especially high, when Aave Labs pushed a [proposal](https://snapshot.org/#/s:aavedao.eth/proposal/0xbc606159ddeae0184c2086055637d3f357351ec0adc4c9f4150751bc41918eba) for the transfer of brand assets to the DAO, to a vote over the Christmas days and seemingly coordinated its own token holders to vote against it. The role of Stani Kulechov, who remains Aave Labs CEO and recently published his own [vision](https://x.com/StaniKulechov/status/2001036446098919461) on how Aave will win in the long term (which does not make mention of decentralized governance and focuses on products instead), is especially contested. In the aftermath, several key DAO service providers have decided to leave the project.
### Results
Although Aave Labs seems to have been successful in living up to its mission to decentralize the protocol over the first few years after activating V2 governance, the recent events show that decentralization remains vulnerable. It is vulnerable in the sense that the current setup still allowed Aave Labs to unilaterally re-route funds to its own address, and that the community lacks adequate enforcement mechanisms to prevent such behaviour from individual actors.
Aaves E2C outcome is also vulnerable in the sense that tensions triggered core service providers to exit, leaving the ecosystem dependent on single vendors (like Aave Labs) or more vulnerable to technical exploits. Three months after the conflict between Aave DAO and Aave Labs emerged, [the Aave Chan Initiative (ACI)](https://www.dlnews.com/articles/defi/aave-firm-exits-defi-giant-amid-protracted-power-struggle/?utm_source=substack&utm_medium=email), a key governance group inside the DAO resigned. [Shortly after](https://thedefiant.io/news/defi/chaos-labs-terminates-aave-engagement-citing-risk-misalignment?utm_source=newsletter&utm_medium=email&utm_campaign=aave-loses-chaos-labs), BDG Labs, a developer firm working on Aave v3 also stepped away from the protocol and Chaos Labs, a risk service provider followed. It remains to be seen, to what extent Aaves journey towards decentralization can be characterized as being successful or unsuccessful.
### Sources
- [Project history and overview](https://messari.io/project/aave/profile)
- [Blog post announcing V2 governance](https://medium.com/aave/aave-protocol-governance-v2-has-been-activated-af4a4b228885)
- [ETHLend whitepaper](https://github.com/ETHLend/Documentation/blob/master/ETHLendWhitePaper.md)
- [Background of EthLend ICO](https://steemit.com/ethereum/@ethlend/value-and-function-of-lend)
- [2026 governance drama at Aave](https://rekt.news/aave-winter-of-discontent)
- [Founders Master plan for Aave](https://x.com/StaniKulechov/status/2001036446098919461)
+3 -1
View File
@@ -10,8 +10,10 @@ tags:
- missed-opportunity
- multi-stakeholder
- music
url_external: https://ampled.com/
external_url: https://ampled.com/
image: /img/logos/ampled.svg
banner: /img/banners/ampled.png
author: ""
---
### Summary
+4 -2
View File
@@ -7,8 +7,10 @@ tags:
- crowd-equity
- social-media
- underway
url_external: https://are.na/
external_url: https://are.na/
image: /img/logos/arena.png
banner: /img/banners/arena.webp
author: ""
---
### Summary
@@ -27,7 +29,7 @@ According to [its roadmap](https://www.are.na/about/Roadmap), Are.na will transi
During their time in the E2C 2020 Peer Learning Cohort, co-founder [Charles “Cab” Broskoski](https://e2c.how/Charles-Broskoski-45514f0b20bd40e99fbe9897587b92da) and advisor [Leo Shaw](https://e2c.how/Leo-Shaw-f95853ac82cb44189147cc9f0c01ed04) developed the narrative for Are.nas multi-stakeholder vision. Since then, the company has hosted meetings with its subscribers to gauge their thoughts on the E2C proposal, while co-founder Daniel Pianetti has been leading discussions with lawyers and other domain experts to figure out the appropriate legal documentation for when the time is right. Are.na hopes to adopt a level of persistent transparency similar to [Open Collectives E2C ambitions](https://opencollective.com/e2c). Are.na is currently in the process of developing structures for member-ownership and governance strategy, in order to legally enshrine the dynamic of mutual care that has existed more informally between staff and users for years. As of 2023, this entails seeking out the best way to transition the crowdfund participants — who are currently SAFE holders, not shareholders — into an entity that can receive a return if the company is profitable but does not get acquired or go public.
At present, Are.ca could take one of two paths. First, it could seek majority consent from the crowdfund investors to amend the terms of their contract, allowing the company to share its success with them, without having to convert them to shareholders first. This would enable them to issue the investors something like profit dividends, offering them a tangible return timeline and ensuring that they would still see upside in the case of a future exit. Second, Are.na could raise a second crowdfunding round, issuing a different type of investment contract while simultaneously converting and re-organizing the original investors into a separate entity. When it becomes time for the company to share profits, it would then distribute them to the two groups of investors.
At present, Are.na could take one of two paths. First, it could seek majority consent from the crowdfund investors to amend the terms of their contract, allowing the company to share its success with them, without having to convert them to shareholders first. This would enable them to issue the investors something like profit dividends, offering them a tangible return timeline and ensuring that they would still see upside in the case of a future exit. Second, Are.na could raise a second crowdfunding round, issuing a different type of investment contract while simultaneously converting and re-organizing the original investors into a separate entity. When it becomes time for the company to share profits, it would then distribute them to the two groups of investors.
### Sources
+3 -1
View File
@@ -10,8 +10,10 @@ tags:
- social-media
- trust
- utilities
url_external: https://buytwitter.org/
external_url: https://buytwitter.org/
image: /img/logos/buytwitter.png
banner: /img/banners/buytwitter.jpg
author: ""
---
### Summary
+48
View File
@@ -0,0 +1,48 @@
---
title: Circles Coop
date: '2026-04-14'
draft: false
description: "A cooperative local economy pilot using a blockchain-based UBI coin, which shut down due to insufficient funding."
status: failure
tags:
- co-op
- crypto
- failure
external_url: https://circles.coop/
image: /img/logos/circlescoop.png
banner: /img/banners/circlescoop.png
author: "Tara Merk"
---
### Summary
Circles Coop was a German cooperative running a blockchain-based UBI pilot in Berlin, aiming to build a community-stewarded local economy. Despite successful community organizing and local market events, the project shut down in 2024 after running out of funds to subsidize business adoption. This demonstrated how financial sustainability can undermine even well-designed community governance experiments.
### Motivation and Readiness
The core motivation underlying the wider Circles project is to showcase and advance the effectiveness of blockchain based universal income based on trust (in the form of a social graph of users vouching for each other in the system). Furthermore, many members of the Circles pluriverse (a term used within the ecosystem to describe the various organizations and stakeholders involved in the wider Circles project) were interested in practically advancing more equitable, anti- or post-capitalist economic models. Members included many early, idealistic blockchain adopters (including people working in the industry on projects such as MakerDAO or Consensys), which led to the technology becoming central to the Circles project.
After the initial launch of the CRC in October 2020, which was accompanied by several technical difficulties but also relatively fast adoption by cryptocurrency users (more than 20.000 accounts registered in the first week alone), Circles Coop e.G. was initially formed from members of the Basic Income Lab eV, who wanted a more democratic organizational structure going forward. The Circles Coop included people from the platform cooperativism ecosystem, activists and hackers from the peer-to-peer technology community. The pilot was launched with the intention to demonstrate the potential of a community stewarded local economy. To achieve this, of course the pilot had to be stewarded by local community. This constitutes the main motivation for the E2C.
### Process and Tensions
The main tension in the roll out of community governance was the strong reliance on the subsidiary program. The subsidiary program aimed to incentivize more businesses to join the Circles ecosystem in Berlin by allowing them to exchange CRC for a fixed amount of Euros each month. The rationale behind the subsidy program was to enable businesses such as farmers and local producers to join the pilot without bearing the economic risk from accepting a new currency backed by novel, experimental technology. The funding for the subsidy programme came from Martin Koppelmann is listed as the projects initiator and is also the founder of Gnosis, a blockchain company based in Berlin.While the incentive worked to onboard various businesses, it unfortunately did not achieve the desired effect of creating a critical mass of closed loops within the Circles economy.
After almost three and a half years, the Circles Coop ultimately ran out of funds to continue the subsidiary program and sustain itself, thus leading to the Coop needing to shut down and end the Berlin pilot. Within the Coop Handbook, summarizing the activities and key learnings gathered by the Coop throughout its time, the financial stress that resulted from the need to continue providing subsidiaries without having a clear revenue model in place , is cited as a key factor contributing to the Coop continuously functioning in a state of emergency/ urgency which limited the teams ability to conduct better long term and strategic planning. Underlying this tension was also the Coops continued dependence on a single funder whose interests it had to cater to and which were difficult to reconcile with the interests of the members of the cooperative. As such, this case highlights the tensions that can arise for cooperatives from relying on external funding.
### Results
The pilot succeeded at showcasing what community stewardship of local economies using blockchain based currency might look like, yet it failed to grow to the extent that the local economies would become financially self-sufficient. While the Circles Coop and with it the Berlin pilot closed down in January 2024, after subsidies ran out, the CRC infrastructure, built open-source on Gnosis chain, remains intact and will continue to be maintained by the Gnosis team. While Poetic Technologies UG, which was founded by Circles Coop members retains the [joincircles.com](http://joincircles.com) website, all other project assets were transitioned to Gnosis. Gnosis has used these assets to create an updated version of the project. The smart contracts were upgraded to support the Circles V2 (CRC) cryptocurrency and the wallet infrastructure is integrated in the Gnosis Wallet, which supports Circles V2.
### Sources
- [The Circles Coop Handbook](https://joincircles.net/wp-content/uploads/2023/07/EN_Handbook_coop_0723_online.pdf)
- [Papadimitropoulos V and Perperidis G (2024) Universal basic income on blockchain: the case of circles UBI](https://www.frontiersin.org/journals/blockchain/articles/10.3389/fbloc.2024.1362939/full)
- [Website](https://joincircles.net/)
- [Whitepaper](https://handbook.joincircles.net/docs/developers/whitepaper)
- [Circles Coop closing announcement](https://x.com/CirclesUBI/status/1785305562462494741)
- [Circles Coop final report](https://circles.coop/wp-content/uploads/2024/02/Coop-Report_2501.pdf)
+3 -1
View File
@@ -7,8 +7,10 @@ tags:
- acquired
- missed-opportunity
- services
url_external: https://cmxhub.com
external_url: https://cmxhub.com
image: /img/logos/cmx.jpg
banner: /img/banners/cmx.webp
author: ""
---
### Summary
+3 -1
View File
@@ -7,8 +7,10 @@ tags:
- crypto
- social-media
- underway
url_external: https://dadacoin.com
external_url: https://dadacoin.com
image: /img/logos/dada.jpg
banner: /img/banners/dada.png
author: "Tara Merk"
---
### Summary
+3 -1
View File
@@ -7,8 +7,10 @@ status: success
tags:
- software
- success
url_external: https://debian.org/
external_url: https://debian.org/
image: /img/logos/debian.png
banner: /img/banners/debian.png
author: ""
---
### Summary
+3 -1
View File
@@ -9,8 +9,10 @@ tags:
- journalism
- success
- worker-owned
url_external: https://defector.com/
external_url: https://defector.com/
image: /img/logos/defector.png
banner: /img/banners/defector.jpg
author: ""
---
### Summary
+3 -1
View File
@@ -7,8 +7,10 @@ status: success
tags:
- crypto
- success
url_external: https://ens.domains/
external_url: https://ens.domains/
image: /img/logos/ens.jpg
banner: /img/banners/ens.jpg
author: ""
---
### Summary
+3 -1
View File
@@ -8,8 +8,10 @@ tags:
- employee-owned
- services
- success
url_external: https://forwardaction.uk/
external_url: https://forwardaction.uk/
image: /img/logos/forward.jpg
banner: /img/banners/forward.webp
author: ""
---
### Summary
+3 -1
View File
@@ -7,8 +7,10 @@ status: ambiguous
tags:
- ambiguous
- crypto
url_external: https://gitcoin.co/
external_url: https://gitcoin.co/
image: /img/logos/gitcoin.png
banner: /img/banners/gitcoin.png
author: ""
---
### Summary
+3 -1
View File
@@ -11,8 +11,10 @@ tags:
- software
- success
- worker-owned
url_external: https://groupmuse.com/
external_url: https://groupmuse.com/
image: /img/logos/groupmuse.png
banner: /img/banners/groupmuse.jpg
author: ""
---
### Summary
+3 -1
View File
@@ -8,8 +8,10 @@ tags:
- crowd-equity
- software
- success
url_external: https://hackernoon.com/
external_url: https://hackernoon.com/
image: /img/logos/hackernoon.jpg
banner: /img/banners/hackernoon.png
author: ""
---
### Summary
+3 -1
View File
@@ -9,8 +9,10 @@ tags:
- multi-stakeholder
- nonprofit
- services
url_external: https://www.crunchbase.com/organization/josephine
external_url: https://www.crunchbase.com/organization/josephine
image: /img/logos/josephine.png
banner: /img/banners/josephine.webp
author: ""
---
### Summary
+3 -1
View File
@@ -9,8 +9,10 @@ tags:
- multi-stakeholder
- services
- software
url_external: https://en.wikipedia.org/wiki/Juno_(company)
external_url: https://en.wikipedia.org/wiki/Juno_(company)
image: /img/logos/juno.png
banner: /img/banners/juno.jpg
author: ""
---
### Summary
+53
View File
@@ -0,0 +1,53 @@
---
title: MakerDAO/ SKY
date: '2026-04-14'
draft: false
description: "A decentralized stablecoin project which transitioned to full DAO governance, after dissolving its founding organization in 2021."
status: ongoing
tags:
- crypto
- ongoing
external_url: https://sky.money/
image: /img/logos/makerdao.png
banner: /img/banners/makerdao.png
author: ""
---
### Summary
MakerDAO is best known for creating the decentralized DAI stablecoin.It introduced the MKR governance token and dissolved its Foundation in 2021 to achieve full community governance. However, founder Rune Christensen returned in 2024 to push the "Endgame Plan," recentralizing before re-decentralizing into sub-DAOs. The case shows how E2C is rarely linear: projects may oscillate between centralization and decentralization based on efficiency needs.
### Motivation and Readiness
The main motivation for MakerDAOs E2C was to increase decentralization of the protocol and ecosystem. MakerDAO has always differentiated DAI as a *decentralized* stable coin, as opposed to centrally controlled competitors such as USDT (controlled by Tether Ltd.) or USDC (controlled by Circle, a publicly traded company). Decentralization here meant that rules on collateral backing the stable coin would be algorithmic and that decisions on how to change these rules would not be controlled by any single entity. Decentralization thereby also contributes towards DAIs censorship resistance, i.e. making it harder to seize or freeze when held in non-custodial accounts. Consequently, dissolving the Maker Foundation and handing full control to the community has always been part of Makers vision and strategy.
By 2019, MakerDAO was well established in the broader blockchain industry, focussing on a clear use case (issuance of DAI) and with the protocol having been stress tested by various market shocks. As such, MakerDAO transitioned at a relatively mature stage of the project.
### Process and Tensions
A core tension of the MakerDAO transition process is balancing decentralization with organizational and economic efficiency. After the dissolution of the Foundation Maker founder Rune Christensen became relatively absent from the project which was then operationally stewarded by Core Units based on decisions made by MKR token holders.
However, a little under two years later, Rune returned to propose [The Endgame Plan](https://forum.sky.money/t/the-endgame-plan-parts-1-2/15456). This plan problematized the level of complexity of MakerDAO, with increasing voter apathy from MKR token holders, who didnt feel like their voice in the project mattered anymore and had become disgruntled as to how much revenue Core Units were consuming. The Endgame Plan proposed to re-structure MakerDAO into a more minimalist core DAO, narrowly focused on core protocol functions. Autonomous sub-DAOs would then replace many Core Units to focus on smaller moonshot projects which the community had started incubating within MakerDAO. The plan was adopted via token governance and has resulted in a significant restructuring of the project and its recent rebrand to SKY (where DAI tokens became USDS and MKR tokens became SKY tokens).
Another centralizing force in MakerDAO is the issue of remaining OFAC compliant. To maintain compliance (i.e. being able to exclude actors blacklisted by OFAC from transacting within the system), usually a centralized entity is required. Yet, MakerDAO does not have a centralized entity to enforce requirements. To comply, the Endgame plan introduced an emergency kill-switch and the concept of a legal defense fund for the protocol. This requirement highlights external pressures shaping the E2C strategy of a project.
### Results
Throughout the various iterations of its ongoing E2C, the project is clearly progressing on its goal of making DAI more decentralized. Nevertheless, the Maker ecosystem continues to grapple with the tension of balancing decentralization and efficiency as evidenced by the ongoing implementation of the Endgame plan. As part of this transition the community has adopted a provisional constitution and the SKY Atlas. The Atlas is an evolving set of foundational rules which the community anticipates will become unchangeable over time/ as they become perfected.
### Sources
- [2017 whitepaper](https://makerdao.com/whitepaper/DaiDec17WP.pdf)
- [2019 multi-collateral whitepaper](https://makerdao.com/whitepaper/White%20Paper%20-The%20Maker%20Protocol_%20MakerDAO%E2%80%99s%20Multi-Collateral%20Dai%20(MCD)%20System-FINAL-%20021720.pdf)
- [Sky protocol whitepaper](https://makerdao.com/en/whitepaper/)
- [Maker Foundation shuts down](https://thedefiant.io/news/defi/makerdao-shuts-foundation)
- [Presentation on how MakerDAO works](https://docs.makerdao.com/getting-started/maker-protocol-101)
- [Maker Constitution](https://forum.sky.money/t/mip101-the-maker-constitution/19621)
- [SKY Atlas](https://sky-atlas.io/)
- [Updates on Endgame plan transition](https://fusion.sky.money/endgame#latest-updates)
+3 -1
View File
@@ -9,8 +9,10 @@ tags:
- success
- utilities
- worker-owned
url_external: https://namastesolar.com
external_url: https://namastesolar.com
image: /img/logos/namaste.png
banner: /img/banners/namaste.jpg
author: ""
---
### Summary
+3 -1
View File
@@ -9,8 +9,10 @@ tags:
- high-tech
- publicly-traded
- trust
url_external: https://nio.com
external_url: https://nio.com
image: /img/logos/nio.jpg
banner: /img/banners/nio.webp
author: ""
---
### Summary
+48
View File
@@ -0,0 +1,48 @@
---
title: Optimism
date: '2026-04-14'
draft: false
description: "An Ethereum scaling solution that uses an iterative approach to decentralization and a bicameral governance system."
status: ongoing
tags:
- crypto
- ongoing
- success
external_url: https://www.optimism.io/
image: /img/logos/optimism.png
banner: /img/banners/optimism.png
author: ""
---
### Summary
Optimism is an Ethereum scaling solution that launched a bicameral governance system in 2022: a Token House (token-weighted) and Citizens House (one-person-one-vote), underpinned by a working constitution. After ongoing iterative governance experiments, Season 9 shifted strategic decision making and capital allocation back toward centralized operations via OP Labs. The case highlights the ongoing tension between decentralization ideals and competitive market pressures.
### Motivation and Readiness
Optimism has advertised itself as a scaling solution to Ethereum that upholds the core protocols security. To achieve this, the OP Stack itself cannot be stewarded centrally as this would increase the risk of a centralized operator arbitrarily changing aspects of the protocol. Consequently, decentralizing governance has always been part of Optimisms long term strategy. It is also the project's main motivation to conduct an E2C.
The project kicked off its transition in April 2022, when the Optimism Foundation launched the OP token shortly after OP Labs had raised a series B investment round of USD 150 million, and at a time when the network was leading the layer 2 scaling solution industry for Ethereum with significant user traction and a production ready network. As such, its readiness to transition was likely relatively high.
### Process and Tensions
E2C in Optimism is an ever changing and ongoing process. Since the launch of the Optimism Collective, the ecosystem has been iteratively adapting its governance and structure each season (time periods similar to sprints in agile workflows). The goal is to design a new system of platform governance that would result in a better product and a more sustainable business model. To monitor its progress, the Optimism Collective commissioned researchers to come up with the [Concentration of Power Index](https://cpi-one.vercel.app/) .
Notable updates since have included specifying [milestones](https://docs.google.com/spreadsheets/d/1IpL0oTd3AgNBu_eWdjP9EjbQfZjq-_Nd3yU1H2ke3vY/edit?gid=0#gid=0) for the ecosystem on its path towards decentralization and governance minimization, the transition towards the [superchain](https://docs.optimism.io/app-developers/guides/superchain) narrative and strategy which sees Optimism as an ecosystem that encompasses all chains that are built using the technical OP stack and thus able to interoperate with each other, depend on unified governance as well as shared security and developer tooling. Although the superchain strategy was dropped again, the pivot illustrated that decentralizing governance pre-product-market-fit can be challenging as it requires re-aligning multistakeholder ecosystems when strategy changes.
### Results
The current state of Optimism makes its internal tensions tangible: On the one hand, Optimism is trying to simplify in order to balance decentralization and efficiency, on the other hand, the superchain strategy increases complexity but is deemed necessary to increase competitiveness in the increasingly crowded market of Ethereum scaling solutions. It remains to be seen, if and how these different objectives and tendencies can be balanced successfully within the ecosystem.
In its 9th season, Optimism [announced](https://gov.optimism.io/t/guide-to-season-9/10529) it would switch away from community driven initiatives (i.e. members of the Token and Citizen House proposing initiatives or allocating funding), and instead focus on fostering stronger community accountability while the main strategy and operations are conducted through OP Labs. This switch positions Optimism more akin to a public company albeit with accountability to a different set of stakeholders and possibly using novel mechanisms to enforce this accountability.
### Sources
- [OPerating manual](https://github.com/ethereum-optimism/Operating-manual)
- [Outlook OP Foundation 2026](https://www.optimism.io/blog/season-9-from-experiment-to-organization)
- [Optimisms decentralization milestones](https://docs.google.com/spreadsheets/d/1IpL0oTd3AgNBu_eWdjP9EjbQfZjq-_Nd3yU1H2ke3vY/edit?gid=0#gid=0)
- [Optimisms working constitution](https://gov.optimism.io/t/working-constitution-of-the-optimism-collective/55)
- [Optimism Documentation](https://docs.optimism.io/)
+45
View File
@@ -0,0 +1,45 @@
---
title: Proof of Humanity DAO
date: '2026-04-14'
draft: false
description: "A blockchain based identity project governed by a 1-person-1-vote DAO, which failed to establish a shared vision in the community."
status: failure
tags:
- crypto
- failure
external_url: https://proofofhumanity.id/
image: /img/logos/proof-of-humanity.png
banner: /img/banners/proof-of-humanity.png
author: ""
---
### Summary
Proof of Humanity, a blockchain-based digital identity registry, launched as a one-person-one-vote DAO in 2021. Rapid growth brought diverse communities with conflicting visions for the project. Fragmented Telegram groups prevented effective deliberation. The DAO forked in 2022 after failing to reconcile differences, showing how democratic governance requires robust deliberation infrastructure.
### Motivation and Readiness
PoH was transitioned into a DAO to experiment with the potential of a [one-person-one-vote DAO](https://blog.kleros.io/democracy-awakens/), a relatively rare mechanism in the broader blockchain ecosystem. The move gave PoH a type of first mover advantage. As the registry had only been launched a couple of months before being transitioned into a DAO, no real use case, beyond the distribution of UBI had been established or tested in the market. The early stage of transition likely contributed towards lower readiness.
### Process and Tensions
The main tension throughout the transition was a lack of unified vision in the community and an incomplete governance design which hampered the community deliberation process and lacked enforcement mechanisms. The transition was announced in a blog post and accompanied by the launch of a governance forum, the description of a very simple voting process (Humanity Improvement Proposals HIPs), and a Snapshot voting page connected to a Kleros Governor smart contract (anchoring votes on-chain).
Initially the DAO was set up to control the PoH smart contracts, the UBI smart contract and a 4.000.000 UBI treasury. The newly formed DAO was tasked with figuring out the rest, including which of the many potential [use cases](https://blog.kleros.io/proof-of-humanity-a-building-block-for-the-internet-of-the-future/) to prioritize. As the community rapidly grew, it swiftly began adopting several HIPs to build more comprehensive governance processes, such as clarifying how exactly HIPs would progress through different stages and instituting the Mission Board to implement decisions that could not be enforced automatically on-chain.
However, despite its growing sophistication, the governance process and set up was not able to accommodate for the widely different visions that different parts of the community had for the project. A crucial factor that seems to have contributed to this failure was the fact that the community relied on various different Telegram chat groups for its deliberation.Although there were official channels set up by the project founders, the community disagreed about who should be the admin of these groups and contested actions of existing admins. Given the low cost of exit new, competing groups began to emerge at a high rate. This ultimately led to a fragmentation of discourses and hampered efforts to find compromise.
Another issue that became apparent in the setup of the Mission Board was the fact that the two founding organizations, DEF and Kleros, also held different opinions on where the project should go, which led to infighting and undermined the legitimacy and efficacy of the Mission Board itself. The fact that the UBI token lost most of its value within the first few months of the DAOs existence further contributed to tensions within its community.
### Results
While PoH demonstrated that large-scale DAOs following a 1-person-1-vote principle are technically possible, the early transition and lack of supporting structures (especially for deliberation and decision enforcement) ultimately undermined the projects succes.The PoH community decided to conduct a [Peaceful Fork](https://gov.proofofhumanity.id/t/phase-3-binding-hip-74-a-peaceful-fork/2487) in November 2022. For this fork to come into effect, each side had to draw up and ratify a constitution outlining its vision and core values for the project. By voting for either of the constitutions, users could decide on which version of the protocol they would remain active. At the time of writing, only the PoH version supported by Kleros seems to remain active.
### Sources
- [PoH launch announcement](https://blog.kleros.io/proof-of-humanity-building-the-internet-of-humans/)
- [UBI launch announcement](https://blog.kleros.io/introducing-ubi-universal-basic-income-for-humans/)
- [PoH DAO launch blog post](https://blog.kleros.io/democracy-awakens/)
- [Ethnographic research report on PoHs governance and crisis](https://hal.science/hal-04855850/document)
+4 -2
View File
@@ -3,13 +3,15 @@ title: Python
date: '2023-12-22'
draft: false
description: "Python is a popular computer programming language that evolved in 2018 from a 'benevolent dictator for life' to a foundation with five-member steering council that included its founder for a term, and currently runs smoothly."
status: success
status: active
tags:
- nonprofit
- software
- success
url_external: https://python.org/
external_url: https://python.org/
image: /img/logos/python.jpg
banner: /img/banners/python.jpg
author: ""
---
### Summary
+3 -1
View File
@@ -10,8 +10,10 @@ tags:
- multi-stakeholder
- services
- success
url_external: https://signalise.coop/
external_url: https://signalise.coop/
image: /img/logos/signalise.jpg
banner: /img/banners/signalise.jpg
author: ""
---
### Summary
+3 -1
View File
@@ -8,8 +8,10 @@ tags:
- crypto
- music
- success
url_external: https://songaday.world/
external_url: https://songaday.world/
image: /img/logos/songadao.png
banner: /img/banners/songadao.jpg
author: ""
---
### Summary
+3 -1
View File
@@ -8,8 +8,10 @@ tags:
- journalism
- nonprofit
- success
url_external: https://theappeal.org/
external_url: https://theappeal.org/
image: /img/logos/the-appeal.jpg
banner: /img/banners/the-appeal.jpg
author: ""
---
### Summary
+3 -1
View File
@@ -9,8 +9,10 @@ tags:
- journalism
- success
- worker-owned
url_external: https://thebrick.house/
external_url: https://thebrick.house/
image: /img/logos/the-brick-house.jpg
banner: /img/banners/the-brick-house.png
author: ""
---
### Summary
+3 -1
View File
@@ -8,8 +8,10 @@ tags:
- acquired
- services
- success
url_external: https://well.com/
external_url: https://well.com/
image: /img/logos/the-well.png
banner: /img/banners/the-well.png
author: ""
---
### Summary
+3 -1
View File
@@ -8,8 +8,10 @@ tags:
- consumer-goods
- employee-owned
- success
url_external: https://tridentcafe.com/
external_url: https://tridentcafe.com/
image: /img/logos/trident-booksellers.png
banner: /img/banners/trident-booksellers.jpg
author: ""
---
### Summary
+3 -1
View File
@@ -7,8 +7,10 @@ status: ambiguous
tags:
- ambiguous
- crypto
url_external: https://uniswap.org
external_url: https://uniswap.org
image: /img/logos/uniswap.jpg
banner: /img/banners/uniswap.png
author: ""
---
### Summary
+50
View File
@@ -0,0 +1,50 @@
---
title: Yearn Finance
date: '2026-04-14'
draft: false
description: "A Decentralized Finance project which transitioned to user governance via a fair launch token distribution."
status: ongoing
tags:
- crypto
- ongoing
- success
external_url: https://yearn.fi/
image: /img/logos/yfi.png
banner: /img/banners/yfi.png
author: "Tara Merk"
---
### Summary
Yearn Finance launched with a "fair launch" in 2020, distributing all governance tokens to users rather than reserving any for founder Andre Cronje. Despite formal decentralization, Cronje's informal influence persisted; when he announced leaving DeFi in 2022, the token price crashed. The case illustrates how founder dependence can outlast formal ownership transitions.
### Motivation and Readiness
Three key factors seem to have driven Yearns decision to distribute governance and ownership rights to its community. Firstly, as a decentralized finance project, the goal was always to be credibly decentralized. This required Cronje to cede control. Secondly, the project benefitted from the user influx created through the incentive of its new governance token. And third, YFI launched at a time where launching a governance token simply seemed to be the thing to do within the blockchain industry.
It is difficult to make statements about the projects readiness to transition. Cronje frequently stated that he had built the project for his personal use, that he was testing in production, that it was likely there would be bugs in the code and that anyone using the application would be doing so at their own risk. As such, the intention was never for the software to be mature or ready in any way. Instead, this narrative tried to encourage participation from individuals who were willing to take risks. This culture of living dangerously is explicitly heralded in the Yearn Manifesto as something the community embraces.
### Process and Tensions
A core tension throughout YFIs E2C is that despite its formal independence from Cronje, the founder still retains outsized informal influence. This became clear when Cronjes [announcement of leaving the DeFi](https://thedefiant.io/news/markets/yearn-cronje-fantom-exit-defi) space in March 2022 sent the YFI token plummeting, despite the maturation of the ecosystem and the fact that Cronje had not worked on the project for over a year. This indicates that in the minds of many, Yearn continued to be connected to its founder. Furthermore, and perhaps unsurprisingly given the culture of living dangerously, the project has faced numerous [hacks](https://www.web3isgoinggreat.com/?id=yearn-finance-exploit-4) and crises over the past years. Finally, an interesting tension that arose shortly after community members acquired YFI tokens via the fair launch, they voted to halt token distribution, thus making YFI governance tokens a more scarce resource than initially envisioned.
### Results
Through its E2C and evolution since 2020, Yearn has clearly progressed on becoming more decentralized as its community now handles major decisions and Cronje has since decoupled himself from the project and moved onto other projects (remaining in DeFi). Nevertheless, Yearn sees its E2C as an ongoing process. Yearn Finance 3 [whitepaper](https://caladex.io/api/files/papers/Yearn%20Finance%20white%20paper.pdf) describes: “weve got a firm goal in mind: become a truly community driven Decentralized Finance platform (DeFi), where our investors can make their voices heard and the Yearn Finance 3 team just provides the foundations and a framework to create a real governance over the token YFI3.” This indicates that Yearn understands its community as being one of investors, thus emphasizing the financial relationship that people have with the project rather than anything else.
In late 2025 the community also adopted a [proposal](https://gov.yearn.fi/t/yip-88-governance-overhaul-dao-restructuring/14553) for another governance overhaul which changed yTeams from being relatively independent, functionally organized squads, to becoming self-contained, revenue earning units. To receive a budget, these units have to justify their needs by showing their revenue on-chain. Maintenance work is kept minimal and constrained to tightly scoped, time-bound projects executed within the DAO Ops Team. The new yTeams also mandatorily need to adopt a split contract to automatically allocate rewards amongst their contributors.
### Sources
- [The Yearn blue pill](https://yfistory.org/thebluepill)
- [About Andre Cronje](https://coinmarketcap.com/academy/article/who-is-andre-cronje)
- [YFI profile](https://www.gemini.com/cryptopedia/what-is-yearn-finance-yfi-coin-yearnfinance)
- [Yearn Governance 2.0](https://gov.yearn.fi/t/yip-61-governance-2-0/10460)
- [YFI Governance overhaul proposal passed in 2025](https://gov.yearn.fi/t/yip-88-governance-overhaul-dao-restructuring/14553)
- [Yearn Finance 3 whitepaper](https://caladex.io/api/files/papers/Yearn%20Finance%20white%20paper.pdf)
- [Token-Centric Work Practices in Fluid Organizations: The Cases of Yearn and MakerDAO](https://www.researchgate.net/profile/Nina-Schirrmacher/publication/356490357_Token-Centric_Work_Practices_in_Fluid_Organizations_The_Cases_of_Yearn_and_MakerDAO/links/619da071d7d1af224b2010ec/Token-Centric-Work-Practices-in-Fluid-Organizations-The-Cases-of-Yearn-and-MakerDAO.pdf)
+14 -10
View File
@@ -7,21 +7,24 @@ The E2C Collective is a group of practitioners, researchers, and allies who coll
Want to contribute to this resource library? Have a story to share or questions about community ownership transitions? Are you looking for support for your own E2C process? We'd love to hear from you.
## Add your story
If you know of a company that has attempted or achieved an exit to community transition, we'd love to include it in our case study library.
<a class="btn" href="/add-your-story/">Contribute a story</a>
## Get involved or get support
Want to plan your community exit strategy? Got experience or legal snippets you'd like to share? We'd love to hear from you!
<div class="contact-form-container">
<form class="e2c-contact-form" action="#" method="post">
<!-- Action Network Form Embed -->
<link href='https://actionnetwork.org/css/style-embed-v3.css' rel='stylesheet' type='text/css' />
<script src='https://actionnetwork.org/widgets/v3/form/e2c-website-join-form?format=js&source=widget&clear_id=true'></script>
<div id='can-form-area-e2c-website-join-form' style='width: 100%'></div>
<!-- Fallback form for cases where JS is disabled -->
<noscript>
<form class="e2c-contact-form" action="https://actionnetwork.org/forms/e2c-website-join-form" method="post">
<div class="form-group">
<label for="country">Country *</label>
<select id="country" name="country" required>
<select id="country" name="person[country]" required>
<option value="">Select your country</option>
<option value="US">United States</option>
<option value="CA">Canada</option>
@@ -50,19 +53,19 @@ Want to plan your community exit strategy? Got experience or legal snippets you'
</div>
<div class="form-group">
<label for="email">Email *</label>
<input type="email" id="email" name="email" required>
<input type="email" id="email" name="person[email]" required>
</div>
<div class="form-group">
<label for="name">Name</label>
<input type="text" id="name" name="name">
<input type="text" id="name" name="person[given_name]">
</div>
<div class="form-group">
<label for="organization">Organization</label>
<input type="text" id="organization" name="organization">
<input type="text" id="organization" name="person[employer]">
</div>
<div class="form-group">
<label for="organization_url">Organization URL</label>
<input type="url" id="organization_url" name="organization_url" placeholder="https://">
<input type="url" id="organization_url" name="person[website]" placeholder="https://">
</div>
<div class="form-group">
<label>Interests in E2C</label>
@@ -97,5 +100,6 @@ Want to plan your community exit strategy? Got experience or legal snippets you'
</div>
<button type="submit" class="submit-btn">Submit</button>
</form>
</noscript>
</div>
@@ -6,8 +6,6 @@ tags:
- Filing
- Public-policy
- United-States
type: legal-snippet
layout: single
external_url: https://www.sec.gov/comments/s7-18-18/s71818-4403356-175575.pdf
files_media: ../../Exit%20to%20Community%20Stories%20&%20Strategies%202ee6f9c491af45648511f5df33c5cfc5/s71818-4403356-175575.pdf
---
-2
View File
@@ -5,8 +5,6 @@ tags:
- Investment
- Netherlands
- Steward-ownership
type: legal-snippet
layout: single
external_url: https://www.alkemio.org/structure/
files_media:
- ../../Exit%20to%20Community%20Stories%20&%20Strategies%202ee6f9c491af45648511f5df33c5cfc5/Alkemio-PurchaseAgreement.pdf,
-2
View File
@@ -5,7 +5,5 @@ tags:
- Australia
- Bylaws
- Cooperative
type: legal-snippet
layout: single
external_url: https://bccm.coop/co-op-builder-tool/
---
-2
View File
@@ -6,7 +6,5 @@ tags:
- Cooperative
- LCA
- United-States
type: legal-snippet
layout: single
external_url: https://help.collab.land/governance/charter
---
@@ -4,7 +4,5 @@ description: Aiming to find a middle ground between a for-profit and not-for-pro
tags:
- Investment
- UK
type: legal-snippet
layout: single
files_media: ../../Exit%20to%20Community%20Stories%20&%20Strategies%202ee6f9c491af45648511f5df33c5cfc5/Sample_term_sheet__guardian_share.docx
---
@@ -4,7 +4,5 @@ description: How policymakers can support the financing of shared ownership acro
tags:
- Public-policy
- United-States
type: legal-snippet
layout: single
external_url: https://democracypolicy.network/the-agenda/policy_kit/financing-shared-ownership
---
@@ -4,7 +4,5 @@ description: IPO with Class B Common Stock which grants employees and directors
tags:
- Filing
- United-States
type: legal-snippet
layout: single
external_url: https://www.sec.gov/Archives/edgar/data/1830214/000119312521275407/d172577d424b3.htm#rom172577_78
---
@@ -0,0 +1,8 @@
---
title: Community Ownership Policy Guide
description: Policy strategies for community-controlled land and housing from Ground Works Consulting
tags:
- Policy
- United-States
external_url: https://www.groundworksconsulting.org/ourwork/community-ownership-policy-guide
---
@@ -4,7 +4,5 @@ description: Revenue-based equity financing term sheet with a 3x cap on return t
tags:
- Investment
- United-States
type: legal-snippet
layout: single
external_url: https://github.com/indievc/terms
---
-2
View File
@@ -4,7 +4,5 @@ description: Legal framework for enabling worker-ownership buyouts of endangered
tags:
- Italy
- Public-policy
type: legal-snippet
layout: single
external_url: https://www.researchgate.net/profile/Marcelo-Vieta/publication/316360529_THE_ITALIAN_ROAD_TO_RECUPERATING_ENTERPRISES_AND_THE_LEGGE_MARCORA_FRAMEWORK_Italy's_Worker_Buyouts_in_Times_of_Crisis/links/58fb664e0f7e9ba3ba5237d4/THE-ITALIAN-ROAD-TO-RECUPERATING-ENTERPRISES-AND-THE-LEGGE-MARCORA-FRAMEWORK-Italys-Worker-Buyouts-in-Times-of-Crisis.pdf
---
@@ -7,7 +7,5 @@ tags:
- Investment
- LCA
- United-States
type: legal-snippet
layout: single
external_url: https://www.dropbox.com/scl/fo/20gqmeee9j2zgn4sibt4r/AIEsVgetO6b4HJ7pGUfmHFI?rlkey=os0dz2a3pevaodbnj7btdwag8&e=7&st=lr1yadcj&dl=0
---
@@ -0,0 +1,10 @@
---
title: Public Evaluation of Public Benefit
description: A mechanism for more robustly aligning an organization with a public benefit purpose, from the AI & Democracy Foundation.
tags:
- Governance
- United-States
- Steward-ownership
external_url: https://ai-democracy.org/public-evaluation-of-public-benefit/
#files_media:
---
-2
View File
@@ -3,7 +3,5 @@ title: 'Right To Own: A Policy Framework to Catalyze Worker Ownership Transition
description: Reviews and proposes polices to encourage employee ownership conversions.
tags:
- Public-policy
type: legal-snippet
layout: single
external_url: https://thenextsystem.org/rto
---
@@ -3,7 +3,5 @@ title: Shared Earnings Agreement (SEAL)
description: “The goal of a SEAL is to align the interests of investors and founders in a wide variety of outcomes, while giving founders full control of their business and keeping as much optionality as possible open for the business.”
tags:
- Investment
type: legal-snippet
layout: single
external_url: https://calmfund.com/shared-earnings-agreement
---
-2
View File
@@ -5,8 +5,6 @@ tags:
- Bylaws
- Finland
- Investment
type: legal-snippet
layout: single
external_url: https://drive.google.com/drive/u/1/folders/138TkcSEVCyjOXByM0QUR7M4iWch8u6tM
files_media: ../../Exit%20to%20Community%20Stories%20&%20Strategies%202ee6f9c491af45648511f5df33c5cfc5/Sharetribes_Articles_of_Association_and_Shareholders_Agreement-20240522T043504Z-001.zip
---
@@ -4,8 +4,6 @@ description: Term sheet provision with a government-backed venture firm with an
tags:
- Investment
- Italy
type: legal-snippet
layout: single
---
## Exit dallInvestimento
@@ -0,0 +1,20 @@
---
title: Workers Capital Rider
description: A rider for investment terms that helps ensure a worker-friendly outcome, developed by Eduardo Cabral of Triple Beam Advisors.
tags:
- cooperative
- investment
external_url: https://www.triplebeamadvisors.com/
files_media: ../../Exit%20to%20Community%20Stories%20&%20Strategies%202ee6f9c491af45648511f5df33c5cfc5/s71818-4403356-175575.pdf
---
1. Reserve **X%** of the total financing round (or **$Xk**) for investors committed to:
1. A **capped return model**, targeting no more than **X% IRR or a fixed MOIC**, with excess gains recycled into employee equity pools or retained for other company purposes; and/or
2. **Aligned exit incentives** whereby upon a Corporate Transaction (or other to-be-agreed milestones), investors recoup any gain on their invested capital _only_ if employee ownership pools or other forms of incentive equity (excluding those granted to the founders) also receive at least 50% of the full liquidity they are entitled to under the waterfall provisions (or otherwise distributions will be prorated as needed to ensure an equitable distribution to the employees).
2. **Prioritize Shared-Risk & Embedded Shared-Outcome Structures**: Collaborate with Investors who embrace frameworks inspired by solidarity economics and cooperative finance, such as:
1. **Profit-sharing**: Returns tied to enterprise success, not fixed interest;
2. **Worker-Investor Covenants**: Mechanisms (e.g., side agreements, SAFE-like instruments) to ensure capital providers share both upside and downside risk with labor stakeholders.
3. **Worker Friendly Governance**: Optionality for economic rebalancing (e.g., redistributive equity pools triggered at exit).
4. **Vesting-Adjusted Dividends**: Investor dividends accrue but only vest upon equivalent employee profit-sharing milestones.
3. **Transparency & Accountability**:
1. Report annually on progress toward sourcing solidarity-aligned capital, including challenges faced.
+5
View File
@@ -0,0 +1,5 @@
---
title: Resources
description: "Educational materials, media coverage, and tools for Exit to Community"
---
+11
View File
@@ -0,0 +1,11 @@
---
title: "Exit to Community Calculators"
date: 2024-02-01
description: "Post on tool development for assessing E2C readiness"
external_url: https://medium.com/metagov/exit-to-community-calculators-a-framework-and-tool-to-help-organizations-assess-their-e2c-5fcbd006d227
tags:
- publication
- tool
#image:
---
+12
View File
@@ -0,0 +1,12 @@
---
title: "Interview with Tara Merk on E2C"
date: 2023-12-18
description: "Featuring Merk on Alana Podrx's Friday Futures series"
external_url: https://podrx.substack.com/p/exit-to-community
tags:
- academic
- press
#image:
---
<iframe width="560" height="315" src="https://www.youtube.com/embed/bm9rItK4_VA?si=kdGOg3gfQkE7-M0l" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
+10
View File
@@ -0,0 +1,10 @@
---
title: "Digital Kelsoism: Employee Stock Ownership as a Pattern for the Online Economy"
date: 2020-10-19
external_url: https://osf.io/preprints/mediarxiv/m82zx_v1
description: "Article by Nathan Schneider on lessons from employee stock ownership plans for E2C"
tags:
- publications
- academic
- policy
---
+11
View File
@@ -0,0 +1,11 @@
---
title: "E2C @ MEDLab"
description: "E2C publications and events at the University of Colorado Boulder's Media Economies Design Lab"
external_url: https://www.colorado.edu/lab/medlab/exit-to-community
tags:
- academic
- publication
- events
#image:
---
+9
View File
@@ -0,0 +1,9 @@
---
title: "Noema intro to E2C"
date: 2020-08-27
external_url: https://www.noemamag.com/exit-to-community/
description: "Essay on the basics of E2C in Noema magazine by Nathan Schneider"
tags:
- publications
- getting-started
---
+4 -3
View File
@@ -2,10 +2,11 @@
title: E2C Primer
date: '2025-06-24'
draft: false
type: resource
section: resources
layout: resource
description: "A comprehensive introduction to Exit to Community concepts and strategies"
tags:
- primer
- education
- getting-started
---
## Introduction to Exit to Community
+11
View File
@@ -0,0 +1,11 @@
---
title: "Exit To Community: Strategies for Multi-Stakeholder Ownership in the Platform Economy"
description: "Law review article on the legal and regulatory possibilities of E2C, by Morshed Mannan and Nathan Schneider"
external_url: https://georgetownlawtechreview.org/exit-to-community-strategies-for-multi-stakeholder-ownership-in-the-platform-economy/GLTR-05-2021/
tags:
- academic
- publication
- policy
#image:
---
-86
View File
@@ -1,86 +0,0 @@
---
title: Education
date: '2025-06-24'
draft: false
type: resource
section: resources
layout: resource
description: "Educational resources, courses, and learning materials for Exit to Community"
---
## Learning Pathways
**Getting Started**
- [E2C Primer](/resources/e2c-primer/) - Comprehensive introduction to Exit to Community concepts
- Overview of cooperative governance models
- Understanding legal structures and requirements
**For Founders and Organizations**
- Assessing readiness for E2C transition
- Community engagement strategies
- Financial planning for ownership transition
- Legal frameworks and implementation
**For Communities and Users**
- Rights and responsibilities in community ownership
- Democratic governance participation
- Understanding cooperative economics
## Case Study Learning
**Real-World Examples**
- [Browse all case studies](/case-studies/) to learn from actual E2C transitions
- Industry-specific examples across tech, media, and social platforms
- Lessons learned from successful and challenging transitions
**Legal Framework Examples**
- [Explore legal snippets](/legal-snippets/) for practical documentation
- Bylaws, governance structures, and policy templates
- Multi-jurisdictional approaches and considerations
## Educational Partnerships
**Academic Collaborations**
- Research partnerships with universities
- Student projects and thesis opportunities
- Faculty resources for cooperative economics courses
**Professional Development**
- Workshops for lawyers, consultants, and advisors
- Training for organizational development professionals
- Certification programs for E2C specialists
## Tools and Templates
**Planning Resources**
- E2C readiness assessment frameworks
- Community engagement toolkits
- Transition timeline templates
- Governance structure guides
**Implementation Support**
- Legal document templates
- Financial modeling resources
- Communication strategy guides
- Stakeholder mapping tools
## Research and Publications
**Academic Resources**
- Working papers on community ownership models
- Economic analysis of cooperative transitions
- Comparative studies across industries and regions
- Policy recommendations and advocacy resources
## Community Learning
**Peer Networks**
- Connect with other organizations exploring E2C
- Mentorship opportunities with successful transitions
- Regular webinars and discussion forums
- Regional meetups and conferences
## Get Involved
Ready to learn more? [Contact us](/contact/) about educational opportunities, or [share your story](/add-your-story/) to contribute to the E2C learning community.
@@ -0,0 +1,9 @@
---
title: "Financing Shared Ownership"
date: 2025-06-16
external_url: https://democracypolicy.network/agenda/open-country/open-economy/financing-shared-ownership
description: "Policy report for state legislators on shared ownership strategies, including E2C"
tags:
- publications
- policy
---
@@ -0,0 +1,10 @@
---
title: "How to Exit to Community: A Cookbook for Blockchain Communities"
date: 2026-08-26
description: "A toolkit for blockchain projects to decentralize governance"
external_url: https://www.colorado.edu/lab/medlab/2026/08/26/how-exit-community-cookbook-blockchain-communities
tags:
- publication
#image:
---
-52
View File
@@ -1,52 +0,0 @@
---
title: Media
date: '2025-06-24'
draft: false
type: resource
section: resources
layout: resource
description: "Media coverage, publications, and press resources about Exit to Community"
---
## Featured Coverage
**Exit to Community in the News**
- Recent articles and coverage of E2C transitions
- Analysis pieces on community ownership models
- Interviews with founders who chose E2C paths
## Academic Publications
**Research and Analysis**
- [The Italian Road to Creating Worker Cooperatives](/legal-snippets/the-italian-road-to-creating-worker-cooperatives/) - Academic research on worker buyouts
- Policy papers on alternative exit strategies
- Comparative studies of cooperative governance models
## Media Case Studies
**Journalism and Media Organizations**
- [Defector Media](/case-studies/defector-media/) - Sports journalism as a worker cooperative
- [The Appeal](/case-studies/the-appeal/) - Criminal justice reporting as a worker-led nonprofit
**Creative Platforms**
- [Are.na](/case-studies/are-na/) - Social platform for artists and students exploring community ownership
## Press Kit
**For Journalists and Researchers**
- High-resolution logos and brand assets
- Key statistics about community ownership
- Expert contacts for interviews
- Fact sheets on E2C models
## Media Partnerships
**Collaborative Coverage**
- Working with media organizations exploring E2C
- Supporting journalism on cooperative economics
- Facilitating connections between E2C practitioners and reporters
## Get in Touch
Interested in covering Exit to Community stories? [Contact us](/contact/) for press resources, expert interviews, and story leads.
+12
View File
@@ -0,0 +1,12 @@
---
title: "Interview with Tara Merk on E2C"
date: 2023-12-18
description: "Featuring Merk on Alana Podrx's Friday Futures series"
external_url: https://podrx.substack.com/p/exit-to-community
tags:
- academic
- press
#image:
---
<iframe width="560" height="315" src="https://www.youtube.com/embed/bm9rItK4_VA?si=kdGOg3gfQkE7-M0l" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
+10
View File
@@ -0,0 +1,10 @@
---
title: "Exit to Community: A Community Primer"
description: "Collaborative zine published in 2020 introducing the E2C idea"
external_url: https://www.colorado.edu/lab/medlab/2020/08/31/exit-community-community-primer
tags:
- getting-started
- publication
#image:
---
+9
View File
@@ -0,0 +1,9 @@
---
title: "To Community"
description: "From Metagov, a set of strategies for bonding companies to communities"
external_url: https://to.community/
tags:
- tool
#image:
---
+12
View File
@@ -0,0 +1,12 @@
---
title: "Why to DAO: a narrative analysis of the drivers of tokenized Exit to Community"
date: 2024-07-19
description: "Research paper by Tara Merk on motivations for community ownership"
external_url: https://arxiv.org/abs/2407.14327
tags:
- academic
- crypto
- publication
#image:
---
+4
View File
@@ -10,6 +10,10 @@ title = 'Exit to Community'
[markup.goldmark]
[markup.goldmark.renderer]
unsafe = true
[markup.goldmark.extensions]
[markup.goldmark.extensions.typographer]
leftdoublequote = '&ldquo;'
rightdoublequote = '&rdquo;'
[menu]
[[menu.main]]
+60 -762
View File
@@ -3,757 +3,43 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ if .Title }}{{ .Title }} - {{ end }}{{ .Site.Title }}</title>
<title>{{ if and .Title (ne .Title .Site.Title) }}{{ .Title }} - {{ end }}{{ .Site.Title }}</title>
<meta name="description" content="{{ .Description | default .Site.Params.description }}">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
<!-- Open Graph / Social Media Meta Tags -->
<meta property="og:title" content="{{ if and .Title (ne .Title .Site.Title) }}{{ .Title }} - {{ end }}{{ .Site.Title }}">
<meta property="og:description" content="{{ .Description | default .Site.Params.description }}">
<meta property="og:type" content="website">
<meta property="og:url" content="{{ .Permalink }}">
{{ if .Params.image }}<meta property="og:image" content="{{ .Site.BaseURL }}{{ .Params.image }}">{{ end }}
{{ if .Params.banner }}<meta property="og:image" content="{{ .Site.BaseURL }}{{ .Params.banner }}">{{ end }}
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="{{ if and .Title (ne .Title .Site.Title) }}{{ .Title }} - {{ end }}{{ .Site.Title }}">
<meta name="twitter:description" content="{{ .Description | default .Site.Params.description }}">
{{ if .Params.image }}<meta name="twitter:image" content="{{ .Site.BaseURL }}{{ .Params.image }}">{{ end }}
{{ if .Params.banner }}<meta name="twitter:image" content="{{ .Site.BaseURL }}{{ .Params.banner }}">{{ end }}
<link rel="stylesheet" href="/css/main.css">
<!-- Matomo -->
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="https://analytics.medlab.host/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '6']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
<!-- End Matomo Code -->
<style>
@import url('/fonts/space-grotesk-local.css');
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
:root {
--e2c-yellow: #F4D03F;
--e2c-dark-yellow: #E8C547;
--text-primary: #2C3E50;
--text-secondary: #7F8C8D;
--background: #FEFEFE;
--card-background: #FFFFFF;
--border: #E5E8E8;
--shadow: rgba(0, 0, 0, 0.08);
}
body {
font-family: 'Space Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
line-height: 1.6;
color: var(--text-primary);
background: var(--background);
font-weight: 400;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 24px;
}
.site-header {
background-image: url('/img/notion_bg-1.png');
background-size: cover;
background-position: center top;
background-repeat: no-repeat;
border-bottom: 1px solid var(--border);
padding: 16px 0;
position: sticky;
top: 0;
z-index: 100;
min-height: 80px;
}
nav {
display: flex;
justify-content: space-between;
align-items: center;
}
.logo {
display: flex;
align-items: center;
text-decoration: none;
color: var(--text-primary);
font-weight: 600;
font-size: 1.2rem;
background: rgba(255, 255, 255, 0.9);
padding: 8px 16px;
border-radius: 24px;
backdrop-filter: blur(8px);
border: 1px solid rgba(255, 255, 255, 0.3);
}
.logo img {
height: 36px;
margin-right: 10px;
}
.nav-links {
display: flex;
list-style: none;
gap: 16px;
margin: 0;
}
.nav-links a {
text-decoration: none;
color: var(--text-primary);
font-weight: 500;
font-size: 14px;
padding: 8px 16px;
border-radius: 20px;
transition: all 0.2s ease;
background: rgba(255, 255, 255, 0.9);
backdrop-filter: blur(8px);
border: 1px solid rgba(255, 255, 255, 0.3);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
.nav-links a:hover {
background: var(--e2c-yellow);
border-color: var(--e2c-yellow);
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
main {
padding: 48px 0;
min-height: calc(100vh - 200px);
}
footer {
background: var(--card-background);
border-top: 1px solid var(--border);
padding: 48px 0 32px 0;
color: var(--text-secondary);
font-size: 14px;
}
.footer-content {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 48px;
align-items: start;
}
.footer-section h3 {
color: var(--text-primary);
font-size: 1.25rem;
margin-bottom: 16px;
font-weight: 600;
}
.footer-section p {
margin-bottom: 16px;
line-height: 1.6;
}
.newsletter-signup {
margin-top: 24px;
}
.custom-newsletter-form .form-group {
display: flex;
gap: 8px;
margin-bottom: 12px;
}
.email-input {
flex: 1;
font-family: 'Space Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
font-weight: 400;
font-size: 14px;
padding: 10px 16px;
border: 1px solid var(--border);
border-radius: 24px;
background: rgba(255, 255, 255, 0.9);
color: var(--text-primary);
transition: all 0.2s ease;
}
.email-input:focus {
outline: none;
border-color: var(--e2c-yellow);
box-shadow: 0 0 0 2px rgba(244, 208, 63, 0.2);
}
.email-input::placeholder {
color: var(--text-secondary);
}
.subscribe-btn {
font-family: 'Space Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
font-weight: 500;
font-size: 14px;
padding: 10px 20px;
background: var(--e2c-yellow);
color: var(--text-primary);
border: 2px solid var(--e2c-yellow);
border-radius: 24px;
cursor: pointer;
transition: all 0.2s ease;
white-space: nowrap;
}
.subscribe-btn:hover {
background: var(--e2c-dark-yellow);
border-color: var(--e2c-dark-yellow);
transform: translateY(-1px);
}
.form-note {
font-size: 12px;
color: var(--text-secondary);
margin: 0;
font-style: italic;
}
.footer-links {
text-align: right;
}
.footer-links p {
margin-bottom: 8px;
}
h1, h2, h3, h4, h5, h6 {
margin-bottom: 16px;
color: var(--text-primary);
font-weight: 600;
line-height: 1.3;
}
h1 {
font-size: 2.5rem;
font-weight: 700;
}
h2 {
font-size: 2rem;
}
h3 {
font-size: 1.5rem;
}
p {
margin-bottom: 16px;
color: var(--text-secondary);
line-height: 1.7;
}
a {
color: var(--text-primary);
text-decoration: underline;
text-decoration-color: var(--e2c-yellow);
text-underline-offset: 3px;
transition: all 0.2s ease;
}
a:hover {
color: var(--text-primary);
text-decoration-color: var(--e2c-dark-yellow);
}
.btn {
display: inline-block;
padding: 12px 24px;
background: var(--e2c-yellow);
color: var(--text-primary);
text-decoration: none;
border-radius: 24px;
margin: 8px 0;
font-weight: 500;
font-size: 15px;
transition: all 0.2s ease;
border: 2px solid var(--e2c-yellow);
}
.btn:hover {
background: var(--e2c-dark-yellow);
border-color: var(--e2c-dark-yellow);
color: var(--text-primary);
transform: translateY(-1px);
}
.card {
background: var(--card-background);
border: 1px solid var(--border);
border-radius: 16px;
padding: 24px;
margin-bottom: 24px;
box-shadow: 0 4px 12px var(--shadow);
transition: all 0.2s ease;
}
.card:hover {
transform: translateY(-2px);
box-shadow: 0 8px 24px var(--shadow);
}
.grid {
display: grid;
gap: 24px;
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
}
.hero {
text-align: center;
padding: 64px 0;
background: linear-gradient(135deg, var(--background) 0%, #F8F9FA 100%);
border-radius: 24px;
margin-bottom: 48px;
}
.hero h1 {
font-size: 3.5rem;
margin-bottom: 24px;
background: linear-gradient(135deg, var(--text-primary) 0%, var(--text-secondary) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.hero p {
font-size: 1.25rem;
max-width: 600px;
margin: 0 auto 32px;
}
.hero-section {
background: var(--e2c-yellow);
padding: 4rem 2rem;
margin: 0 0 3rem 0;
border-radius: 24px;
}
.hero-content {
display: flex;
align-items: center;
gap: 3rem;
max-width: 1200px;
margin: 0 auto;
}
.hero-image {
width: 300px;
height: auto;
border-radius: 16px;
}
.hero-text h1 {
font-size: 3rem;
margin: 0 0 1rem 0;
color: var(--text-primary);
}
.hero-text p {
font-size: 1.25rem;
margin: 0;
color: var(--text-primary);
}
.intro-section {
margin: 3rem 0;
text-align: center;
}
.intro-section h2 {
color: var(--e2c-yellow);
margin-bottom: 1rem;
}
.intro-section ul {
list-style: none;
padding: 0;
margin: 2rem 0;
display: grid;
gap: 12px;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
max-width: 800px;
margin-left: auto;
margin-right: auto;
}
.intro-section ul li {
background: var(--e2c-yellow);
color: var(--text-primary);
padding: 16px 20px;
border-radius: 12px;
font-weight: 500;
text-align: center;
line-height: 1.4;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
transition: all 0.2s ease;
}
.intro-section ul li:hover {
transform: translateY(-2px);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
}
.cards-grid {
display: grid;
gap: 24px;
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
margin: 3rem 0;
}
.card .button {
display: inline-block;
padding: 12px 24px;
background: var(--e2c-yellow);
color: var(--text-primary);
text-decoration: none;
border-radius: 24px;
margin-top: 16px;
font-weight: 500;
font-size: 15px;
transition: all 0.2s ease;
border: 2px solid var(--e2c-yellow);
}
.card .button:hover {
background: var(--e2c-dark-yellow);
border-color: var(--e2c-dark-yellow);
transform: translateY(-1px);
}
.partnership-section {
text-align: center;
margin: 4rem 0;
padding: 2rem;
background: #F8F9FA;
border-radius: 16px;
}
.partnership-image {
width: 200px;
height: auto;
border-radius: 16px;
margin-bottom: 1rem;
}
.main-sections {
margin: 4rem 0;
}
.main-sections h2 {
text-align: center;
color: var(--text-primary);
margin-bottom: 2rem;
font-size: 2.5rem;
}
.primary-cards {
display: grid;
gap: 32px;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
margin-bottom: 2rem;
}
.primary-card {
background: var(--card-background);
border: 2px solid var(--e2c-yellow);
border-radius: 20px;
padding: 32px;
text-align: center;
box-shadow: 0 8px 24px var(--shadow);
transition: all 0.3s ease;
}
.primary-card:hover {
transform: translateY(-4px);
box-shadow: 0 16px 40px var(--shadow);
border-color: var(--e2c-dark-yellow);
}
.primary-card h3 {
font-size: 1.5rem;
color: var(--text-primary);
margin-bottom: 1rem;
}
.primary-card p {
color: var(--text-secondary);
margin-bottom: 1.5rem;
}
.secondary-actions {
margin: 3rem 0;
padding: 2rem;
background: #F8F9FA;
border-radius: 16px;
}
.secondary-actions h3 {
text-align: center;
color: var(--text-primary);
margin-bottom: 1.5rem;
font-size: 1.5rem;
}
.secondary-cards {
display: grid;
gap: 24px;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
}
.secondary-card {
background: var(--card-background);
border: 1px solid var(--border);
border-radius: 12px;
padding: 24px;
text-align: center;
transition: all 0.2s ease;
}
.secondary-card:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px var(--shadow);
}
.secondary-card h4 {
font-size: 1.1rem;
color: var(--text-primary);
margin-bottom: 0.5rem;
}
.secondary-card p {
color: var(--text-secondary);
margin-bottom: 1rem;
font-size: 0.9rem;
}
.secondary-button {
display: inline-block;
padding: 8px 16px;
background: transparent;
color: var(--text-primary);
text-decoration: none;
border: 1px solid var(--border);
border-radius: 16px;
font-weight: 500;
font-size: 14px;
transition: all 0.2s ease;
}
.secondary-button:hover {
background: var(--e2c-yellow);
border-color: var(--e2c-yellow);
transform: translateY(-1px);
}
/* Hide auto-generated cards on homepage only */
.home .grid {
display: none !important;
}
/* Case study logo styling */
.case-logo {
width: 64px;
height: 64px;
object-fit: contain;
border-radius: 8px;
margin-bottom: 16px;
background: rgba(255, 255, 255, 0.9);
padding: 8px;
border: 1px solid var(--border);
}
/* Case study detail page logo */
.case-detail-logo {
width: 120px;
height: 120px;
object-fit: contain;
border-radius: 16px;
margin-bottom: 24px;
background: rgba(255, 255, 255, 0.9);
padding: 16px;
border: 1px solid var(--border);
box-shadow: 0 4px 12px var(--shadow);
}
@media (max-width: 768px) {
.nav-links {
gap: 6px;
flex-wrap: wrap;
}
.nav-links a {
padding: 6px 10px;
font-size: 12px;
border-radius: 16px;
}
.logo {
font-size: 0.9rem;
padding: 5px 10px;
}
.logo img {
height: 24px;
margin-right: 5px;
}
.site-header {
padding: 8px 0;
min-height: 48px;
}
.hero h1 {
font-size: 2.5rem;
}
.hero p {
font-size: 1.1rem;
}
.container {
padding: 0 16px;
}
.hero-content {
flex-direction: column;
text-align: center;
}
.hero-image {
width: 200px;
}
.hero-text h1 {
font-size: 2rem;
}
.hero-section {
margin: 0 0.5rem 2rem 0.5rem;
padding: 2rem 1rem;
}
.primary-cards {
grid-template-columns: 1fr;
}
.footer-content {
grid-template-columns: 1fr;
gap: 32px;
text-align: center;
}
.footer-links {
text-align: center;
}
.custom-newsletter-form .form-group {
flex-direction: column;
gap: 12px;
}
.subscribe-btn {
align-self: center;
min-width: 120px;
}
}
@media (min-width: 769px) and (max-width: 1024px) {
.primary-cards {
grid-template-columns: 1fr;
}
}
/* Contact Form Styling */
.contact-form-container {
max-width: 500px;
margin: 2rem auto;
padding: 2rem;
background: var(--card-background);
border-radius: 16px;
box-shadow: 0 4px 12px var(--shadow);
border: 1px solid var(--border);
}
.e2c-contact-form .form-group {
margin-bottom: 1.5rem;
}
.e2c-contact-form label {
display: block;
margin-bottom: 0.5rem;
font-weight: 500;
color: var(--text-primary);
font-size: 14px;
}
.e2c-contact-form input[type="text"],
.e2c-contact-form input[type="email"],
.e2c-contact-form input[type="url"],
.e2c-contact-form select,
.e2c-contact-form textarea {
width: 100%;
padding: 12px 16px;
border: 1px solid var(--border);
border-radius: 8px;
font-family: 'Space Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
font-size: 14px;
background: var(--background);
color: var(--text-primary);
transition: all 0.2s ease;
}
.e2c-contact-form input:focus,
.e2c-contact-form select:focus,
.e2c-contact-form textarea:focus {
outline: none;
border-color: var(--e2c-yellow);
box-shadow: 0 0 0 2px rgba(244, 208, 63, 0.2);
}
.e2c-contact-form textarea {
resize: vertical;
min-height: 100px;
}
.checkbox-group {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.checkbox-label {
display: flex !important;
align-items: center;
gap: 0.5rem;
font-weight: 400 !important;
margin-bottom: 0 !important;
cursor: pointer;
}
.e2c-contact-form input[type="checkbox"],
.e2c-contact-form input[type="radio"] {
width: auto;
margin: 0;
accent-color: var(--e2c-yellow);
}
.submit-btn {
width: 100%;
padding: 14px 24px;
background: var(--e2c-yellow);
color: var(--text-primary);
border: 2px solid var(--e2c-yellow);
border-radius: 24px;
font-family: 'Space Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
font-weight: 600;
font-size: 16px;
cursor: pointer;
transition: all 0.2s ease;
}
.submit-btn:hover {
background: var(--e2c-dark-yellow);
border-color: var(--e2c-dark-yellow);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
@media (max-width: 768px) {
.contact-form-container {
margin: 1rem;
padding: 1.5rem;
}
}
</style>
</head>
<body>
<header class="site-header">
@@ -762,6 +48,11 @@
<a href="/" class="logo">
<img src="/img/yellow_e2c.png" alt="Exit to Community" />
</a>
<button class="mobile-menu-toggle" aria-label="Toggle mobile menu">
<span class="hamburger-line"></span>
<span class="hamburger-line"></span>
<span class="hamburger-line"></span>
</button>
<ul class="nav-links">
<li><a href="/case-studies/">Case Studies</a></li>
<li><a href="/legal-snippets/">Legal Snippets</a></li>
@@ -772,6 +63,8 @@
</div>
</header>
<div class="mobile-menu-overlay"></div>
<main>
<div class="container">
{{ block "main" . }}{{ end }}
@@ -786,30 +79,35 @@
<div class="newsletter-signup">
<!-- Action Network Email Subscription Form -->
<div id="e2c-newsletter-form">
<form class="custom-newsletter-form" action="#" method="post">
<div class="form-group">
<input type="email" name="email" placeholder="Enter your email" required class="email-input">
<button type="submit" class="subscribe-btn">Subscribe</button>
</div>
</form>
<link href='https://actionnetwork.org/css/style-embed-v3.css' rel='stylesheet' type='text/css' />
<script src='https://actionnetwork.org/widgets/v3/form/e2c-website-newsletter-form?format=js&source=widget&clear_id=true'></script>
<div id='can-form-area-e2c-website-newsletter-form' style='width: 100%'></div>
<!-- Fallback for no-JS -->
<noscript>
<form class="custom-newsletter-form" action="https://actionnetwork.org/forms/e2c-website-newsletter-form" method="post">
<div class="form-group">
<input type="email" name="person[email]" placeholder="Enter your email" required class="email-input">
<button type="submit" class="subscribe-btn">Subscribe</button>
</div>
</form>
</noscript>
</div>
<!-- Replace the above form with actual Action Network embed code -->
<!--
<link href='https://actionnetwork.org/css/style-embed-v3.css' rel='stylesheet' type='text/css' />
<script src='https://actionnetwork.org/widgets/v3/form/YOUR_FORM_ID?format=js&source=widget&clear_id=true'></script>
<div id='can-form-area-YOUR_FORM_ID' style='width: 100%'></div>
-->
</div>
</div>
<div class="footer-section">
<div class="footer-links">
<p>&copy; {{ now.Year }} <a href="/contact">E2C Collective</a><br />
<p>&copy; {{ now.Year }} E2C Collective<br />
<a href="https://opencollective.com/e2c-c">Learn more and support us &#128151;</a><br />
In collaboration with <a href="https://www.colorado.edu/lab/medlab/exit-to-community">MEDLab at CU Boulder</a><br />
This work is licensed under a Creative Commons Attribution 4.0 License</p>
<p><a href="/contact">Connect with us</a></p>
</div>
</div>
</div>
</div>
</footer>
<script src="/js/mobile-menu.js"></script>
</body>
</html>
+548 -42
View File
@@ -9,14 +9,37 @@
{{ if .Pages }}
<div class="filter-controls">
<div class="filter-row">
<input type="text" id="searchInput" placeholder="Search titles and descriptions..." class="search-input">
<select id="tagFilter" class="tag-filter">
<option value="">All tags</option>
</select>
<select id="sortBy" class="sort-select">
<option value="title">Sort by Title</option>
<option value="date">Sort by Date</option>
</select>
<input type="text" id="searchInput" placeholder="Search full text..." class="search-input">
<div class="tag-filter-container">
<div id="tagDropdown" class="tag-dropdown">
<div class="tag-dropdown-trigger">
<span class="dropdown-label">Select tags</span>
<div class="selected-tags" id="selectedTags"></div>
<svg class="dropdown-arrow" width="12" height="8" viewBox="0 0 12 8" fill="none">
<path d="M1 1.5L6 6.5L11 1.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<div class="tag-dropdown-menu" id="tagDropdownMenu">
<div class="tag-options" id="tagOptions">
<!-- Tags will be populated here -->
</div>
</div>
</div>
</div>
<div class="sort-container">
<div id="sortDropdown" class="sort-dropdown">
<div class="sort-dropdown-trigger">
<span class="sort-label">Sort by Title</span>
<svg class="dropdown-arrow" width="12" height="8" viewBox="0 0 12 8" fill="none">
<path d="M1 1.5L6 6.5L11 1.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<div class="sort-dropdown-menu" id="sortDropdownMenu">
<div class="sort-option" data-value="title">Sort by Title</div>
<div class="sort-option" data-value="date">Sort by Date</div>
</div>
</div>
</div>
</div>
</div>
<div class="grid" id="cardGrid">
@@ -24,12 +47,24 @@
<div class="card"
data-title="{{ .Title }}"
data-description="{{ if .Description }}{{ .Description }}{{ else if .Summary }}{{ .Summary | plainify | replaceRE "^### \\*\\*Summary\\*\\*\\s*" "" | truncate 200 }}{{ else }}{{ .Content | plainify | replaceRE "^### \\*\\*Summary\\*\\*\\s*" "" | truncate 200 }}{{ end }}"
data-content="{{ .Content | plainify | replaceRE "^### \\*\\*Summary\\*\\*\\s*" "" }}"
data-tags="{{ if .Params.tags }}{{ delimit .Params.tags "," }}{{ end }}"
data-date="{{ .Date.Format "2006-01-02" }}">
{{ if .Params.image }}
<img src="{{ .Params.image }}" alt="{{ .Title }} logo" class="case-logo" />
{{ if .Params.banner }}
<a href="{{ .RelPermalink }}" class="card-banner-link">
<div class="card-banner">
<img src="{{ .Params.banner }}" alt="{{ .Title }} banner" class="case-banner" />
{{ if .Params.image }}
<img src="{{ .Params.image }}" alt="{{ .Title }} logo" class="case-logo-overlay" />
{{ end }}
</div>
</a>
{{ else if .Params.image }}
<a href="{{ .RelPermalink }}" class="card-logo-link">
<img src="{{ .Params.image }}" alt="{{ .Title }} logo" class="case-logo" />
</a>
{{ end }}
<h3><a href="{{ .RelPermalink }}">{{ .Title }}</a></h3>
<h3><a href="{{ .RelPermalink }}" class="card-title-link">{{ .Title }}</a></h3>
{{ if .Description }}
<p>{{ .Description }}</p>
{{ else if .Summary }}
@@ -40,11 +75,10 @@
{{ if .Params.tags }}
<div class="tags">
{{ range .Params.tags }}
<span class="tag">{{ . }}</span>
<a href="?tag={{ . | urlize }}" class="tag">{{ . }}</a>
{{ end }}
</div>
{{ end }}
<a href="{{ .RelPermalink }}" class="btn">Read More</a>
</div>
{{ end }}
</div>
@@ -73,9 +107,9 @@
align-items: center;
}
.search-input, .tag-filter, .sort-select {
.search-input {
font-family: 'Space Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
font-weight: 500;
font-weight: 400;
font-size: 14px;
padding: 10px 16px;
border: 1px solid var(--border);
@@ -84,14 +118,11 @@
backdrop-filter: blur(8px);
transition: all 0.2s ease;
color: var(--text-primary);
}
.search-input {
flex: 1;
min-width: 280px;
}
.search-input:focus, .tag-filter:focus, .sort-select:focus {
.search-input:focus {
outline: none;
border-color: var(--e2c-yellow);
background: var(--e2c-yellow);
@@ -100,18 +131,258 @@
}
.search-input::placeholder {
color: var(--text-secondary);
color: var(--text-primary);
font-weight: 400;
}
.tag-filter, .sort-select {
/* Custom Multi-Select Dropdown */
.tag-filter-container {
position: relative;
min-width: 200px;
}
.tag-dropdown {
position: relative;
font-family: 'Space Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
}
.tag-dropdown-trigger {
display: flex;
align-items: center;
padding: 10px 16px;
border: 1px solid var(--border);
border-radius: 24px;
background: rgba(255, 255, 255, 0.9);
backdrop-filter: blur(8px);
cursor: pointer;
transition: all 0.2s ease;
color: var(--text-primary);
font-size: 14px;
font-weight: 400;
min-height: 20px;
}
.tag-dropdown-trigger:hover, .tag-dropdown.open .tag-dropdown-trigger {
border-color: var(--e2c-yellow);
background: var(--e2c-yellow);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.dropdown-label {
flex: 1;
color: var(--text-primary);
font-weight: 400;
white-space: nowrap;
}
.tag-dropdown.has-selection .dropdown-label {
display: none;
}
.selected-tags {
display: flex;
flex-wrap: wrap;
gap: 4px;
flex: 1;
min-height: 20px;
}
.selected-tag {
background: var(--text-primary);
color: white;
padding: 2px 8px;
border-radius: 12px;
font-size: 12px;
font-weight: 500;
display: flex;
align-items: center;
gap: 4px;
}
.selected-tag .remove {
cursor: pointer;
font-weight: bold;
font-size: 14px;
line-height: 1;
opacity: 0.8;
}
.selected-tag .remove:hover {
opacity: 1;
}
.dropdown-arrow {
margin-left: 8px;
transition: transform 0.2s ease;
flex-shrink: 0;
}
.tag-dropdown.open .dropdown-arrow {
transform: rotate(180deg);
}
.tag-dropdown-menu {
position: absolute;
top: 100%;
left: 0;
right: 0;
background: var(--card-background);
border: 1px solid var(--border);
border-radius: 12px;
box-shadow: 0 8px 24px var(--shadow);
z-index: 1000;
max-height: 200px;
overflow-y: auto;
opacity: 0;
visibility: hidden;
transform: translateY(-4px);
transition: all 0.2s ease;
margin-top: 4px;
}
.tag-dropdown.open .tag-dropdown-menu {
opacity: 1;
visibility: visible;
transform: translateY(0);
}
.tag-option {
display: flex;
align-items: center;
padding: 8px 12px;
cursor: pointer;
font-size: 14px;
color: var(--text-primary);
transition: background-color 0.15s ease;
}
.tag-option:hover {
background: rgba(244, 208, 63, 0.1);
}
.tag-option input[type="checkbox"] {
margin-right: 8px;
accent-color: var(--e2c-yellow);
}
.tag-option.selected {
background: rgba(244, 208, 63, 0.15);
font-weight: 500;
}
/* Custom Sort Dropdown */
.sort-container {
position: relative;
min-width: 160px;
}
.sort-dropdown {
position: relative;
font-family: 'Space Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
}
.sort-dropdown-trigger {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px 16px;
border: 1px solid var(--border);
border-radius: 24px;
background: rgba(255, 255, 255, 0.9);
backdrop-filter: blur(8px);
cursor: pointer;
transition: all 0.2s ease;
color: var(--text-primary);
font-size: 14px;
font-weight: 400;
min-height: 20px;
}
.sort-dropdown-trigger:hover, .sort-dropdown.open .sort-dropdown-trigger {
border-color: var(--e2c-yellow);
background: var(--e2c-yellow);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.sort-label {
flex: 1;
white-space: nowrap;
}
.sort-dropdown.open .dropdown-arrow {
transform: rotate(180deg);
}
.sort-dropdown-menu {
position: absolute;
top: 100%;
left: 0;
right: 0;
background: var(--card-background);
border: 1px solid var(--border);
border-radius: 12px;
box-shadow: 0 8px 24px var(--shadow);
z-index: 1000;
opacity: 0;
visibility: hidden;
transform: translateY(-4px);
transition: all 0.2s ease;
margin-top: 4px;
}
.sort-dropdown.open .sort-dropdown-menu {
opacity: 1;
visibility: visible;
transform: translateY(0);
}
.sort-option {
padding: 8px 12px;
cursor: pointer;
font-size: 14px;
color: var(--text-primary);
transition: background-color 0.15s ease;
}
.sort-option:hover {
background: rgba(244, 208, 63, 0.1);
}
.sort-option.selected {
background: rgba(244, 208, 63, 0.15);
font-weight: 500;
}
.tags {
margin-top: 0.5rem;
}
.card-external-link {
margin: 0.75rem 0;
}
.btn-small {
display: inline-block;
padding: 8px 16px;
background: var(--e2c-yellow);
color: var(--text-primary);
text-decoration: none;
border-radius: 8px;
font-size: 0.875rem;
font-weight: 500;
transition: all 0.2s ease;
border: 2px solid var(--e2c-yellow);
}
.btn-small:hover {
background: var(--e2c-dark-yellow);
border-color: var(--e2c-dark-yellow);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.tag {
display: inline-block;
background: #e9ecef;
@@ -120,6 +391,36 @@
margin: 0.25rem 0.25rem 0 0;
border-radius: 0.25rem;
font-size: 0.875rem;
text-decoration: none;
transition: all 0.2s ease;
}
.tag:hover {
background: var(--e2c-yellow);
color: var(--text-primary);
transform: translateY(-1px);
}
.card-title-link {
display: inline-block;
padding: 8px 16px;
background: var(--e2c-yellow);
color: var(--text-primary) !important;
text-decoration: none !important;
border-radius: 12px;
margin: 8px 0;
font-weight: 600;
font-size: 1.25rem;
transition: all 0.2s ease;
border: 2px solid var(--e2c-yellow);
}
.card-title-link:hover {
background: var(--e2c-dark-yellow);
border-color: var(--e2c-dark-yellow);
color: var(--text-primary) !important;
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.card {
@@ -130,6 +431,40 @@
display: none;
}
.card-banner {
position: relative;
margin-bottom: 1rem;
border-radius: 12px;
overflow: hidden;
aspect-ratio: 16/9;
}
.case-banner {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.card-banner-link, .card-logo-link {
display: block;
text-decoration: none;
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.card-banner-link:hover, .card-logo-link:hover {
transform: translateY(-2px);
}
.card-banner-link:hover .card-banner {
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.15);
}
.card-logo-link:hover .case-logo {
transform: scale(1.05);
}
@media (max-width: 768px) {
.filter-controls {
margin-bottom: 32px;
@@ -142,24 +477,66 @@
gap: 12px;
}
.search-input, .tag-filter, .sort-select {
.search-input {
width: 100%;
min-width: unset;
padding: 8px 14px;
font-size: 12px;
}
.tag-filter-container, .sort-container {
min-width: unset;
width: 100%;
}
.sort-dropdown-trigger {
padding: 8px 14px;
font-size: 12px;
}
.tag-dropdown-trigger {
padding: 8px 14px;
font-size: 12px;
}
.selected-tag {
font-size: 11px;
padding: 1px 6px;
}
.tag-dropdown-menu {
left: -4px;
right: -4px;
}
}
</style>
<script>
document.addEventListener('DOMContentLoaded', function() {
const searchInput = document.getElementById('searchInput');
const tagFilter = document.getElementById('tagFilter');
const sortBy = document.getElementById('sortBy');
const tagDropdown = document.getElementById('tagDropdown');
const tagDropdownTrigger = tagDropdown.querySelector('.tag-dropdown-trigger');
const tagDropdownMenu = document.getElementById('tagDropdownMenu');
const tagOptions = document.getElementById('tagOptions');
const selectedTagsContainer = document.getElementById('selectedTags');
const sortDropdown = document.getElementById('sortDropdown');
const sortDropdownTrigger = sortDropdown.querySelector('.sort-dropdown-trigger');
const sortDropdownMenu = document.getElementById('sortDropdownMenu');
const sortLabel = sortDropdown.querySelector('.sort-label');
const cardGrid = document.getElementById('cardGrid');
const cards = Array.from(cardGrid.querySelectorAll('.card'));
// Collect all unique tags
let selectedTags = new Set();
let currentSort = 'title';
// Check for URL parameter to pre-filter by tag
const urlParams = new URLSearchParams(window.location.search);
const preSelectedTag = urlParams.get('tag');
if (preSelectedTag) {
selectedTags.add(preSelectedTag);
}
// Collect all unique tags (normalize case for consistency)
const allTags = new Set();
cards.forEach(card => {
const tags = card.dataset.tags;
@@ -168,35 +545,159 @@ document.addEventListener('DOMContentLoaded', function() {
}
});
// Populate tag filter dropdown
Array.from(allTags).sort().forEach(tag => {
const option = document.createElement('option');
option.value = tag;
option.textContent = tag;
tagFilter.appendChild(option);
// Populate tag dropdown
function populateTagOptions() {
tagOptions.innerHTML = '';
Array.from(allTags).sort().forEach(tag => {
const option = document.createElement('div');
option.className = 'tag-option';
const isSelected = Array.from(selectedTags).some(selected => selected.toLowerCase() === tag.toLowerCase());
option.innerHTML = `
<input type="checkbox" ${isSelected ? 'checked' : ''}>
<span>${tag}</span>
`;
const checkbox = option.querySelector('input');
checkbox.addEventListener('change', function() {
if (checkbox.checked) {
selectedTags.add(tag);
} else {
// Remove tag case-insensitively
const tagToRemove = Array.from(selectedTags).find(selected => selected.toLowerCase() === tag.toLowerCase());
if (tagToRemove) selectedTags.delete(tagToRemove);
}
updateSelectedTagsDisplay();
filterAndSort();
updateURL();
});
tagOptions.appendChild(option);
});
}
// Update selected tags display
function updateSelectedTagsDisplay() {
selectedTagsContainer.innerHTML = '';
if (selectedTags.size > 0) {
tagDropdown.classList.add('has-selection');
selectedTags.forEach(tag => {
const tagElement = document.createElement('div');
tagElement.className = 'selected-tag';
tagElement.innerHTML = `
<span>${tag}</span>
<span class="remove">×</span>
`;
tagElement.querySelector('.remove').addEventListener('click', function(e) {
e.stopPropagation();
selectedTags.delete(tag);
updateSelectedTagsDisplay();
updateTagOptionStates();
filterAndSort();
updateURL();
});
selectedTagsContainer.appendChild(tagElement);
});
} else {
tagDropdown.classList.remove('has-selection');
}
}
// Update checkbox states in dropdown
function updateTagOptionStates() {
const checkboxes = tagOptions.querySelectorAll('input[type="checkbox"]');
checkboxes.forEach((checkbox, index) => {
const tag = Array.from(allTags).sort()[index];
// Case-insensitive check for selected tags
const isSelected = Array.from(selectedTags).some(selected => selected.toLowerCase() === tag.toLowerCase());
checkbox.checked = isSelected;
checkbox.parentElement.classList.toggle('selected', isSelected);
});
}
// Toggle dropdown
tagDropdownTrigger.addEventListener('click', function(e) {
e.stopPropagation();
tagDropdown.classList.toggle('open');
});
// Close dropdown when clicking outside
document.addEventListener('click', function(e) {
if (!tagDropdown.contains(e.target)) {
tagDropdown.classList.remove('open');
}
if (!sortDropdown.contains(e.target)) {
sortDropdown.classList.remove('open');
}
});
// Sort dropdown functionality
sortDropdownTrigger.addEventListener('click', function(e) {
e.stopPropagation();
sortDropdown.classList.toggle('open');
tagDropdown.classList.remove('open'); // Close other dropdown
});
// Sort option selection
sortDropdownMenu.addEventListener('click', function(e) {
if (e.target.classList.contains('sort-option')) {
const value = e.target.dataset.value;
const text = e.target.textContent;
// Update current sort
currentSort = value;
sortLabel.textContent = text;
// Update selected state
sortDropdownMenu.querySelectorAll('.sort-option').forEach(option => {
option.classList.remove('selected');
});
e.target.classList.add('selected');
// Close dropdown and filter
sortDropdown.classList.remove('open');
filterAndSort();
}
});
// Update URL with selected tags
function updateURL() {
const url = new URL(window.location);
if (selectedTags.size > 0) {
url.searchParams.set('tag', Array.from(selectedTags)[0]); // For simplicity, just use first tag in URL
} else {
url.searchParams.delete('tag');
}
window.history.replaceState({}, '', url);
}
function filterAndSort() {
const searchTerm = searchInput.value.toLowerCase();
const selectedTag = tagFilter.value;
const sortCriteria = sortBy.value;
const sortCriteria = currentSort;
// Filter cards
const filteredCards = cards.filter(card => {
const title = card.dataset.title.toLowerCase();
const description = card.dataset.description.toLowerCase();
const content = card.dataset.content.toLowerCase();
const tags = card.dataset.tags;
// Text search
// Full text search - search in title, description, and content
const matchesSearch = !searchTerm ||
title.includes(searchTerm) ||
description.includes(searchTerm);
description.includes(searchTerm) ||
content.includes(searchTerm);
// Tag filter
const matchesTag = !selectedTag ||
(tags && tags.split(',').map(t => t.trim()).includes(selectedTag));
// Tag filter - must match ALL selected tags (case-insensitive)
const matchesTags = selectedTags.size === 0 ||
(tags && Array.from(selectedTags).every(selectedTag =>
tags.split(',').map(t => t.trim().toLowerCase()).includes(selectedTag.toLowerCase())
));
return matchesSearch && matchesTag;
return matchesSearch && matchesTags;
});
// Sort filtered cards
@@ -223,10 +724,15 @@ document.addEventListener('DOMContentLoaded', function() {
// Event listeners
searchInput.addEventListener('input', filterAndSort);
tagFilter.addEventListener('change', filterAndSort);
sortBy.addEventListener('change', filterAndSort);
// Initial sort by title
// Initialize
populateTagOptions();
updateSelectedTagsDisplay();
updateTagOptionStates();
// Initialize sort dropdown
sortDropdownMenu.querySelector('[data-value="title"]').classList.add('selected');
filterAndSort();
});
</script>
+19 -67
View File
@@ -1,7 +1,14 @@
{{ define "main" }}
<article>
<header class="article-header">
{{ if .Params.image }}
{{ if .Params.banner }}
<div class="article-banner">
<img src="{{ .Params.banner }}" alt="{{ .Title }} banner" class="case-detail-banner" />
{{ if .Params.image }}
<img src="{{ .Params.image }}" alt="{{ .Title }} logo" class="case-detail-logo-overlay" />
{{ end }}
</div>
{{ else if .Params.image }}
<img src="{{ .Params.image }}" alt="{{ .Title }} logo" class="case-detail-logo" />
{{ end }}
<h1>{{ .Title }}</h1>
@@ -14,80 +21,25 @@
{{ if .Date }}
<p><small>Last updated: {{ .Date.Format "January 2, 2006" }}</small></p>
{{ end }}
{{ if .Params.tags }}
<div class="tags">
{{ range .Params.tags }}
<span class="tag">{{ . }}</span>
<div class="tags-and-button">
{{ if .Params.external_url }}
<div class="article-external-button"><a href="{{ .Params.external_url }}" target="_blank" class="btn">Visit Website</a></div>
{{ end }}
{{ if .Params.tags }}
<div class="tags">
{{ range .Params.tags }}
<a href="/{{ $.Section }}/?tag={{ . | urlize }}" class="tag">{{ . }}</a>
{{ end }}
</div>
{{ end }}
</div>
{{ end }}
</header>
<div class="article-content">
{{ .Content }}
</div>
{{ if .Params.external_url }}
<p><a href="{{ .Params.external_url }}" target="_blank" class="btn">Visit External Site</a></p>
{{ end }}
</article>
{{ partial "explore-e2c.html" . }}
<style>
.lead {
font-size: 1.125rem;
color: #666;
margin-bottom: 1rem;
}
.article-header {
margin-bottom: 2rem;
padding-bottom: 1rem;
border-bottom: 1px solid #e9ecef;
}
.article-content {
margin-bottom: 2rem;
}
.article-content h2,
.article-content h3,
.article-content h4 {
margin-top: 2rem;
margin-bottom: 1rem;
}
.article-nav {
display: flex;
justify-content: space-between;
margin-top: 2rem;
padding-top: 1rem;
border-top: 1px solid #e9ecef;
}
.article-nav a {
text-decoration: none;
color: #007bff;
padding: 0.5rem 0;
}
.article-nav a:hover {
color: #0056b3;
}
.tags {
margin: 0.5rem 0;
}
.tag {
display: inline-block;
background: #e9ecef;
color: #495057;
padding: 0.25rem 0.5rem;
margin: 0.25rem 0.25rem 0 0;
border-radius: 0.25rem;
font-size: 0.875rem;
}
</style>
{{ end }}
+143
View File
@@ -1,3 +1,146 @@
{{ define "main" }}
{{ .Content }}
{{ partial "explore-e2c.html" . }}
<style>
.featured-cases-section {
margin: 4rem 0;
padding: 3rem 0;
background: rgba(244, 208, 63, 0.05);
border-radius: 24px;
}
.featured-cases-section h2 {
text-align: center;
margin-bottom: 1rem;
color: var(--text-primary);
font-size: 2.5rem;
font-weight: 600;
}
.featured-cases-section p {
text-align: center;
margin-bottom: 2.5rem;
color: var(--text-secondary);
font-size: 1.125rem;
}
.featured-cases-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 2rem;
max-width: 1200px;
margin: 0 auto;
padding: 0 2rem;
}
.featured-case-card {
background: var(--card-background);
border-radius: 16px;
overflow: hidden;
box-shadow: 0 4px 12px var(--shadow);
transition: opacity 0.3s ease, transform 0.3s ease;
position: relative;
border: 1px solid var(--border);
}
.featured-case-card:hover {
transform: translateY(-2px);
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.15);
}
.featured-card-banner {
position: relative;
margin-bottom: 1rem;
border-radius: 12px;
overflow: hidden;
aspect-ratio: 16/9;
}
.featured-case-banner {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.featured-case-logo {
width: 100%;
height: 200px;
object-fit: contain;
display: block;
padding: 1rem;
background: #f8f9fa;
}
.featured-case-content {
padding: 0 1.5rem 1.5rem 1.5rem;
}
.featured-case-title {
display: inline-block;
padding: 8px 16px;
background: var(--e2c-yellow);
color: var(--text-primary);
text-decoration: none;
border-radius: 12px;
margin: 8px 0;
font-weight: 600;
font-size: 1.1rem;
transition: all 0.2s ease;
border: 2px solid var(--e2c-yellow);
}
.featured-case-title:hover {
background: var(--e2c-dark-yellow);
border-color: var(--e2c-dark-yellow);
color: var(--text-primary);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.featured-case-description {
color: var(--text-secondary);
font-size: 0.95rem;
line-height: 1.5;
margin-top: 1rem;
}
.featured-case-link {
display: block;
text-decoration: none;
color: inherit;
}
.featured-banner-link {
display: block;
text-decoration: none;
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.featured-banner-link:hover {
transform: translateY(-2px);
}
@media (max-width: 768px) {
.featured-cases-grid {
grid-template-columns: 1fr;
gap: 1.5rem;
padding: 0 1rem;
}
.featured-cases-section {
margin: 2rem 0;
padding: 2rem 0;
}
.featured-cases-section h2 {
font-size: 2rem;
}
}
</style>
{{ partial "homepage-scripts.html" . }}
{{ end }}
+20
View File
@@ -0,0 +1,20 @@
<div class="main-sections">
<h2>Explore E2C</h2>
<div class="primary-cards">
<div class="primary-card">
<h3>Case Studies</h3>
<p>Real examples of companies that have attempted or achieved community ownership transitions</p>
<a href="/case-studies/" class="btn">Explore Cases</a>
</div>
<div class="primary-card">
<h3>Legal Snippets</h3>
<p>Legal documents and frameworks for implementing community ownership structures</p>
<a href="/legal-snippets/" class="btn">Explore Legal Snippets</a>
</div>
<div class="primary-card">
<h3>Resources</h3>
<p>Educational materials, primers, and guides for Exit to Community transitions</p>
<a href="/resources/" class="btn">Explore Resources</a>
</div>
</div>
</div>
+65
View File
@@ -0,0 +1,65 @@
<script>
document.addEventListener('DOMContentLoaded', function() {
// Case studies data - this will be populated by Hugo
const caseStudies = [
{{ range where .Site.Pages "Section" "case-studies" }}
{{ if and .Params.image .Title (ne .Title "Case Studies") }}
{
title: "{{ .Title | replaceRE `"` `\"` }}",
description: "{{ if .Description }}{{ .Description | replaceRE `"` `\"` }}{{ else }}{{ .Summary | plainify | truncate 150 | replaceRE `"` `\"` }}{{ end }}",
url: "{{ .RelPermalink }}",
image: "{{ .Params.image }}",
banner: {{ if .Params.banner }}"{{ .Params.banner }}"{{ else }}null{{ end }}
},
{{ end }}
{{ end }}
].filter(study => study.title); // Remove any empty entries
// Function to shuffle array and get random selection
function getRandomCases(cases, count = 3) {
const shuffled = [...cases].sort(() => 0.5 - Math.random());
return shuffled.slice(0, count);
}
// Function to create case card HTML
function createCaseCard(caseStudy) {
const hasImage = caseStudy.image && caseStudy.image !== 'null' && caseStudy.image !== null;
const hasBanner = caseStudy.banner && caseStudy.banner !== 'null' && caseStudy.banner !== null;
let imageHTML = '';
if (hasBanner) {
imageHTML = `
<a href="${caseStudy.url}" class="featured-banner-link">
<div class="featured-card-banner">
<img src="${caseStudy.banner}" alt="${caseStudy.title} banner" class="featured-case-banner" />
${hasImage ? `<img src="${caseStudy.image}" alt="${caseStudy.title} logo" class="case-logo-overlay" />` : ''}
</div>
</a>
`;
} else if (hasImage) {
imageHTML = `
<a href="${caseStudy.url}" class="featured-banner-link">
<img src="${caseStudy.image}" alt="${caseStudy.title} logo" class="featured-case-logo" />
</a>
`;
}
return `
<div class="featured-case-card">
${imageHTML}
<div class="featured-case-content">
<h3><a href="${caseStudy.url}" class="featured-case-title">${caseStudy.title}</a></h3>
<p class="featured-case-description">${caseStudy.description}</p>
</div>
</div>
`;
}
// Populate featured cases
const featuredCasesGrid = document.getElementById('featuredCasesGrid');
if (featuredCasesGrid && caseStudies.length > 0) {
const randomCases = getRandomCases(caseStudies, 3);
featuredCasesGrid.innerHTML = randomCases.map(createCaseCard).join('');
}
});
</script>
+6
View File
@@ -0,0 +1,6 @@
{
"name": "e2c-how",
"lockfileVersion": 3,
"requires": true,
"packages": {}
}
+1
View File
@@ -0,0 +1 @@
{}
+1080
View File
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 493 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 966 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 556 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Some files were not shown because too many files have changed in this diff Show More