Compare commits
34 Commits
wompum
...
ee5ca17e67
Author | SHA1 | Date | |
---|---|---|---|
ee5ca17e67 | |||
0494aacf1a | |||
fa2579bc08 | |||
ac88d5e4d0 | |||
49b2070f09 | |||
5456e5ccd8 | |||
8e615fa92b | |||
1b6df5e889 | |||
65d93c6d25 | |||
7c5307ea3f | |||
019dbd27fa | |||
88bebf37f3 | |||
b25fcfed88 | |||
c693480625 | |||
7c64ef3ec3 | |||
a2157b2700 | |||
a7654842d9 | |||
29bcf223a3 | |||
90994d0099 | |||
46c0a96540 | |||
e5466d8de9 | |||
a5cb5e7353 | |||
0138e19dbf | |||
a145ee2e65 | |||
0bde9892b0 | |||
69382c66ba | |||
7725b06ae9 | |||
257a5a7dfc | |||
2ad602faf1 | |||
26c3915dfb | |||
b4f72a1548 | |||
bac1d39481 | |||
e288bc703c | |||
2139901402 |
13
README.md
Normal file
13
README.md
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# Protocol Oral History Project website
|
||||||
|
|
||||||
|
A project of the [Media Economies Design Lab](https://www.colorado.edu/lab/medlab/) at the University of Colorado Boulder, directed by Nathan Schneider. Site design by [Drew Hornbein](https://www.dhornbein.com/).
|
||||||
|
|
||||||
|
Developed in Hugo.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Navigate to the project directory and:
|
||||||
|
|
||||||
|
```
|
||||||
|
hugo server
|
||||||
|
```
|
79
assets/scss/_fonts.scss
Normal file
79
assets/scss/_fonts.scss
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
@font-face {
|
||||||
|
font-family: 'EB Garamond 12';
|
||||||
|
src: local('EB Garamond 12 Italic'), local('EBGaramond12-Italic'),
|
||||||
|
url('/fonts/EBGaramond12-Italic.woff2') format('woff2'),
|
||||||
|
url('/fonts/EBGaramond12-Italic.woff') format('woff');
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: italic;
|
||||||
|
font-display: swap;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'EB Garamond 12';
|
||||||
|
src: local('EB Garamond 12 Regular'), local('EBGaramond12-Regular'),
|
||||||
|
url('/fonts/EBGaramond12-Regular.woff2') format('woff2'),
|
||||||
|
url('/fonts/EBGaramond12-Regular.woff') format('woff');
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
font-display: swap;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Iosevka';
|
||||||
|
src: local('Iosevka'),
|
||||||
|
url('/fonts/Iosevka.woff2') format('woff2'),
|
||||||
|
url('/fonts/Iosevka.woff') format('woff');
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
font-display: swap;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Iosevka';
|
||||||
|
src: local('Iosevka Bold'), local('Iosevka-Bold'),
|
||||||
|
url('/fonts/Iosevka-Bold.woff2') format('woff2'),
|
||||||
|
url('/fonts/Iosevka-Bold.woff') format('woff');
|
||||||
|
font-weight: bold;
|
||||||
|
font-style: normal;
|
||||||
|
font-display: swap;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Iosevka';
|
||||||
|
src: local('Iosevka Bold Italic'), local('Iosevka-Bold-Italic'),
|
||||||
|
url('/fonts/Iosevka-Bold-Italic.woff2') format('woff2'),
|
||||||
|
url('/fonts/Iosevka-Bold-Italic.woff') format('woff');
|
||||||
|
font-weight: bold;
|
||||||
|
font-style: italic;
|
||||||
|
font-display: swap;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Iosevka';
|
||||||
|
src: local('Iosevka Light'), local('Iosevka-Light'),
|
||||||
|
url('/fonts/Iosevka-Light.woff2') format('woff2'),
|
||||||
|
url('/fonts/Iosevka-Light.woff') format('woff');
|
||||||
|
font-weight: 300;
|
||||||
|
font-style: normal;
|
||||||
|
font-display: swap;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Iosevka';
|
||||||
|
src: local('Iosevka Light Italic'), local('Iosevka-Light-Italic'),
|
||||||
|
url('/fonts/Iosevka-Light-Italic.woff2') format('woff2'),
|
||||||
|
url('/fonts/Iosevka-Light-Italic.woff') format('woff');
|
||||||
|
font-weight: 300;
|
||||||
|
font-style: italic;
|
||||||
|
font-display: swap;
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Iosevka';
|
||||||
|
src: local('Iosevka Oblique'), local('Iosevka-Oblique'),
|
||||||
|
url('/fonts/Iosevka-Oblique.woff2') format('woff2'),
|
||||||
|
url('/fonts/Iosevka-Oblique.woff') format('woff');
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: italic;
|
||||||
|
font-display: swap;
|
||||||
|
}
|
2
assets/scss/_variables.scss
Normal file
2
assets/scss/_variables.scss
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
$font-garamond: 'EB Garamond 12', 'Garamond', 'Baskerville', 'Baskerville Old Face', 'Hoefler Text', 'Times New Roman', serif;
|
||||||
|
$font-iosevka: 'Iosevka', Consolas, 'Liberation Mono', Menlo, monospace;
|
70
assets/scss/components/_wompum.scss
Normal file
70
assets/scss/components/_wompum.scss
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
.wompum {
|
||||||
|
&-container {
|
||||||
|
width: 100%;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
&-grid,
|
||||||
|
&-article-grid {
|
||||||
|
display: grid;
|
||||||
|
gap: 0;
|
||||||
|
padding: 0;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
// General grid styles
|
||||||
|
&-grid {
|
||||||
|
gap: 2px; // Tighter spacing for general grids
|
||||||
|
|
||||||
|
&[data-rows="1"] {
|
||||||
|
.wompum-cell {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Article grid styles
|
||||||
|
&-article-grid {
|
||||||
|
gap: 3px; // Wider spacing for article grids
|
||||||
|
|
||||||
|
.single-default &,
|
||||||
|
.single-article & {
|
||||||
|
gap: 1rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&-cell {
|
||||||
|
width: 100%;
|
||||||
|
transition: background-color 0.3s ease;
|
||||||
|
|
||||||
|
// Default background for uninitialized cells
|
||||||
|
background-color: var(--sand-500);
|
||||||
|
|
||||||
|
// Different styling for cells in article grids
|
||||||
|
.wompum-article-grid & {
|
||||||
|
&[data-section="narrator"] {
|
||||||
|
min-height: 35px;
|
||||||
|
}
|
||||||
|
&[data-section="subject"] {
|
||||||
|
min-height: 40px;
|
||||||
|
}
|
||||||
|
&[data-section="facilitator"] {
|
||||||
|
min-height: 35px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fallback patterns using prime numbers
|
||||||
|
// (these will be overridden by JS-generated colors when initialized)
|
||||||
|
&:nth-child(7n+1) {
|
||||||
|
background-color: var(--sand-100);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:nth-child(5n+2) {
|
||||||
|
background-color: var(--sand-900);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:nth-child(11n+3) {
|
||||||
|
background-color: var(--sand-500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
60
assets/scss/main.scss
Normal file
60
assets/scss/main.scss
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
// Tailwind
|
||||||
|
@tailwind base;
|
||||||
|
@tailwind components;
|
||||||
|
@tailwind utilities;
|
||||||
|
|
||||||
|
// Variables
|
||||||
|
@import "variables";
|
||||||
|
|
||||||
|
// Fonts
|
||||||
|
@import "fonts";
|
||||||
|
|
||||||
|
// Components
|
||||||
|
@import "components/wompum";
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: $font-garamond;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wompum-radial-grid {
|
||||||
|
@apply absolute w-full h-full top-0 left-0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.narrator-image-container {
|
||||||
|
@apply relative;
|
||||||
|
|
||||||
|
.wompum-radial-grid {
|
||||||
|
@apply absolute inset-0 w-full h-full;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.narrator-headshot {
|
||||||
|
@apply w-full rounded-full object-cover relative z-10 border-2 border-white;
|
||||||
|
aspect-ratio: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.interviewer-question {
|
||||||
|
font-style: italic;
|
||||||
|
color: #444;
|
||||||
|
margin-left: -1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Narrator Image Component
|
||||||
|
.narrator {
|
||||||
|
&__container {
|
||||||
|
@apply relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__frame {
|
||||||
|
@apply relative p-4;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__image {
|
||||||
|
@apply w-full rounded-full object-cover relative z-10 bg-white text-center border-4 border-white grid place-items-center;
|
||||||
|
aspect-ratio: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
&__wompum {
|
||||||
|
@apply absolute inset-0 w-full h-full;
|
||||||
|
}
|
||||||
|
}
|
15
config.toml
15
config.toml
@ -5,3 +5,18 @@ theme = "hugo-starter-tailwind-basic"
|
|||||||
|
|
||||||
[taxonomies]
|
[taxonomies]
|
||||||
tag = "tags"
|
tag = "tags"
|
||||||
|
narrator = "narrator"
|
||||||
|
facilitator = "facilitator"
|
||||||
|
|
||||||
|
[minify]
|
||||||
|
minifyOutput = true
|
||||||
|
|
||||||
|
[params]
|
||||||
|
description = "The Protocol Oral History Project chronicles the development of internet protocols and standards through interviews with key contributors."
|
||||||
|
images = ["/images/default-og.jpg"] # Will be replaced by wompum generation
|
||||||
|
twitterSite = ""
|
||||||
|
facebookAppID = ""
|
||||||
|
|
||||||
|
[params.author]
|
||||||
|
name = "Media Economies Design Lab"
|
||||||
|
twitter = ""
|
@ -1,3 +1,10 @@
|
|||||||
|
---
|
||||||
|
title: "About"
|
||||||
|
include_partials: ["facilitator-list.html","wompum-demo.html"]
|
||||||
|
---
|
||||||
|
|
||||||
The Protocol Oral History Project is an effort to honor and share the stories of protocol artists—the skilled builders and stewards of the rules, standards, and norms that shape our lives in often invisible ways, ranging from technical standards and diplomatic practices to Indigenous traditions and radical subcultures.
|
The Protocol Oral History Project is an effort to honor and share the stories of protocol artists—the skilled builders and stewards of the rules, standards, and norms that shape our lives in often invisible ways, ranging from technical standards and diplomatic practices to Indigenous traditions and radical subcultures.
|
||||||
|
|
||||||
The project is led by Nathan Schneider, director of the [Media Economies Design Lab](https://www.colorado.edu/lab/medlab/) at the University of Colorado Boulder.
|
The color scheme is inspired by _[Constitutional Wampum](http://n2t.net/ark:/65665/ws63912f5dd-e703-4759-8c31-33ac98b3c190)_ by Robert Houle.
|
||||||
|
|
||||||
|
The project is led by Nathan Schneider, director of the [Media Economies Design Lab](https://www.colorado.edu/lab/medlab/) at the University of Colorado Boulder. Website designed by [Drew Hornbein](https://www.dhornbein.com/). The project is made possible by support from the Siegel Family Endowment.
|
||||||
|
212
content/articles/dorsey-the_gut.md
Normal file
212
content/articles/dorsey-the_gut.md
Normal file
@ -0,0 +1,212 @@
|
|||||||
|
---
|
||||||
|
narrator: Asia Dorsey
|
||||||
|
subject: The gut
|
||||||
|
facilitator: Nathan Schneider
|
||||||
|
date: 2025-03-18
|
||||||
|
approved: 2025-03-20
|
||||||
|
summary: "Drawing on many ancestral traditions and the experience of her own body, Asia Dorsey learns and teaches the pattern language of a healthy gut."
|
||||||
|
location: "Denver CO"
|
||||||
|
tags: [ancestors, food, health, indigeneity]
|
||||||
|
headshot: "/headshots/placeholder-headshot.png"
|
||||||
|
links:
|
||||||
|
- text: "Bugs Bones & Botany"
|
||||||
|
url: "https://www.bonesbugsandbotany.com"
|
||||||
|
- text: "Red Palm Oil: A Ghanaian Tradition"
|
||||||
|
url: "https://www.youtube.com/watch?v=sAgXY2WWPAk"
|
||||||
|
- text: "Patreon"
|
||||||
|
url: "https://www.patreon.com/bonesbugsandbotany"
|
||||||
|
---
|
||||||
|
|
||||||
|
*How do you begin telling people about who you are and what you do?*
|
||||||
|
|
||||||
|
I am a bioregional root worker raised on the lands of the Cheyenne, Ute, and Arapaho peoples. I was cultivated by a powerful, powerful group of Black women in the Five Points community, who taught me about cooperation, collaboration, and how to dream my way out of trouble. I am showing up here with my herbalist hat on, but one of the conversations that we are deeply steeped in at all times is one of sovereignty, embodied liberation, and also the forms of serenity that come from collective organizing, especially around the things that we apply our work to. So it's very good to be here with you.
|
||||||
|
|
||||||
|
*How would you outline your life? You started with your cultivation. Where did you go from there? What has your path been like?*
|
||||||
|
|
||||||
|
Starting off with my cultivation is so important because I am one of the people in this world who carries around a covenant of love privilege. That love privilege got me to a super prestigious university where I experienced existential depression after confronting what the world was really like.
|
||||||
|
|
||||||
|
I thought I wanted to be an attorney, and I thought that I would argue justice in front of the Supreme Court. I wanted to be Erin Brockovich. Ever since I saw *Erin Brockovich*, I was like, "Yeah, that's me." I made it all the way to university and discovered that the law was not true, that the law was based on who had power, and that broke my spirit. What my broken spirit looked like was not being in my body and not being able to feel any emotions. Anyone reading this—some of you know what this is like. Some of you are experiencing this right now.
|
||||||
|
|
||||||
|
There was only one thing that brought me joy. I would be watching Netflix, and then this Vandana Shiva woman would show up. She had this big beautiful bindi, and she was always saying clever little quippy things, and I was like, *who is this woman?* And I thought, *I am still alive*. So I watched everything that Vandana Shiva was in, and it got me into this world of food. I later visited her in India at Navdanya where I interned for several months.
|
||||||
|
|
||||||
|
I discovered that my university, NYU, we had one of the two food studies departments in the nation. I thought, *I'm just gonna take this little class because this is the only thing that makes me feel alive*. Everything else was just gray. But when it came to food, it was so colorful, so vibrant. So I decided to follow my joy, and I took 22 credit hours. And it was everything. It was everything.
|
||||||
|
|
||||||
|
I loved everyone. If they're a foodie, they're my people. Period. I don't care about race or class. I don't come for a foodie. Y'all be hating on *Portlandia*—I love *Portlandia*. Anyone who cares about animals and the earth, they were my people.
|
||||||
|
|
||||||
|
I ended up reading a book called *The Omnivore's Dilemma* by Michael Pollan, and I discovered Joel Salatin's Polyface Farm. When I was researching, I was alive because it was food. Then I realized Joel Salatin does this thing called permaculture, and I was like, *What is that?* So I ended up traveling to Australia to study with Geoff Lawton and apprenticing in permaculture. From there, I traveled around the world to understand food and agriculture, specifically with this lens of honoring the Indigenous.
|
||||||
|
|
||||||
|
I felt like I was able to learn so much more than my peers because I had this permaculture training. For example, in Ghana, I was so furious in a global nutrition class. The professor was like, "Vitamin A is of nutritional significance." And then the next phrase—she goes, "We Ghanaians are so backwards. We're eating all this palm oil." And I'm like, palm oil is the highest food source of vitamin A! So how are you backwards? I was so upset that I made a whole documentary on red palm oil, reclaiming the power of the palm. That professor ended up changing her tune because I was so furious.
|
||||||
|
|
||||||
|
After that, I traveled to New Zealand and worked with a woman named Kay Baxter, who owns the Koanga Institute, where I learned about what it looks like to build regenerative community and to grow food like your life depends on it. She taught me the principles of healing my gut. Kay was like, "Look, the gut and the brain are connected. You could heal your mind through healing your gut." I took it on, and I ended up resolving that depression using meat stock and fermented food. That really empowered me—I didn't know that was possible.
|
||||||
|
|
||||||
|
After studying with Kay and healing my depression, I graduated from university with that degree in food studies. I returned home and started a fermented food company called the Five Points Fermentation Company. It was cooperatively organized because I felt it had to heal at all levels. I wanted it to heal the earth. We only had cabbage from a regenerative grower named Michael Kilt, and he would apply compost teas, and we'd measure the brix of the cabbage.
|
||||||
|
|
||||||
|
I lived my best life, honestly, running that company because people were getting healed. I don't know if I'm legally allowed to say it or whatever, but all I know is, people were not well, and then they were well from the food that I was making—local sauerkraut that was fermented by whole communities.
|
||||||
|
|
||||||
|
After that, I realized I didn't understand how much capital I needed to run a manufacturing firm. We were fermenting like 55,000 pounds of sauerkraut and distributing it to grocery stores, restaurants and direct to consumers. It was wild that I did all that with no money—what I used was my own energy, and I burnt out so bad. I had no idea how much I hurt myself to bring probiotics to the people. But they needed the probiotics. They needed the traditional food.
|
||||||
|
|
||||||
|
All of my recipes were traditional. If we made kimchi, Mama CJ, a Korean woman, was in the kitchen with us. If we made cortido, a Salvadoran was there. Our curry kraut was developed by a Jain Indian chef named Milan Doshi, who ended up selling me the Five Points Fermentation Company to get my start. Shout out to the Brown Alliance!
|
||||||
|
|
||||||
|
After that, I learned a lot about organizing co-ops and businesses. I was on the board of the Center for Community Wealth Building, led by Yessica Holgin. The queen! We were building infrastructure for co-ops throughout Colorado. I started to cultivate a new co-op with the learnings from the last one—the Satya Yoga Co-op, which is the nation's first BIPOC-owned and operated yoga co-op, using this theme of healing our bodies in order to heal our minds.
|
||||||
|
|
||||||
|
This co-op was so much more successful than my first one. During that time, I helped organize other co-ops and did more economic justice work, always centering food. If it had to do with food then it was for me. I worked with Beverly Grant at Mo' Better Green and whoever I could work with in the food systems. That's all I wanted to do with my life.
|
||||||
|
|
||||||
|
Then Adam Brock, who founded the GrowHaus in Elyria-Swansea—we had been working together teaching permaculture and social permaculture—invited me to a consulting firm called Regenerate Change. I became a co-owner of that firm. We were able to consult with food businesses across the nation, helping with strategy and conflict resolution. My life was perfect. I used the resources from that to build a new business, Bones, Bugs, and Botany, where I teach embodied liberation through food and herbal medicine education. That's where I am now—a byproduct of all these beautiful collaborations, but very much following the trail of the earth. That's how I got here.
|
||||||
|
|
||||||
|
*I'd love to contrast that trail of the earth with law. You talked about law earlier as not being what you thought it was. If not law, what other orders did you turn to? What other ways of seeing the world, the gut, and everything in between seemed more real to you?*
|
||||||
|
|
||||||
|
When I was a young warthog in the streets of New York City, I was engaged in anti-stop-and-frisk activism. I was trained as a Kingian nonviolence facilitator, and I was organizing around prison justice. I read a book by Michelle Alexander called *The New Jim Crow*, and that's what killed it—that was the book that made me feel like I'd wasted all my life pursuing a legal education when the law is not actually just.
|
||||||
|
|
||||||
|
Understanding the law as it applies to policing, as it applies to Black bodies, as it applies to the extension of slavery—these things help us understand that whoever is governing, whoever the ruler is, they set the rules. But what I love about the earth and about food is that the goddess doesn't operate on laws. There are no laws of nature, but there are patterns.
|
||||||
|
|
||||||
|
There are patterns of nature, honey. And what I love about the patterns is that there are binaries in the natural world, and at the same time there is also chaos—the possibility for a multiplicity of outcomes. By studying not the law, but the pattern language of nature, I've been able to discern right from wrong, what is true, and I've been able to locate myself outside of a hierarchy in relationship to the more-than-humans, which include the bones and the plants and the microbes. I know now where I belong, and I use those principles or patterns of nature to help organize giant food-based organizations, but also to help people reorganize their bodies.
|
||||||
|
|
||||||
|
Thank goodness that I developed this perspective. The whole "law of nature" thing was just created to justify a legal regime of robbery.
|
||||||
|
|
||||||
|
*What changes when you shift your frame from the laws of nature to the patterns of nature? What consequences come from that?*
|
||||||
|
|
||||||
|
Laws are rigid and enforced by policing. Patterns are flexible. They resist commodification. They exist at many levels in different languages. Patterns are true.
|
||||||
|
|
||||||
|
There's so much more love. What I love about a pattern is that there is a binary, but there's also chaos that makes everything work. We have genes, a gene sequence, and the way that sequence gets all mixed up when we're trying to have a baby—the chaos of that is what creates the beauty. Patterns give us access to a way of being that honors duality and honors non-duality at the same time.
|
||||||
|
|
||||||
|
It allows us to connect outside of petty identity politics because we are able to connect with the broadness and beauty of the goddess, and to see that there are these principles that are self-replicating and patterns that are repeating. It's such a beautiful thing to be a part of these patterns, not because some law told us to.
|
||||||
|
|
||||||
|
I think about race and racial mixing and the maroon colonies. There's a really beautiful Indigenous woman named Tiffany Lovato. She's of Pueblo descent, and she told me that when Africans were being enslaved, the ancestors on the East Coast—their shamans, their wisdom keepers—saw that in dreams. They had made preparations and a covenant. What was supposed to happen was that those Indigenous tribes were going to consume or make kin with the newly arrived Africans. A lot of that kin-making actually happened because that is the pattern of all Indigenous people. This is how we keep our genetic diversity. This is what we do.
|
||||||
|
|
||||||
|
But it was laws created by men—laws of segregation—that halted those processes. The maroon colonies were European, Native American, and African. What was really beautiful when we study maroonage and what was happening in early America is you saw this class allegiance that went beyond racial or ethnic characteristics to create these futuristic societies. Those societies mix the blood—that is the pattern of nature.
|
||||||
|
|
||||||
|
But these laws kept that from happening, especially implementing the one-drop rule with African Americans and blood quantums with First Nations people. It worked to shrink their identity and expand ours, expand the pool of who could be extracted. And we see the impact of those laws today. The laws were put in place to stop the natural order from happening.
|
||||||
|
|
||||||
|
*How did you begin to get to know the patterns of the gut?*
|
||||||
|
|
||||||
|
When I was sick and depressed in New York City, I didn't understand—I was raised by all of those wonderful women in the Five Points, and they made all my food. They relieved me from reproductive labor of all kinds. I was one of the only kids that didn't have chores. My family was really invested in me getting a college education, so they said, "No, your job is to study."
|
||||||
|
|
||||||
|
Like many male-bodied folks, I experienced a lot of investment, and one of those forms was not learning to cook or clean or any of those things. So when I went to college without my family, I didn't know how to eat—my mom still makes my plate! I had no idea about the impact of polyunsaturated fatty acids or what caused inflammation. I was balling out. I said, "I get to choose what I eat. I'm going to have a waffle with mint chocolate ice cream." And I wondered, why was I like that? I didn't understand that there was a link between what I ate and how I felt.
|
||||||
|
|
||||||
|
Studying with Dr. Natasha Campbell-McBride, she amplified the teachings that Kay introduced me to, which was understanding that there is a pattern, an organization of the body. Later, when I started studying traditional Chinese medicine, I deepened that understanding of pattern and how the different organ systems work together and reflect the outer world.
|
||||||
|
|
||||||
|
I learned the pattern of healing. I was so unwell that if there was sugar in the salad dressing, I could hear the sugar. If there was wheat, I could hear the sound of wheat. It helped me see what foods really resonated with me because wheat was like this high-pitched frequency sound, but corn was like a low rumble. I developed synesthesia from restricting certain foods and eating the traditional kinds of foods that I grew up with.
|
||||||
|
|
||||||
|
I grew up eating liver and onions every week. I grew up eating collard greens, these really beautiful broth-rich stews. It turns out that all of those were protecting my gut. I had no idea how valuable traditional soul food was because it's so demonized—people say it's high fat, blah, blah, blah. No, that is the most nourishing food that exists on the planet. It's ingenious.
|
||||||
|
|
||||||
|
I learned the pattern language of gut healing by testing it out, by seeing what different foods made me feel like, and understanding the larger pattern of what it takes to heal the gut. A lot of the information we learn about what's good to feed the gut—fiber and polyphenols—that's for a healthy body, if your gut is already well. Digesting fiber is not easy. We're not cows. We don't have a four-chambered stomach or a rumen. We're not ruminating and regurgitating—plants are not easy to eat. Our ancestors have developed so many techniques to deactivate the anti-nutrients in plants.
|
||||||
|
|
||||||
|
So if you're not well, eating plants that haven't been processed in ancestral and traditional ways is going to hurt you even more. The foods we find not only in African American cuisines but cuisines around the world follow the same pattern language. Your ramen is using some of the same principles as my collard greens. We're using the bones and the meaty bones of animals to heal the meaty parts of ourselves.
|
||||||
|
|
||||||
|
The way that I know it's true is that I try it in my own body, but then I look at all the cultures who are practicing the same pattern. If I see African Americans do it, and then I see Native Americans do it, and then I see Europeans do it, then I see Japanese people do it—I think, okay, there's something true here, because humans are an expression of the earth and an expression of that wisdom and organizing intelligence. If our ancestors are organizing in the exact same way, I'm going to listen to the ancestors because that wisdom that comes from generations of trial and error is so much more powerful than a lab test with rats. The best science is what we've been able to see in human populations over generations. They'll give me a two-week rat trial and tell me not to have collard greens? No, incorrect. I'm not listening.
|
||||||
|
|
||||||
|
No shade—I sometimes do listen, but I only listen to those studies and trials when they are affirming the pattern languages that we see coming out of our ancestral cultures and traditions.
|
||||||
|
|
||||||
|
*Do you still hear foods?*
|
||||||
|
|
||||||
|
I don't have synesthesia anymore, and I've been trying to chase it. One of my mentors is like, "Leave it alone. You needed that when you were unwell to keep going. It incentivized you to continue the practice." But now that I'm well, I don't want to go back. I have so much empathy for all of us who are dealing with tummy pain.
|
||||||
|
|
||||||
|
*When you talk about these different cultures and sets of patterns that you've stewarded—patterns and protocols from fermentation with sauerkraut, yoga, soul food, and so on—how do you approach being a steward, learner, and teacher of so many different practices that have their own coherence but also resonance with each other? How do you hold their differences and their commonalities together?*
|
||||||
|
|
||||||
|
As an herbalist, I did not start seeing indigenous plants until I started respecting Indigenous people. When we're talking about yoga, which is an ancient Indian science, or Japanese or Chinese cuisine, or soul food—the thing that holds all of them together is that they are deep ancestral practices and lineages that are so overwhelmingly complex. One could not even begin to master them. It takes a lifetime to master how to cook fried chicken correctly, or to perfect that asana.
|
||||||
|
|
||||||
|
For me, humbling myself is my absolute favorite practice. *Humbling* comes from *humus*, comes from dirt. I am a dirt-colored woman. I love the earth—she looks just like me, honey, especially when she's healthy! I stay humble. I put my belly on the earth like a snake, and I very much appreciate the teachings that come, knowing that I'm only getting a fractal. From that place of humility, I'm able to see how that knowledge is fractal and how it replicates itself, and what those base principles are.
|
||||||
|
|
||||||
|
The first thing is respect. I have found that people are so much more willing to share with me when I'm prostrating myself, genuflecting—not flexing like I know everything, but genu-flexing like, "Please teach me more." And "Let me tell you what I've learned, what do you think about that?" And "What did your grandma say? What was that recipe you want to share with me? That sounds amazing."
|
||||||
|
|
||||||
|
People aren't taught to respect their traditions. People are taught to become consumers. For capitalism to penetrate the home, you cannot have culture, because capitalism relies on novelty. We've been fractured from our traditional culture. We have science, which has been captured by capitalists to reflect values and ideas that benefit them. We have all of this confusion about what to eat and how to live.
|
||||||
|
|
||||||
|
I stand as a powerful Black woman because we are *sankofa*—go back and get it. I want to wrap my arms around all of it so that I can give it back to us. I don't want people to be unwell. Because we don't have enough respect for our ancestors, especially respect for women—because food is often the domain of women. Those genius things that kept us alive, those things that built our bodies as strong as they are, have become invisibilized and discarded for veganism and all kinds of weird, non-ancestral stuff. No shade—the vegans are going to be so mad at me! Come for me, I dare you!
|
||||||
|
|
||||||
|
What I'm trying to rectify by holding the pattern language is helping people begin to see the awe again. People, begin to have awe.
|
||||||
|
|
||||||
|
For some of us, some of our ancestors are raggedy, and we are afraid to look back because we don't want to confront what happened. You don't have to look—it's fine. But I look back in the way that I understand Italian cuisine from a pattern language, in the way that I explore German cookbooks. I'll hold the knowledge for you to come back to when you're ready, to claim what is yours, which are these cultures that we have inherited.
|
||||||
|
|
||||||
|
These are the protocols—because what is culture but a set of protocols? Protocols for how to soak your beans, protocols for how to cook your greens, protocols for how to ferment your bread. These are all protocols that create a culture. Those cultures then shape our microbiome in a way that creates our identity. Culture tells us what to eat and how to eat to live in any given environment.
|
||||||
|
|
||||||
|
To figure out how best to eat in Colorado, I looked at places that had a similar altitude and grasslands. Let me look at all the grassland people. Dairy is just fine. Cows are sustainable in Colorado. Come for me because I could show you all of the steppe regions and how we're all eating the same thing—red meat. Even the Dalai Lama eats red meat, and it's because at this altitude it's so hard to breathe that we burn through our minerals like heme iron, causing our bodies to have a higher demand for heme. That demand is the same in all of our steppeways geographies.
|
||||||
|
|
||||||
|
The red meat is consumed in the grasslands where the buffaloes roam. It's a pattern. But how does that pattern of eating red meat then put us in proper relationship to the more-than-humans in our environment? To be a meat eater without understanding the significance of stewarding the animals is incorrect. You need the whole thing.
|
||||||
|
|
||||||
|
What I discovered about Indigenous folks of the Americas, and why there were so many bison, is that they were actively stewarding those herds. It wasn't just random that so many were able to thrive. No, honey—they were actively stewarding, and because their stewarding was sustainable, that's what grew out. That amount of herding gave them access to the highest quality protein on the planet.
|
||||||
|
|
||||||
|
Wherever we go in altitudes like this, where ruminants are eating grasses, we also see stewardship culture. Some of my favorite stewardship cultures are the Maasai in Kenya. Oh my God, they're beautiful! They're twelve feet tall! They eat no vegetables except if they're sick, then they'll take an herb. I love the Maasai—they're so amazing.
|
||||||
|
|
||||||
|
I love the cow-herding cultures because I'm a cowgirl. I'm in Colorado, and I better learn how to eat to live here. My health is so abundant because instead of just giving land acknowledgments to Indigenous people, I'm looking at their cookbooks. I'm learning what they ate because I see their genius, and I honor that genius, and I'm humble to that genius.
|
||||||
|
|
||||||
|
*I'd love to hear more about how you learn. You talked about cookbooks and humbling yourself. What does your learning process look like, especially considering how much our educational systems have erased these legacies?*
|
||||||
|
|
||||||
|
I love the process of triangulation. I pull my knowledge from multiple sources. The first source is the ancestral source—I want to know what the ancestors were doing. So, for example, when learning about a plant, I'll pull out my *Native Ethnobotany* by Daniel E. Moerman, or I'll pull out my African American herbal guides or my slave medicine book to see what enslaved people were doing. Then I may check Margaret Grieve to see what European people were using that plant for.
|
||||||
|
|
||||||
|
Then I'll look at the nutritional profile of the plant. One of my favorite books is *Minerals for the Genetic Code* by Charles Walters. I love some esoteric Acres USA! Put it on my bookshelf, period. I'll start understanding the herb from a nutritional perspective to see if the nutrients in the plant correspond with the medical functions that our ancestors are reporting.
|
||||||
|
|
||||||
|
Then I'll check PubMed and see the latest research coming out about the plant. I'll look for the gold standard—double-blind, placebo-controlled studies. I want to see those outcomes. But I have enough discernment to understand context. For example, people will say that in the Nurses' Health Study, which is a big study that everyone likes to cite because it was multi-year following nurses, red meat consumption is correlated with heart disease. But then I check if there's a similar study in another country that eats red meat, and you find that correlation doesn't exist. Then you realize, oh, when they eat red meat in the US, they're eating McDonald's. McDonald's, not red meat itself, is corresponding to heart disease.
|
||||||
|
|
||||||
|
The most important part is that I try it on myself. I will see what the herb is like in my body. Once I trust that it's safe from all my research, I take on the herb, and I will often apprentice with the herb for several months, sometimes several years, to fully understand if it does what they say it's going to do.
|
||||||
|
|
||||||
|
So there's also the embodied knowledge. I could sum it down to ancestral relevance, cultural relevance, scientific analysis, and then embodiment as the way that I go about gathering knowledge about plants or foods.
|
||||||
|
|
||||||
|
*How do you take that knowledge and bring it to others? How do you introduce people to this knowledge and wisdom that you've learned from so many different teachers? What is the next step of that apprenticeship?*
|
||||||
|
|
||||||
|
I teach from pattern to details. I'm a permaculturist—I've been teaching the Permaculture Design Course in Denver for several years. I'm not going to overload people with information that they don't need, with data and facts. I'm going to teach the pattern language so that they understand and are empowered to see the wholeness.
|
||||||
|
|
||||||
|
For example, it's spring, and spring is an opportunity to regulate our blood sugar. It's the season of the liver organ, the wood element in Chinese medicine. Sidebar: the five elements are also in West Africa, and it's the same five! So this is a pattern of the spring. Instead of saying burdock root does this, or yellow dock root does that, or dandelion root does this, I teach the importance of the bitter flavor and how all bitters create more bile and help stimulate all the digestive juices and enzymes.
|
||||||
|
|
||||||
|
I start with that broader pattern so that, regardless of which roots they're using, they get the big picture. Then I bring them into the details. Yes, dandelion works along the liver-stomach-spleen axis—let me tell you about these organs and how they work together. Yellow dock is liver-large intestines—let me tell you about the pattern language of the large intestines and the liver and how they work. My students really get it—they are great herbalists. They're so good! I think, *Wow, I really taught y'all, didn't I?*
|
||||||
|
|
||||||
|
I love a citation for the girlies who are ready to go deeper—and *girlies* is a gender-neutral term, everyone is the girlies! I always like to have references so that people can follow the paper trail and importantly, refute me. I want my students to be able to say, "Actually, you misinterpreted this data," and I'll say, "Oh, okay, teach me." Because I'm humble—I don't have to be right about it. I really want to see what the pattern is, and I understand that chaos is a part of the pattern, so sometimes things are unexpected, and I love that because then we get specific data.
|
||||||
|
|
||||||
|
For example, people rail against polyunsaturated fatty acids. First of all, omega-3 fatty acids are polyunsaturated fatty acids—we love omega-3s! So people don't even know the pattern of what the polyunsaturates are. People are mad because canola oil and vegetable oil are all polyunsaturated, and they cause heart disease. "They're the worst, they're poison, they're not natural, no ancestors would use them."
|
||||||
|
|
||||||
|
But there is a plant—this is when we get into the details—my favorite, sesame oil. The lignins in sesame oil keep it from going rancid. Whereas all the other polys get rancid and cause inflammation, sesame oil does not—it's protected by the lignins. So we have the broader pattern of polyunsaturated fatty acids being unstable. It's true, omega-3 fatty acids are hella unstable. But when we look into the details, we start to learn the specifics.
|
||||||
|
|
||||||
|
This particular oil has been used against aging. We love sesame! We see it coming up in Islamic cultures, in hummus with tahini. And then we see black sesame being really used in Asia. So for me, if many ancestors are using the plant, then I need to double-check. The pattern is still valid, but there is this nuance that queers the pattern. I love touching into that nuance, and we know that nuance must be present because the ancestors are not dumb. If they were dumb, we wouldn't be here.
|
||||||
|
|
||||||
|
Sesame oil is a prized oil, and we know why it is. It is a seed oil, but unlike those raggedy seed oils, this one is anti-inflammatory.
|
||||||
|
|
||||||
|
*One pattern I've come across in relationship to different protocols is capture. What are your thoughts or experiences with this? Has this word brought to mind cases where the legacies and patterns you steward have been vulnerable to capture, misused, or subverted?*
|
||||||
|
|
||||||
|
We talk about the capture of nutrition research by the seed oil lobby or the capture of agricultural research by Cargill and Monsanto. The deterioration of federal funding in research has been met with increased investment by capitalists who not only shift the outcomes of that research but hold the patents of things that used to be distributed to us, the people, and are now privately owned by them and charged back at us.
|
||||||
|
|
||||||
|
Capture is also happening in traditional food. We see Whole30, who just added seed oils to their products—captured. We see all of these trends. But what's fascinating is that you can't capture the pattern language, and the pattern language requires us to be in good relationship.
|
||||||
|
|
||||||
|
You can't capture fermented bread—these corporations could never. You can't, because the things that are true, the things that are healthiest for us, those things take time. There are only a few examples where a company could do it better.
|
||||||
|
|
||||||
|
I like to think about cultural institutions—restaurants are cultural institutions. In other countries, it's the restaurant that would take on the making of a traditional food that's very labor-intensive because they could utilize scale in a powerful way. We see that in places like Germany. The real way to make fried chicken is three whole days—it is a *process*. So we have these cultural institutions that are doing what they're supposed to do, which is taking on the labor-intensive process, and then we get to access our traditional foods through these cultural institutions.
|
||||||
|
|
||||||
|
Unfortunately, in this country, we cannot trust our institutions, and I hate that because having a thriving democracy requires that we trust our institutions. There is a cost to not trusting institutions—look at the anti-vaxxers. Their distrust was legitimate, but look at the outcome on all of us. It is a dangerous thing when we can't trust our institutions, and in this country, our institutions destroy everything beautiful. Try to get sourdough from the store—it's only been fermented for like five hours! What is this? Not them adding citric acid—bitch, please! What are you doing? It's incorrect. Make the bread correctly! I will buy it from you.
|
||||||
|
|
||||||
|
So yeah, there is all of this capture. But I want to talk about a crack in the edifice. A bitch loves a farmers market because you can go to the farmers market, talk to your bread girlie (which is often a dude—shout out to our bread girlies). There are these artisans, just like I was back in the day, who are sourcing the most nutrient-dense wheat and fermenting it, doing all of the things correctly.
|
||||||
|
|
||||||
|
The other side of capture is renaissance. Let's look at yoga. First of all, the yogis, because they're smart, the yogic ancestors—they had visions of what they needed to do to keep their culture alive, and they said to keep it alive, we're going to share it with white people. So in the twenties, Yogananda and all of these people were coming over because they had prophetic vision and insight because they wanted to keep yoga alive.
|
||||||
|
|
||||||
|
Yoga in India was laughed at. If you said you want to be a yogi, your family might disown you: "We don't do that. We're the new Indians." So what happens over fifty years of history in the United States is white people really take it on, and they find that it's supportive, that it's helping them, that it's easing their mind. And then there was a backlash—Indians were like, "That's ours. You're doing it incorrectly," and they took it back. So then we started seeing all of these Indian-run cultural institutions to teach yoga, such as mine. The Satya Yoga Co-op—Lakshmi Nair was like, "Nope, we're taking it back," creating this uber authentic, rooted, seductive, sultry, salacious, soulful practice.
|
||||||
|
|
||||||
|
So we see that whenever there is capture, there's also counter-movement, and that counter-movement is a pattern. This is an impulse, a survival instinct. Indian people were like, "You ain't about to tarnish our legacy with your yoga with your Lululemons, with your Starbucks." No shade—I love all women, so you can wear whatever you want. I'm not judging you.
|
||||||
|
|
||||||
|
So we have this renaissance of yoga, and then Indian yogis—or at least the modern girlies—are like, "Yeah, this is for people of color." And so then you have this proliferation of practitioners of color who descend from these beautiful Indian teachers. And now I use yoga to reconnect with my African ancestors, who also practiced asanas—even if they didn't call it asanas, it was something else. But yoga has been a pathway back home towards healing.
|
||||||
|
|
||||||
|
I wanted to give that example because there are always cracks. Remember, we have the pattern, but then we have the chaos, and the chaos often looks like this counter-movement. It's a beautiful thing.
|
||||||
|
|
||||||
|
*How do you know when the evolution of a tradition is correct? When we learn from other cultures or do that blood mixing you talked about earlier, how do you know when to trust the evolution we're drawn into?*
|
||||||
|
|
||||||
|
As a feminist, I ask one question: does this create beauty? If this practice creates beauty within your body, and then it creates beauty in your relationships, and then it creates beauty in the community, and then it creates beauty in the earth—because the broader pattern is regeneration. We know something's on point when it's regenerative.
|
||||||
|
|
||||||
|
Regenerative and sustainable are different. Regenerative means that the outcome is more than the sum of its parts. We're not keeping things level, staying stuck in one place—we're actually participating in a spiral of abundance.
|
||||||
|
|
||||||
|
When I think about what it takes for me to make my einkorn sourdough, I have to source the whole grains, either from Italy, where they take really good care of their soil. I know it's not local, but neither is my red palm oil. So I source the grains from an organization that's producing the highest mineral count, because what it takes to keep soil mineralized is good tending. I'm looking at the indicator of the impact on the earth by the quality of the nutrients in the food, period.
|
||||||
|
|
||||||
|
I get the grains to my house. Then I have to grind the grains. Oh, the time it takes! And I can't grind it too fast, or the volatiles are going to evaporate. So I grind these grains slow, and that slowness causes me to slow down. I have to plan three days to make my sourdough, and so now I'm in the slow phase. My mind is not running as quickly as it usually is, so now my mental health is better because I'm making sourdough.
|
||||||
|
|
||||||
|
I've got the flour. Now I'm mixing it in the right ratio, because I've researched a lot about sourdough. People have mastered this craft, and I am not going to forget what they have learned. I'm not starting over. So now I'm in sourdough culture, learning about the goddess, learning about Demeter and how she gifted us culture. Appreciating the European ancestors who really go hard on the grain—these are wheat people!
|
||||||
|
|
||||||
|
So I'm researching, having fun. And then I start making the dough, and I have to fold it in a particular way, and I have to work it, and I have to pay attention to it. Oh my goodness! Now I'm paying attention to everything because I've been paying attention to this dough, and also look at my forearms getting nice and fit. Now my heart is happy because we're working the dough. Then I have to bake it, and that's going to cost me because of my energy bill. So I'm thinking about the implications—this is worth it for me. I'm going to use this energy, and I'm going to thank the ancestors who got this energy to me.
|
||||||
|
|
||||||
|
But then I make the sourdough, and it's ready, and it's perfect. But if I eat all of that, I'm gonna get huge. There's nothing wrong with hugeness! But I don't need that much nutrition. So what happens? I share the sourdough with someone else. So now I'm relating, now I'm building community, now I'm building culture. I'm sharing sourdough loaves with my friends and my family. So now we're breaking bread, and in that breaking bread, someone's like, "Ouch, my knee!" And I'm like, "Oh, try this burdock." Let me spread some of the gifts from the earth, and then they're out making sure that their lawn's not getting sprayed so that their burdock is good enough to harvest.
|
||||||
|
|
||||||
|
Now look—regeneration at every level. We started regenerating the earth by getting high-quality grains, and then we ended with people harvesting their burdock root and keeping it from being poisoned. So that's how I know that it's correct. My body is better as a byproduct. My community is better as a byproduct, and the earth is better as a byproduct. Now I'm more beautiful. Look at my skin! Look at all that zinc from that high-quality einkorn. I'm beautiful, my body is beautiful, my community is beautiful, the earth is beautiful. We can trust beauty.
|
||||||
|
|
||||||
|
*Are there any other lessons that you would share with other pattern watchers, learners, hearers, and makers?*
|
||||||
|
|
||||||
|
I like ending on beauty. I love Auntie Robin Wall Kimmerer and others who insist upon this notion of beauty. It's so feminist, isn't it?
|
||||||
|
|
||||||
|
The most important thing is that we can have it—we can create it. That principle of honoring the body, honoring relationship, and honoring the planet applies to every single thing that we do.
|
||||||
|
|
||||||
|
I'm thinking about how all the research came out showing that it's 28 times more resource-intensive than CAFO meat to have those fake burgers. Nasty, nasty, nasty! No, incorrect. It makes you unhealthy. You're not connecting with the land—no ancestors ever did it. And the earth is suffering because of that nasty stuff.
|
||||||
|
|
||||||
|
I just want you to apply this lens to see that we can create cultures of regeneration, and that those cultures end up shaping our microbiome, shaping our moods, and then shaping how we relate to each other. That's what I really want to give to the world. All the vegans—you can come for me. You can come on our show, *The Petty Herbalist* podcast, and we can debate. Just create beauty—that's what I want to leave for y'all.
|
@ -1,12 +1,13 @@
|
|||||||
---
|
---
|
||||||
title: "Coraline Ada Ehmke: Contributor Covenant"
|
|
||||||
narrator: Coraline Ada Ehmke
|
narrator: Coraline Ada Ehmke
|
||||||
subject: Contributor Covenant
|
subject: Contributor Covenant
|
||||||
facilitator: Nathan Schneider
|
facilitator: Nathan Schneider
|
||||||
date: 2024-10-10
|
date: 2024-10-10
|
||||||
approved: 2024-10-11
|
approved: 2024-10-11
|
||||||
summary: "After widespread resistance to codes of conduct in open-source software communities, Coraline Ada Ehmke's Contributor Covenant became the most popular code of conduct in the ecosystem."
|
summary: "After widespread resistance to codes of conduct in open-source software communities, Coraline Ada Ehmke's Contributor Covenant became the most popular code of conduct in the ecosystem."
|
||||||
tags: [code of conduct, dispute resolution, gender, open-source software, organizations]
|
location: "Chicago, USA"
|
||||||
|
headshot: "/headshots/placeholder-headshot.png"
|
||||||
|
tags: [code of conduct, dispute resolution, gender, open source, organizations, software]
|
||||||
---
|
---
|
||||||
|
|
||||||
*First of all, I want to begin with the question of how you how you prefer to introduce yourself.*
|
*First of all, I want to begin with the question of how you how you prefer to introduce yourself.*
|
235
content/articles/kiessel-good_market.md
Normal file
235
content/articles/kiessel-good_market.md
Normal file
@ -0,0 +1,235 @@
|
|||||||
|
---
|
||||||
|
narrator: Amanda Kiessel
|
||||||
|
subject: Good Market
|
||||||
|
facilitator: Nathan Schneider
|
||||||
|
date: 2024-10-29
|
||||||
|
approved: 2024-12-16
|
||||||
|
summary: "Good Market is a digital commons for enterprises that prioritize people and the planet over profit. It enables communities to set and enforce their own standards for doing business."
|
||||||
|
location: "Sri Lanka / United States"
|
||||||
|
headshot: "/headshots/placeholder-headshot.png"
|
||||||
|
tags: [economics, organizations, ecology, standards]
|
||||||
|
---
|
||||||
|
|
||||||
|
*I want to begin with the question of how you like to introduce yourself. How do you introduce yourself to somebody you've just met? Where do you begin?*
|
||||||
|
|
||||||
|
It changes with every single context. But the general introduction for right now is that I'm part of Good Market, which is a digital commons. That's usually my introduction at the moment.
|
||||||
|
|
||||||
|
*Part of?*
|
||||||
|
|
||||||
|
Yes, I say, "I'm part of." I'm a co-creator. This is a collective effort so "part of" feels more right.
|
||||||
|
|
||||||
|
*How would you outline the trajectory of your life and career? Where did you start? And where do you see yourself now?*
|
||||||
|
|
||||||
|
I started with ecological systems. My training and early work was environmental toxicology and agroecology---what we would now call regenerative agriculture. I was very concerned about environmental problems, especially the intersections of environmental issues and social justice. So that was the earliest work.
|
||||||
|
|
||||||
|
*What were the specific contexts of that work?*
|
||||||
|
|
||||||
|
I was involved in ecotoxicology research connected to a Superfund site. After that, I taught at a local university in rural Thailand for a couple of years and became more focused on agriculture issues and community development. I came back to the US briefly for a Masters program, and after that, I joined a local organization in Sri Lanka that primarily worked in agricultural areas.
|
||||||
|
|
||||||
|
The country had been at war for years. When I arrived, a ceasefire had just been signed and there was a lot of energy, but then the 2004 tsunami happened and the war started again. The organization I was working with was one of the only local organizations able to work on both sides of the conflict---both the government areas and the Tamil Tiger areas. It was an intense period and it really deepened my understanding of social systems and social change.
|
||||||
|
|
||||||
|
The organization focused on social mobilization, community organizing, and network building. They worked with existing community-based organizations, or helped people form new organizations, to solve shared challenges and connect to opportunities. That was their core approach across different parts of the country. When I first joined, there were 300 staff, but after the tsunami, we grew to more than 1,200. I was one of the only international staff members. The organization was very much locally run.
|
||||||
|
|
||||||
|
When I was in university, I was focused more on the ecological side of things, thinking that if we just had the environmental solutions, everything would be okay. But over time, I became more aware of the political barriers, the social barriers to change. I ended up getting deep into social mobilization and learning about strategies for social change, and at some point, it just became clear that I needed to be more attentive to economic systems.
|
||||||
|
|
||||||
|
The current phase of my work pulls on all of those experiences, but it's much more about understanding our current economic system, looking at the root causes of our ecological and social issues, and finding leverage points that we can work on collectively to address those root causes. The work I'm doing now is very much around shifting economic systems so they are good for people and planet. So, that's the trajectory---ecological systems to social systems to economic systems.
|
||||||
|
|
||||||
|
*And what was the story of the creation of Good Market?*
|
||||||
|
|
||||||
|
It came out of experiences with the local organization in Sri Lanka. During the war, many of the communities we worked with were displaced. The organization was involved in emergency relief and resettlement work and became dependent on international aid. When the ceasefire was signed, they expected all of their funding to stop. I was asked to join to help with the transition to a more self-sustaining model, so they could continue the community work without international aid. I had some background in fair trade and what we now call social enterprise and I was supporting the local district teams. We were making good progress, but then after the tsunami and after the war restarted, the focus shifted back to emergency relief, and a new wave of international aid entered the country.
|
||||||
|
|
||||||
|
Donor aid was not my area of interest, but this was my community. These were people I cared about, so I didn't want to leave. But I really didn't want to be doing that kind of work. I was not interested in writing funding proposals and logical frameworks and reports, so the way to keep energy up was to go and visit groups that had self-sustaining models in parts of the country less affected by war, and also in other parts of the world.
|
||||||
|
|
||||||
|
Anytime I had a work-related trip or traveled out of Sri Lanka---to visit friends in Myanmar, India, Japan, the States, Europe, Australia, anywhere---I would go and visit groups in that area working on social and environmental challenges with self-sustaining models. I would try and find them online, but it was difficult because everyone was using different names for what they were doing. What words do you use to search for people doing this kind of work? I realized really quickly that if you found an initial contact in a place, and asked them, "Who else should I visit? What else should I see? Who else is doing this?" they would suggest other groups to visit. They all knew each other.
|
||||||
|
|
||||||
|
That is the origin. It was realizing how big and interconnected this movement is. By movement I mean groups that are choosing a different story. The dominant economic story is all about maximizing profit and growing, but there were all these organizations out there---using different language and different structures---but all working with self-sustaining business models and choosing to prioritize people and planet over profit. The full scale wasn't visible because it had emerged bottom up and different communities were using different words.
|
||||||
|
|
||||||
|
I wanted to work on something that wasn't donor-dependent or project-focused and I was interested in supporting groups that were working on social and environmental issues with self-sustaining models.
|
||||||
|
|
||||||
|
*How would you summarize what Good Market does?*
|
||||||
|
|
||||||
|
What we are doing now is making the broader movement of self-sustaining enterprises and networks more visible. We are making it easier for these groups to find and connect with each other, and to collaborate on systems change, whether that's changing the narrative or changing rules and policies. Our goal is to create a digital commons that is shared by all the groups using it.
|
||||||
|
|
||||||
|
*What do the groups have to do to be part of it?*
|
||||||
|
|
||||||
|
It's a commons, so there's a very clear boundary. That's been there from the very beginning. There are community-owned minimum standards for each sector of the economy. There's a free online application form. It's free to be included, but the standards are a very critical part of the process. And then there's a crowdsourced monitoring system. So to be included, participants have to fill the free online form, meet the community-owned standards, and have a public profile on the site.
|
||||||
|
|
||||||
|
*Are those standards things that groups usually already have in place, and are monitoring? Is it something that they already have in place before they come to you, before you encounter these groups? Or are they developing these kinds of practices in relationship to the platform?*
|
||||||
|
|
||||||
|
It varies. The minimum standards are designed to be accessible and work across regions, languages, and business types---social enterprises, cooperatives, not-for-profits, responsible businesses, and initiatives that aren't legally registered. For people signing up because they identify as part of the movement, meeting the standards is very straightforward. They are fully aligned with these values and they often go way beyond the minimum requirements.
|
||||||
|
|
||||||
|
If people are signing up because they are trying to access a specific benefit or market opportunity, there are more applications that don't meet the standards. They might not be prioritizing people and the planet at all. When there is a financial incentive to join, the risk of social-washing and green-washing is higher. Even then, no one is ever fully rejected. They receive feedback and recommendations for improvement. We offer to connect them with other organizations and networks that can support them, and we encourage them to make changes and reapply. Many of these groups reapply weeks, months, or even years later, and they are very proud of the changes they have made.
|
||||||
|
|
||||||
|
For those who are already in this space, the minimum standards are a relatively easy bar to clear. For those who aren't thinking about their impact on people and the planet yet, the goal is to encourage them and support them on this journey.
|
||||||
|
|
||||||
|
*How would how would you characterize the difference between these kinds of standards and, say, the fair trade labels that people might be more familiar with?*
|
||||||
|
|
||||||
|
These standards are just minimum standards that enable people to be part of the digital commons, but there are many networks that use the site that have additional criteria. To join their network pages, enterprises have to meet additional standards. For example, World Fair Trade Organization, Fair Trade Federation, and B Lab, which offers B Corp certification, all have network pages on the digital commons. Enterprises in those networks have all met additional standards and go through their verification or certification processes.
|
||||||
|
|
||||||
|
Some verifications and certifications and networks have started using the minimum standards and free online profiles as the first step of their own processes. The online form includes questions about an organization's environmental practices, how they treat the people they serve, their workers or members, and their suppliers, and how they benefit their community. If they are approved, their answers appear publicly on their profile page, which enables the crowdsourced monitoring system. The online form is free and usually takes around 30 minutes, so it's much more accessible than third-party certification.
|
||||||
|
|
||||||
|
The enterprises that have third-party certification only represent a small percentage of the enterprises doing this work. They are the tip of the iceberg. The goal is to increase the visibility of the broader movement. There are producer groups in India, for example, that might not have a certificate or any web presence but they are doing amazing work locally. Third-party certification might not make sense for them.
|
||||||
|
|
||||||
|
This is set up as a minimum level of recognition. It's built in a neutral way that lots of people can use because it's shared infrastructure. It gets used in very different ways by different networks and communities.
|
||||||
|
|
||||||
|
*How involved were participating groups in designing the model?*
|
||||||
|
|
||||||
|
The idea for an online platform came from discussions with all those groups I mentioned earlier, the people we visited in different countries. They wanted a space where they could be visible, connect, and share best practices. But software development can have high upfront costs, and because of the experiences during the tsunami and the war, we were very aware of the risks associated with different types of funding. We'd seen expensive donor-funded software platforms that became ghost towns after the project funding ran out. We'd also seen platforms that took on what gets called "impact investment" and were pushed to become more profit-oriented. We didn't want to take on funding that could lead to mission drift or cause it to become pulled away from the community.
|
||||||
|
|
||||||
|
So we talked to these international friends about testing the concept before building any software. We started by hosting a weekly marketplace event in Sri Lanka to see if the basic ideas were feasible. Does the concept work? Do the minimum standards work? Does a crowdsourced monitoring system work? We had paper applications in three languages and had weekly meetings to review applications and handle any crowdsourced monitoring issues that came up.
|
||||||
|
|
||||||
|
The intention was just to test the concept. We thought there would be about ten stalls. We didn't expect it to become so popular. It became the main place for people who cared about social and environmental issues to connect, and many groups began to depend on it, which wasn't the original intention. If we stopped, it would have affected their livelihoods, so we told the international friends that we were going to have to wait on the software development. It ended up taking four, almost five, years to make the local operations self-sustaining and generate enough revenue to start software development. We had four years of paper applications and weekly meetings, but by the time we built the software we knew what worked and what didn't, and it was based on what people really wanted.
|
||||||
|
|
||||||
|
Even after we had the initial software functionality, we told people we were beta testing in Sri Lanka. We wanted to make sure it worked across all sectors---agriculture, fishing, mining, renewable energy, tourism, tech, and all kinds of services. Once it began expanding globally, we focused on serving different enterprise networks. The enterprises signing up were usually invited by those networks or by other enterprises that used the site. Today, it includes enterprises across economic sectors, registration types, languages, and regions. The form can be filled in twenty-two languages and there are enterprises and networks from nearly 120 countries.
|
||||||
|
|
||||||
|
*What kinds of inputs informed the design of the marketplace?*
|
||||||
|
|
||||||
|
There were many co-creators, but there were three of us who really served as stewards and we all had been working for that same local organization for almost ten years. So we all had experience with community-based organizations like revolving loan funds, funeral societies, women's welfare associations, producer cooperatives, and groups managing natural resource commons. We had learned about mobilizing people for collective action, developing self-sustaining models, and building trust through transparency and clear community rules. These experiences informed the design process, even though we didn’t explicitly plan it that way. It was only much later when I was re-reading something from Elinor Ostrom that I realized our design followed the eight principles for governing common resources.
|
||||||
|
|
||||||
|
Diversity was a big consideration. The goal was to increase visibility across different sectors, legal structures, certifications, regions, and languages. Bridging those divides was a core principle.
|
||||||
|
|
||||||
|
Inclusion was also a crucial design consideration. It had to work for people who don’t speak English or use computers, but only have access to a mobile phone. We started by testing the software with people who lived in the city, had international exposure, and used computers, but we didn't consider it ready until we started getting applications submitted in Sinhala and Tamil by mobile phone from rural areas. That's when you know the design works.
|
||||||
|
|
||||||
|
*Have the standards been subject to ongoing evolution? How are those standards developed, and who governs them?*
|
||||||
|
|
||||||
|
There are a few basic principles that don't really change. Members prioritize people and the planet over short-term profit maximization, have a purpose that includes social or environmental goals, communicate about how they are good for people and planet, and have a sustainability strategy that goes beyond a one-time project or event.
|
||||||
|
|
||||||
|
The minimum sector standards are standards for each sector of the economy and those were developed to evolve over time. They were initially developed by looking at sustainability certifications for different sectors. There are more than four hundred with varying levels of credibility. What you find is that most sectors have a shared understanding of best practices for people and planet. This is particularly true in the high-impact sectors with a greater risk of exploitation. So we started by looking across all of those and finding the overlap and patterns, and then simplified the language to make it easier to translate and more accessible. They've been improved over time based on feedback from approved enterprises and networks. The full process is available online.
|
||||||
|
|
||||||
|
These minimum standards serve as the low bar, and from there, other certifications or networks can have higher levels of criteria. Networks are able to use the site to manage their networks and have their own additional standards and verification systems.
|
||||||
|
|
||||||
|
*What kinds of patterns have you noticed in the interactions among these these groups as they're setting standards? What kinds of dynamics emerge as people are developing and choosing their the standards that they're going to enforce for themselves?*
|
||||||
|
|
||||||
|
One pattern is that many groups start with a narrow focus in one area and then recognize the need to be more holistic in their approach as they engage in dialogue and explore the space further. For instance, some groups that were previously focused solely on social impact have started to recognize the connection between social and environmental aspects, leading to a more comprehensive approach.
|
||||||
|
|
||||||
|
I've also noticed an increased openness to collaboration across what were once seen as divided groups. Some groups that used to use very exclusive language are now open to a more inclusive and collaborative approach.
|
||||||
|
|
||||||
|
I can provide a specific example if it would be helpful.
|
||||||
|
|
||||||
|
*Please.*
|
||||||
|
|
||||||
|
The Social Enterprise World Forum works with social enterprise networks around the world. Most countries don't have a separate legal registration for social enterprises, so it can be difficult to identify them. SEWF worked with national networks to develop shared characteristics and a shared definition, and they wanted to establish a global verification for social enterprises that complemented existing local systems.
|
||||||
|
|
||||||
|
They used Good Market to test the process because the site worked across sectors and countries, and it enabled them to keep the investment and verification costs low. The original badge said "SEWF Verified Social Enterprise," and the standards used language that was more common in the UK and Commonwealth countries. During the initial pilot period, they realized that the terminology wasn't widely recognized in many places, and it was excluding groups that met the standards but didn't identify with the term social enterprise.
|
||||||
|
|
||||||
|
After a community feedback and review process, they changed the name of the verification to "People and Planet First" and simplified the language of the standards. This works for most of the social enterprise networks because it puts the definition in the name of the verification---social enterprises put people and planet first---but it also enables them to engage with groups that have the same core values but use different language like fair trade enterprises, cooperatives, steward-owned companies, post-growth enterprises, regenerative businesses, and others.
|
||||||
|
|
||||||
|
I'm seeing this trend in many different spaces, where groups that were once focused on their own "tribe" are now recognizing the value of bridging across and working with other groups. Community identity and trust-building are still important within their group, but they're more open to collaboration and cooperation with others.
|
||||||
|
|
||||||
|
*How does the platform or the organization support the verification process?*
|
||||||
|
|
||||||
|
They use the minimum standards and the free online application as the first step of the process. This works well because it is a free first step. Even if an organization isn't eligible for verification yet, they still benefit from having a public profile. They have a positive feeling and something to work towards in the future.
|
||||||
|
|
||||||
|
The second step is a verification fee which is paid through the digital commons which makes everything integrated. The final step is a verification form that covers the five People and Planet First standards and enables them to submit their financial documents, governing documents, and other evidence. The global network partners are able to review the forms, add comments and feedback, and submit their decision. All of this is managed through the shared software.
|
||||||
|
|
||||||
|
Because Good Market is a digital commons it's set up as a shared resource. When people contribute to developing it, everyone benefits. If a network needs new functionality, they can mobilize funds and invest in developing it, and that functionality is available to everyone. The People and Planet First verification benefited from existing infrastructure. The previous year, an organic farming network invested in developing a verification management system. They were already using the digital commons for their directory and they wanted to use it for their farm visits and their full verification process. They invested in the infrastructure that enables networks to create their own forms, collect data, manage the status of applicants, and vote. This infrastructure is now used by other other networks. It's why People and Planet First was able to pilot a global verification without big startup costs.
|
||||||
|
|
||||||
|
Now, when other networks want to collect information or implement a verification or certification process, they can use the existing infrastructure. People and Planet First has also mobilized funds and invested in new functionality like activity tracking systems and the ability to download certificates, which benefits others using the system. This is how the shared infrastructure has been working, allowing different groups to contribute to and benefit from its development.
|
||||||
|
|
||||||
|
*How does it help uphold the standards that communities set? What is the process for enforcing those standards?*
|
||||||
|
|
||||||
|
They are also able to use the crowdsourced monitoring system to flag the standards, but they have their own review process. I think that's a crucial aspect. Different contexts require different approaches. What works for one community may not work for another.
|
||||||
|
|
||||||
|
By giving each group the autonomy to decide what works best for their community, they can collect information, update their standards over time, and evaluate and verify their processes in a way that suits their needs. They can also have their own design principles and processes for changing standards, which is essential for their unique context.
|
||||||
|
|
||||||
|
At the same time, having a common infrastructure allows them to keep their information organized and accessible, while still providing the flexibility to adapt and evolve their processes as needed. This balance between standardization and customization is key to making these systems effective and sustainable.
|
||||||
|
|
||||||
|
*Is there a particular moment when you saw this system being tested, when you saw it confront its own limits or face challenges that community had to rally around solving?*
|
||||||
|
|
||||||
|
It has been non-stop, but that's what makes it fun. I don't see the obstacles as challenges, but rather as opportunities to learn and adapt. Every time something new comes up, it's a chance to think, "Okay, we hadn't thought of this. How can we address it?" It's a process of continuous learning and evolution.
|
||||||
|
|
||||||
|
In the early days, when we were testing the software in Sri Lanka, we were cautious about expanding too quickly. We wanted to make sure it worked across all sectors and languages. But as we started getting groups signing up from different countries, we realized that there was a demand for this kind of space. These groups were looking for a sense of community and connection. They wanted to be part of something bigger.
|
||||||
|
|
||||||
|
One of the key questions we had was whether the crowdsourced monitoring system would work beyond Sri Lanka. In Sri Lanka, people would flag enterprises because they cared about the concept and they wanted to maintain the standards. We weren't sure if it would work in communities without the same level of in-person connection. One of the earliest international networks was a national food store in Pakistan that used the site for their curation process. The first time an enterprise in Pakistan was flagged, we knew that the process was going to work.
|
||||||
|
|
||||||
|
It's been an evolution, with each new development and each new group that joins, we ask ourselves, "Does it work at this level? Does it work with this type of group?" It's been a fun and exciting journey, and I'm grateful to have been a part of it.
|
||||||
|
|
||||||
|
*In a context when somebody's flagging somebody else, what does the procedure look like?*
|
||||||
|
|
||||||
|
While it's less common now than it was in the early days, issues can still arise. The upfront process has improved significantly, making it more likely to catch potential problems early on. The initial application form has been refined and improved over time, reducing the likelihood of issues slipping through. That being said, there are still cases where a change in ownership, management, or governance, or a significant influx of financial capital, can cause a group to lose sight of their original values and mission. This is where crowdsourced monitoring comes in.
|
||||||
|
|
||||||
|
Every claim made by a group on their application form is publicly visible on their profile page. If someone knows the group and has evidence that a claim is false, they can flag it by clicking on the flag icon. This opens a checklist with all the claims. The person flagging has to select which claim or claims are false and provide some kind of evidence to support their concern. This starts a review process. Most issues are straightforward to resolve. Sometimes it's just a matter of updating information or correcting a mistake. If there's a more serious issue, they may be unpublished while they take corrective action, and if there's an intentional false claim, they may lose their approval status and be removed from the digital commons.
|
||||||
|
|
||||||
|
We've had instances where workers have flagged their own organization, suppliers have flagged groups that no longer source materials in a certain way, and customers have flagged products that don't meet the claimed standards. We've also had third-party certifications flag enterprises. For example, there was a group in Sri Lanka that had organic certification in the past. They were no longer certified, but still had the logo on their packaging. An international organic certification agency used the crowdsourced montoring system to get them to remove the false claim from their packaging. We even had a wife flag her husband's company because they had scaled quickly and started buying from outside sources that didn't meet the standards. The flagging process is anonymous.
|
||||||
|
|
||||||
|
When we first started, the concept was new and Sri Lankan enterprises were applying because they were trying to access market opportunities. Now, most applicants know the concept and they understand what the standards are before they sign up. This has reduced the number of flagging issues and makes them easier to resolve. Most groups are deeply committed to prioritizing people and planet. They are are more likely to take corrective action and resolve any problems that arise. They want to make it right. They care about it.
|
||||||
|
|
||||||
|
*In the fair trade movement, there has always been a give and take between a certain set of values and the temptation to compromise for adoption---especially when certification processes are funded by the certified organizations. There's always this threat of capture, of a certification being used in ways that the people who devised it didn't intend. Does that experience of capture resonate with you as something that you've had to deal with?*
|
||||||
|
|
||||||
|
Yes, it resonates with my earlier experiences in both organic and fair trade. I've seen how certification systems can be co-opted by companies that don't necessarily share the values and principles that underpin the movement.
|
||||||
|
|
||||||
|
For example, fair trade started with fair trade enterprises. These are businesses working for systems change and they embed fair trade principles in all aspects of their work. As the term "fair trade" became popular, certifications emerged that catered to large businesses. Now a profit-maximizing company could get a fair trade certification for a single product line. These product certifications had more resources, bigger marketing budgets, and much greater visibility than the fair trade enterprise networks that founded the moment.
|
||||||
|
|
||||||
|
Similarly, the early organic community had a deeply holistic approach and included principles around building soil health, increasing biodiversity, and ensuring fair labor practices. As the term "organic" became popular, corporations entered the space. Current organic certifications allow for large monocultures and industrial organic practices. Now the types of organic farmers who started the movement have had to develop new standards and certifications to raise the bar.
|
||||||
|
|
||||||
|
These are patterns we need to learn from. It's part of the reason the People and Planet First verification was developed. The five standards that underpin the verification were designed to prevent co-optation. Verified enterprises have to exist to solve a social or environmental problem, reinvest the majority of their surplus towards their purpose, and have a structure that protects their purpose over time. Profit-maximizing companies aren't able to meet those criteria.
|
||||||
|
|
||||||
|
*Have you paid a price for setting the standards the way you have in terms of limiting your reach?*
|
||||||
|
|
||||||
|
We haven't had to pay a price in terms of the actual standards. The entire purpose of the digital commons is to speed up the transition to an economy that's good for people and the planet. Having a clear boundary is critical for increasing the visibility of the movement. It builds trust and a sense of shared ownership and that has expanded reach.
|
||||||
|
|
||||||
|
The price we've paid is more related to inclusion, which is common in this space. We consciously chose to make it free to apply, become Good Market approved, and have a public profile on the site because we want to increase the visibility of the broader movement, which means including all enterprises that meet the standards, regardless of income level or status.
|
||||||
|
|
||||||
|
Financially, it would have been easier to pilot this type of initiative in a place like Europe or the US, but we chose to test in Sri Lanka because it needed to work for people who don't speak English and don't have access to computers. We were only able to start testing the revenue model once we began expanding to countries where more enterprises have the ability to pay.
|
||||||
|
|
||||||
|
*What is the platform's primary engine for economic sustainability?*
|
||||||
|
|
||||||
|
This initiative is different from others I've been involved in. Most of the things I've worked on have been revenue-generating from the start. With software, there's a big upfront cost, but the cost to scale and sustain is relatively small. We've had to invest a lot to get the software up and running, but the revenue from the marketplace events and shops in Sri Lanka helped to subsidize the software development costs.
|
||||||
|
|
||||||
|
The site has what's called a freemium subscription model. It's free to have a profile and use many of the basic services, but people can become "cocreators" and pay a monthly subscription to access additional services and also support the commons. This enables people to contribute to the commons and help it grow.
|
||||||
|
|
||||||
|
It's also possible for approved enterprises to receive payments through the site. There's a 6 percent marketplace fee to help cover the costs of that service. Networks are able to use the software to create white label marketplaces for their own communities on their own sites. If a sale happens through a network marketplace, the network receives half of the marketplace fee.
|
||||||
|
|
||||||
|
Subscriptions and marketplace transactions are growing, but that will take time. In the meantime, there are many networks wanting additional functionality. They're mobilizing funds to invest in software development, and that's helping to cover costs for now.
|
||||||
|
|
||||||
|
*What have been some of your most important decisions, you, either individually or collectively, in the in the process of building this framework and and an organization, and what prepared you for making those decisions?*
|
||||||
|
|
||||||
|
The key to building a community-driven initiative is recognizing that it's a never-ending, ongoing process. Every decision feels like the most important decision at the time. It requires being attuned to how things are evolving and changing, and being able to pivot and adapt constantly.
|
||||||
|
|
||||||
|
I think what prepared us is that the three co-founders have been through a lot of challenging experiences together. We've been through natural disasters, war, terrorist attacks, regime change, and major economic crises. Each time, we had to figure things out together and adapt. These experiences have helped us be more comfortable with uncertainty and approach challenges with a mindset of "we'll figure it out." When an issue comes up, we see it as a data point, a useful piece of information that requires attention and possibly adaptation.
|
||||||
|
|
||||||
|
This has made it easier to navigate challenges. It's about being present and listening to the needs of the community, and being willing to adjust and adapt as needed.
|
||||||
|
|
||||||
|
I could really feel the impact of these experiences during the pandemic, when I was talking to other organizations that were struggling. Having gone through so much change in the past, I was able to be in a good listening space and provide support to those who were trying to figure out transitions. I know how hard it is, and I was able to be more present for them.
|
||||||
|
|
||||||
|
*You're in some respects creating something new with a platform, a digital tool, but you're also building on existing communities. Do you see Good Market as continuous with or departing from pre-existing legacies in the communities you're working with?*
|
||||||
|
|
||||||
|
I absolutely see our work as a continuation of the efforts of those who came before. We're building on the lessons learned from community organizing in Sri Lanka and other traditional communities. This way of working is not new, but we're adapting it to the current context and using digital tools to enable it.
|
||||||
|
|
||||||
|
What's exciting about this approach is that allows for both bonding and bridging. It recognizes the importance of bonding within smaller networks, whether they're place-based or focused on a particular topic. These communities provide a safe space for people to experiment, build trust, and feel understood. We're committed to preserving this aspect of community building, even as we use digital tools to enable it. In fact, a lot of our work is focused on localization, creating local tools to support local movement building and face-to-face interactions. We believe that change requires in-person connections and a sense of community, and the software is designed to enable these kinds of interactions.
|
||||||
|
|
||||||
|
The digital aspect of this work also enables bridging between communities and networks. Even if groups have different specialties or approaches, they may have shared interests or leverage points that can be used to drive change. The digital commons makes it possible for these groups to come together, share information, and collaborate on issues that matter to them. It also makes it easier to fill gaps. People can find products or services or solutions that aren't available in their area. That can be really fun.
|
||||||
|
|
||||||
|
*Is the language of "protocol" something that you've used in in this work? You're working across many languages. What kind of words do you use to describe Good Market? You talked earlier about the commons, for instance.*
|
||||||
|
|
||||||
|
When working with software engineers, I'll use more technical terms like "protocol." Beyond that, we try to use more accessible language that resonates with people. We talk about "community rules" and "minimum standards," which are more relatable and effective.
|
||||||
|
|
||||||
|
We've also found that using the term "digital commons" has been helpful in conveying the idea that the platform belongs to everyone. This language has been particularly useful in shifting the mindset away from a profit-maximizing, platform-monopoly approach. When we started using the term "commons," it clicked with people and created a sense of ownership and shared responsibility. It's no longer just about using a platform, but about being part of a shared community.
|
||||||
|
|
||||||
|
Initially, it was hard to find the right words to describe the different types of groups that use the digital commons. Some don't identify as businesses, others don't identify as organizations. Some call themselves a brand, and others find it too marketing oriented. Some prefer initiative, others feel it doesn't sound established enough. Over time, we've found "enterprise" to be the most effective bridging word. The original meaning is an undertaking, working together for a purpose. It's a neutral term that includes everything from informal voluntary initiatives and mutual aid groups to large businesses that have been around for decades.
|
||||||
|
|
||||||
|
We use the term "network" to describe an enterprise that works with many other enterprises. This can include member organizations, certification bodies, and community-owned spaces. These terms have worked well, but it's taken time to find the right language that can bridge across different divides and be used effectively across the community.
|
||||||
|
|
||||||
|
*What is holding this kind of model back from becoming more widespread than it is?*
|
||||||
|
|
||||||
|
We've seen a significant financialization of our economic system, resulting in a huge concentration of wealth and power. This has made it increasingly challenging to undertake this type of work. The current system's rules and regulations only exacerbate the difficulties. There are deep-seated, structural issues that make it hard to effect change.
|
||||||
|
|
||||||
|
I think this is why there's a growing interest in collaboration now, more so than even a decade ago. People who are pioneering new approaches are recognizing that these challenges are too big for any single organization or network to overcome alone. When we talk about the need for collective action, it resonates. People recognize that we need to come together for meaningful change. Collaboration is the only option. We can't do it alone.
|
||||||
|
|
||||||
|
I think there are people who initially believed they could create change through their individual enterprises, actions, or choices. Or they thought that voluntary action by corporate leaders would be enough. Now, there's a growing recognition that the challenges we're facing are interconnected and deeply ingrained, and they're going to require a more systemic approach.
|
||||||
|
|
||||||
|
An example of a shared challenge is access to financing and appropriate financial services. Mainstream finance is focused on maximizing profits and endless growth. Even in the impact investment space, the dominant narrative is that it's possible to have social and environmental impact *and* market-rate returns. For many of the enterprises we're serving, this narrative is detrimental. They are looking for patient, non-extractive finance that serves their actual needs. While many enterprises are finding creative ways to generate revenue from the start, others---especially those working on large community infrastructure projects---require financing to get off the ground.
|
||||||
|
|
||||||
|
*Are there ways in which you've seen that developing shared standards can enable groups to get over those barriers?*
|
||||||
|
|
||||||
|
I feel like it's just beginning, and this is one of the things that excites me the most. In almost every sector, people are collaborating to find solutions to the challenges they're facing, and because they are working in different contexts, many diverse and innovative approaches are emerging. But when we look across all sectors, the biggest ecosystem gaps are in the finance sector. Finance is lagging behind.
|
||||||
|
|
||||||
|
I think the entry point is increasing the visibility of groups that are testing out new models of non-extractive finance and transformative finance and trying to do things differently. There are some very new efforts to increase collaboration and sharing in this space. That's the first step to developing shared language, shared standards, and a range of financing options that are better suited to the needs of next economy enterprises.
|
||||||
|
|
||||||
|
*Thank you. Is there anything else you want to make sure to include in this story, that you want people to understand about Good Market or about your your work?*
|
||||||
|
|
||||||
|
I'd like to offer some advice to others who are setting up protocols. Having been involved in and supported many groups in this process, I've learned that it's much easier to establish basic protocols at the beginning of an initiative. I've seen groups, such as marketplaces, that try to introduce protocols later on. It can be extremely challenging to add new protocols and boundaries when you have current members who wouldn't fit within those boundaries.
|
||||||
|
|
||||||
|
At the same time, I've seen start-up cooperatives and other initiatives that get caught up in trying to design the perfect system before they begin the work. They can spend years in planning meetings without much real action. The key is to strike a balance between having a solid foundation and not overthinking it. It's important to articulate shared values, the boundaries of an initiative, and very basic protocols or community rules, something simple, yet effective, that allows you to begin working and gathering real world feedback. From there you can learn and adapt and evolve as needed.
|
||||||
|
|
||||||
|
Another crucial aspect is using simple language. This helps bridge divides and ensures that your protocol is accessible to everyone, regardless of their background or expertise. If you can explain your protocol in a way that your aunts, uncles, or other family members can understand, it's more likely to work. Using clear, concise, and simple language helps make community rules more inclusive and easier to implement.
|
239
content/articles/littauer-constructed_languages.md
Normal file
239
content/articles/littauer-constructed_languages.md
Normal file
@ -0,0 +1,239 @@
|
|||||||
|
---
|
||||||
|
narrator: Richard Littauer
|
||||||
|
subject: Constructed languages
|
||||||
|
facilitator: Nathan Schneider
|
||||||
|
date: 2025-02-04
|
||||||
|
approved: 2025-02-11
|
||||||
|
summary: "Constructed languages, or conlangs, are the basis of a hobby, a science, and a community that now occupies a small corner of the entertainment industry."
|
||||||
|
location: "Wellington, NZ"
|
||||||
|
headshot: "/headshots/placeholder-headshot.png"
|
||||||
|
tags: [fiction, gender, language, open source, software]
|
||||||
|
---
|
||||||
|
|
||||||
|
*Can you tell me a bit about how you like to introduce yourself?*
|
||||||
|
|
||||||
|
Hello! I'm Richard Littauer. I use he/him pronouns. I have chronic ADHD and am probably on the autism spectrum, which means introducing myself is impossible. I saw someone recently on Bluesky who said, "My hobby is having hobbies," and that definitely applies to me.
|
||||||
|
|
||||||
|
How I define myself really depends on whatever is happening in a given moment. I'm currently a PhD student at Victoria University Wellington, Te Herenga Waka, in Te Whanganui-a-Tara, New Zealand. I'm not a New Zealander---I'm American by birth. I'm also an open source aficionado, polemicist, pundit, community organizer, and developer. I'm in that ecosystem of open source things.
|
||||||
|
|
||||||
|
I'm also a conlanger, which is the most common term I use. Sometimes I say constructed linguist, sometimes computational linguist, because I have a linguistics background. Sometimes I just say linguist. But conlanger---someone who makes languages up---refers to what I'm probably going to talk about most today.
|
||||||
|
|
||||||
|
Xenolinguist is another possibility I've used before---*xeno* as in alien languages, from the Greek word *xenos*. I sometimes introduce myself as a classicist because I have formal training in Latin and Greek. I did five years of Latin in high school and two years of Greek in university. *Linguist* kind of subsumes classicist under it for some definitions, but not for others. Usually one of these terms is how I introduce myself.
|
||||||
|
|
||||||
|
*How would you tell the story of your development as a conlanger? Where would you start that trajectory, and how did that beginning bring you to where you are now?*
|
||||||
|
|
||||||
|
There's this funny book---it's red with a black stripe down the side---called *The Languages of Tolkien's Middle-Earth*. It's by Ruth Noel. I've had multiple versions because people keep giving it to me. There's an interesting bit where the author mentions that Tolkien's first conlang was the word *woc* for cow, which is just *cow* backwards. It's a really boring language since that's all we know. I'd argue that's not even a language---that's just a code word.
|
||||||
|
|
||||||
|
That particular reference to Tolkien often comes to mind when I think about where I started with languages. One of the first things we do as humans is talk. I've been working with languages my whole life. My parents didn't teach me French even though I was homeschooled, which was a shame. They would talk in French over me with my sisters about my birthday presents. I was paid a quarter for every Latin name of a plant I learned when I was around six to ten, which was a great incentive. I probably got an easy buck that way.
|
||||||
|
|
||||||
|
*Why was that important to them?*
|
||||||
|
|
||||||
|
For my mother, being literary was always very important. She wanted me to become C.S. Lewis---a preacher or academic writer about the kingdom of God.
|
||||||
|
|
||||||
|
This took a side quest turn when I was around ten or twelve, and my aunt Theresa Littauer gave me a copy of *The Hobbit*. I read it immediately, then read *The Lord of the Rings* in the next year or two. I've read it pretty much every year since, so at least twenty times now. I'm a very fast reader of fantasy literature.
|
||||||
|
|
||||||
|
I learned about Tolkien very early on. He's often an entry point for conlangs because he was a linguist and academic. He was head of the Anglo-Saxon department at Oxford for twenty-five years, and he made an entire world of languages, then peopled his world with novels. They were badly written and kind of discursive, but they introduced epic fantasy to many more people than before. He's not the first fantasist---people like George MacDonald had been doing excellent work before. There's tons of fantasy literature. But Tolkien started something new, and much of its strength came from setting his worlds in this complex milieu of languages, where you see Elvish---Sindarin and Quenya---and Dwarvish.
|
||||||
|
|
||||||
|
As a young kid, that was it for me. I was really excited. I started writing all my notes in Dwarvish runes and making my own languages for the fantasy worlds I was inventing with my friends. I never got into Dungeons & Dragons or role-playing games because I listened to an evangelical radio show called *Adventures in Odyssey*, which scared me and said getting involved with D&D would mean turning to Satan. I swore never to do that or drugs, which was probably one of the best things to happen to me---I feel like that would have been a hole I'd never get out of. To this day, I still haven't done cocaine or played D&D.
|
||||||
|
|
||||||
|
I got involved with languages, and this turned into a love of languages in high school. I was lucky to go to prep school. My teachers were excellent, particularly Dr. Munich, my Latin and Greek teacher. I loved Latin but was bad at it---I was a bad student because I had a huge amount of issues from religious trauma and parental trauma. I was raised in a very strict evangelical household, and that's not what I wanted to be, so I wasn't good at focusing in class. But the love was always there.
|
||||||
|
|
||||||
|
I loved Latin more than any of my other classes. When I went to university, I started doing English lit and classical lit, then realized---why do classical lit when I've already read half of these in Latin? So I switched to Greek. Then I did English and Greek, realized I didn't want to talk about English---I just wanted to read books---so I switched to linguistics and Greek, also doing Japanese for a year. I ended up dropping Greek because I did poorly, being so depressed from dealing with my trauma. So I just became a linguist.
|
||||||
|
|
||||||
|
For one particularly stressful Christmas---when my mom told my sisters to tell me she was remarrying, among other things---I distracted myself by looking up this movie I'd just seen: *Avatar* by James Cameron. I wanted to know if other people had learned this language from the film called Na'vi.
|
||||||
|
|
||||||
|
There was a new website called LearnNavi.org. I joined and started typing away with all my internet friends. No one had made a dictionary, and I'd just made one for my Anglo-Saxon class in university, so I thought, "I'll make a dictionary in LaTeX." I made this little three-page dictionary of all the words we knew. The language creator, Paul Fromer, couldn't release them legally because of copyright laws with Fox, but he could tell them to people in interviews. We could collect those and release them without legal issues.
|
||||||
|
|
||||||
|
Over the next two years, with probably two hours a day of effort, minimum, that turned into the LearnNavi dictionary of about forty pages, translated into thirteen languages, including Na'vi---that was a good April Fool's joke. I became one of the main moderators of the community. My name was Taronyu, meaning hunter. They took me to San Francisco to meet other nerds in a cabin in the woods, and I became fluent. I can still speak it, though not as much. The only people you can talk to in Na'vi are other Na'vi learners, which over time I realized wasn't really the subset of people I wanted to talk to all the time---no offense.
|
||||||
|
|
||||||
|
I went viral in *The Sun*. I was a centerfold---they painted me and then libeled me in the press, saying that I'd painted myself, which isn't true. They took all my sarcastic remarks at face value, so it's printed that I said I couldn't find a thirteen-foot-tall blue girlfriend. That's accurate, but it was a sarcastic remark.
|
||||||
|
|
||||||
|
Over time, people would reach out asking if I could make a conlang for their game. I also joined the Language Creation Society, dedicated to building these things together as a consultancy for movie studios. I bombed out pretty quick because I had to make money. I had a master's program in computational linguistics, and I needed to pay off my student loans---I'm an American, so I paid my way through college.
|
||||||
|
|
||||||
|
*Conlanging was not lucrative?*
|
||||||
|
|
||||||
|
No way. At one point, I estimated I made maybe $2,000 total from all the Na'vi stuff, which included interviews on radio and getting flown to California. It wasn't a very good use of time, but it was incredibly fun.
|
||||||
|
|
||||||
|
Eventually, a few people would reach out here and there. I translated some Latin for a game from a Seattle contact. Then there was this one friend who was in an audio maker Slack, and someone said they needed help. He connected me, and I ended up making the language for Philip Pullman's books. *His Dark Materials* was turned into a film by HBO, Bad Wolf Productions, and BBC in Wales. I went to Cardiff at one point.
|
||||||
|
|
||||||
|
In the third season, there are these creatures called the Mulefa who have these long trunks. They use the trunks to signal various words lexically like tones. I spent a lot of time in my living room just wandering around going, "Is that going to work? How do I display this?" I made this language based on the words from the books, and it's now in the movie. I taught it to the actors and did sound recordings. They had a really famous actress actually speak the language---she did a great job.
|
||||||
|
|
||||||
|
That was a full contract, a professional-grade, "Richard made some money" contract, which was really nice. That turned into more work eventually. I can't talk about all of it because I'm still under NDAs, but I've made goblin languages for a video game and worked with other people to continue doing this. It's been quite fun as a side-quest career.
|
||||||
|
|
||||||
|
I also taught Latin at a small high school in Vermont, coming full circle. I taught for three or four years, taking students from nothing to reading Virgil. I taught a course of six students how to make their own language, covering syntax, morphology, and world building. That was really fun---they learned a lot and have gone on to make their own languages.
|
||||||
|
|
||||||
|
At this point, I'm about as professional a conlanger as you can be without being David Peterson, who does this full time for major film studios. I've got an IMDB profile---I had to make it, but legally I was allowed to. I'm in the credits.
|
||||||
|
|
||||||
|
*As somebody who has these dual interests of linguistics and computer systems, I'm curious about how you see parallels there. I see this concept of protocol as something that bridges both. Do you see working with computer languages as something parallel with building linguistic languages, or does it jog very different parts of your brain?*
|
||||||
|
|
||||||
|
I have to be careful here because a lot of people say, "Oh, you know languages, you must be very good at programming and computer languages." But computer programming languages are quite different from conlangs. Conlangs tend to look like human languages most of the time. There are some that aren't, like Lojban, the logical language. There are some that really do, like Esperanto, which has about 100,000 native speakers---kids who've learned this language from birth.
|
||||||
|
|
||||||
|
Noam Chomsky has these really cool things on types of languages. I never remember perfectly, I just know they're subsets. I think of languages as various protocols or methods for parsing information according to set structures. For me, it's just a code---a way of encoding arbitrary information attached to arbitrary sound files. There's syntax and morphology and phonetics and phonology that get in the way, but they also encode how language can be structured.
|
||||||
|
|
||||||
|
I see them as being very related. I have a whole degree in computational linguistics, and the entire point of that field is to explain how you get a computer to understand humans and how you get humans to understand computers---that's it at the end of the day. Everything else falls into that bucket.
|
||||||
|
|
||||||
|
What's interesting for me as a conlanger is that a lot of people discount constructed languages as being incredibly boring or silly or stupid, not worth studying or being interesting. For me, I'm like, "Why?" Because they're also human---they're human sets. I see a lot of things that other people don't recognize as conlangs as conlangs. The International Code of Zoological Nomenclature is a good example, where there are codes for how scientists can use Latin names for creatures.
|
||||||
|
|
||||||
|
These Latin names have really strict ways of being presented together, and for me it's just making a conlang.
|
||||||
|
|
||||||
|
*By putting new rules around Latin names?*
|
||||||
|
|
||||||
|
It's not Latin, right? It's something that looks like Latin and that uses the Latin dictionary, but the rules they have and the protocol that scientists follow isn't actually Latin. It's another subset of Latin based on particular rules they put out. For me, that's very similar to prescriptivism---like saying, "Oh, you can't say, 'Me and my friends went to the mall,' you have to say, 'My friends and I went.'" All those things are just trying to make subsets of language for specific usages, so I see them as identical in terms of computational tools.
|
||||||
|
|
||||||
|
It always becomes fuzzy for me because when I make conlangs, I use code to help me generate word lists and types of words by defining the phonotactic possibilities of the language. When I do that, I'm aware I'm making a subset of all possible languages that's actually unlike human languages, because human languages aren't perfect---we mess things up all the time. I live in an area of the world that has English as its language, New Zealand English, but there's also a suburb here called Ngaio because it's from Māori. You can't start words in English with "ng," but New Zealand doesn't care because it has Māori influences. That's kind of why conlangs aren't quite human---you try to set these strict structures.
|
||||||
|
|
||||||
|
*Can you describe some of the process of how you go about developing a language? You talked a little bit there about the way you use computers as part of that process, and you also talked about walking around the room, flapping like an elephant. So how do you do this? Where do you begin?*
|
||||||
|
|
||||||
|
Let me scope this to how I professionally make languages for other people. I don't make a lot of languages for myself at the moment---I would like to, but I'm doing other stuff with my time.
|
||||||
|
|
||||||
|
When I make professional languages for work, I first define the phoneme set. I look at the IPA, the International Phonetic Alphabet--- You know, it's also the word for "fern" in Na'vi, which was chosen because I told Paul Fromer that I wanted to have more words for ferns and also more words starting with "ì." He asked me what I was drinking that night when we were at the bar in San Francisco or Petaluma, and I said "IPA," and he said "How about *eepa*?"---and that's why I have a tattoo of a fern on my foot.
|
||||||
|
|
||||||
|
Anyway, I look at the IPA and decide what sounds I want. Do I want to have weird glottals or clicks? Do I just want to have initial sounds? I edit these nowadays with a script that does this for me. My friend Joe---we met in Boulder, Colorado---and I work together using William Annis's code. We have this whole system where we write the phonemes out and automatically generate all possible words.
|
||||||
|
|
||||||
|
The second thing I do is phonotactic structures---how these sounds can go together. The beginning of a word "ng" is a good example of a phonotactic structure in English. You can't do that in English, but you can in Māori.
|
||||||
|
|
||||||
|
After defining the phonotactic structures, I have a giant list of auto-generated sounds. This is really good because I don't want to sit there and try to make up a thousand words---I'll end up making words that sound stupid or too English, and I'm not a perfect translator of phonetic sets into words. A computer can do that, and then I can pick and choose from them much easier, with less bias.
|
||||||
|
|
||||||
|
Then I fiddle with it and often send it to a client. I put a lot of the words together randomly and say them out loud, asking how it feels to them.
|
||||||
|
|
||||||
|
After that, I do syntax and morphology. That's when I figure out the basic word order and morphology. How is it going to be weird? How is it going to be different? I often mess around on Wikipedia, looking at cool languages until I get inspired, then take some bits and put them together.
|
||||||
|
|
||||||
|
Then I read out some sentences and translate basic things---"Joe saw the fox" or "I will drink your blood from the skull of my enemies," something like that. I try to translate that and see how it sounds, then send it to the client. Eventually we converge. I try to send a few different examples, and they can say "more like this, less like that."
|
||||||
|
|
||||||
|
Remember that bit about flopping around sounding like an elephant? It becomes very difficult if the speakers don't have human mouths, so I have to figure out how it's going to work. Or with whistle languages---I've made a few of those now. How am I going to write that down? How's that going to work? I have to figure all that out. It's actually quite fun.
|
||||||
|
|
||||||
|
*Have you done original written languages, like distinct alphabets?*
|
||||||
|
|
||||||
|
I haven't done a lot of them. I will be doing it for one contract I'm on right now. Written orthographies are really variable and different---that's a whole other subset of making things that's really fun and interesting.
|
||||||
|
|
||||||
|
I made my own runes when I was an early teenager. I made my own set of futhark, but they were very dwarven. Let's face it, even Tolkien himself took all his stuff from other languages. A lot of conlangers just steal and then say, "Oh, I borrowed it." It's kind of fun.
|
||||||
|
|
||||||
|
*You talked some about social dynamics in this process---your relationship with a friend where you are developing these together, or relationships with clients. What makes for a good collaboration in this context?*
|
||||||
|
|
||||||
|
I'm really bad at collaborating because I'm really scattered, and it takes me a while to get back to people. I've always been that way, and that's not going to change. I wish it could, but it's not. So I don't know what makes a good collaborator, except it's not me.
|
||||||
|
|
||||||
|
The main thing about a good collaborator, besides that, is passion and interest in making something beautiful together. That's art, because you're making art at the end of the day. It's very unlikely that someone will die because they mispronounce the shibboleth in a conlang---which does happen in human languages. That's where the word *shibboleth* came from. If you couldn't pronounce "ear of corn," you were killed when trying to cross the river if you were a Palestinian back 2,000 years ago.
|
||||||
|
|
||||||
|
With conlangs, it's almost never that bad. There was one conlang I made where I used a common morpheme that sounded like an English word for excrement, and all that stuff got cut. I should have thought through that better, but things happen.
|
||||||
|
|
||||||
|
With collaboration, you want to make sure you're working together to meet your goals. Sometimes your goal isn't just to make it sound nice---sometimes it's to make it sound realistic. I always try to make languages feel natural. If it's a small group of people, I try to make a very complex morphological language. If it's a large language being used by many people, I try to make a simpler language that's going to have lots of second-language learners.
|
||||||
|
|
||||||
|
It's always fun to try to make that balance work because I try to make languages look like real languages. Chinese is very simple because so many people speak it. Hungarian has 1.8 million inflections on their verbs---you've got to be born in that language to be able to speak it. That's just the way it is. It's really tough.
|
||||||
|
|
||||||
|
Trying to explain that to a client really helps. Back when I was a kid, it was the language that was most fun---we never actually bothered to make a world, we just made some languages and had a good time. The guy I did that mainly with went on to do a postgrad, and he's currently a postdoc at MIT studying gravity. You have to have a certain type of mind to really enjoy this sort of work. I just happened to know someone who had that kind of mind, which is great.
|
||||||
|
|
||||||
|
*So what makes a conlang great art? What do you appreciate about a really beautiful language? What do you look for? And I'm sorry, I know any variant of "what makes art good?" is a horrible question.*
|
||||||
|
|
||||||
|
It's not a horrible question. I almost said "it's a good question," which is my least favorite thing to say when I'm interviewing.
|
||||||
|
|
||||||
|
*Usually when people say "that's a good question," it means it's a bad question.*
|
||||||
|
|
||||||
|
It means they're stumped and don't know what to say. It's a really interesting question because it is hard to define the parameters of what makes art beautiful. I would say it depends on what I'm working on---it depends on what the goals are.
|
||||||
|
|
||||||
|
For me, a good conlang doesn't feel like a conlang. It doesn't sound like another language, like it's Arabic or "foreignese" or something. It sounds like a language that has a clear culture, where the words are coherent and mesh together well, where the way people say it sounds natural. I can imagine a grandmother speaking it, and also a really buff security guard, and also a child. I can imagine the poetry and see how clever it is in that language by trying to translate it and thinking, *Oh, that's a pun for this!* That's always really fun to me. That's a good language.
|
||||||
|
|
||||||
|
A bad language is one where it's really difficult to pronounce. I made this language called Llérriésh (or Llama), and even I couldn't say it well. I mean, I tried really hard, but there were all these weird tone things going on. It was cool for me to do, and I think it ended up being kind of beautiful because it was really complex---I just wanted complexity at that point. But I would never curse anyone to try to learn that language, to try to speak it to other people. But it was beautiful to me.
|
||||||
|
|
||||||
|
*How do you teach, say, an actor who has to speak a language that you've created?*
|
||||||
|
|
||||||
|
First thing to do is go through some basic words and say, "Here's how this is pronounced, here's how that's pronounced." You have to make sure that your orthography is standard. You can't use English orthography because English orthography is the worst. You have to be like, "Okay, 'a' is always 'ah', it's never 'eh'."
|
||||||
|
|
||||||
|
*Do you use a phonetic alphabet?*
|
||||||
|
|
||||||
|
Yeah, so I try to use a pseudo-IPA. I don't really give them IPA because that's too hard. But I try to say, "This is always like this, and that's always like that." The j's are always j's, they're never y's, something like that.
|
||||||
|
|
||||||
|
It also involves accepting that when they mess up, that's part of the language. Now that was the language---that's how it worked, actually, in this back-formation. I've heard this from other conlangers as well---when people mess up the language, it's like, "Well, that's just their dialect." That's really cool about conlangs---there's no ultimate truth at the end of the day.
|
||||||
|
|
||||||
|
It's definitely difficult for some things. English speakers have a lot of weird stuff going on. English is not a normal language---it's a unique language, just like every other language. Our r's---the American r is a really rare sound in the world. It's not a common sound. So trying to convince other people that "Oh no, every r is"---it's tough. You have to explain that over and over again, like "Oh no, it's not 'Sauron,' it's 'Saurrron.'"
|
||||||
|
|
||||||
|
*What are some of the most important decisions in creating a language?*
|
||||||
|
|
||||||
|
How many vowels are there? Is it tonal? How many tones are you going to have? What's the syntax going to be? That's always a really common one. Is it SVO, is it VOS---verb, subject, etc.? What's the order of words? Is this a language that's going to be written or not? Is this a language that's going to have a lot of things translated in or not?
|
||||||
|
|
||||||
|
What format are you storing your lexicon in? How are other people going to be able to edit that format with you? How will you present the information to a client is one of the main things. I often use a tripartite interlinear gloss translation where I have the original writing, then each word written out with all the morphemes in it, then the translation. I always try to do that, at least, because otherwise you end up with them not knowing where to put the emphasis on words.
|
||||||
|
|
||||||
|
*Do you generally deliver a dictionary and a grammar? How do you---what do you deliver? Say more about that.*
|
||||||
|
|
||||||
|
A .docx file, or maybe a Google Doc, with all the lines that have been translated or need to be translated, and a short dictionary of how it works, and maybe a short grammatical primer. Not massive. For the Mulefa language, I also had a whole two or three pages on how the finger movements should work for humans talking. I decided you just use your primary finger instead of a trunk---the great thing about humans is we don't have large proboscises. We don't have---it's really hard for me to signal with my nose "to the left." I don't know how I would do that, so it's like, just use your finger. So I had to explain how that works, and how the different variations would work---wiggling or harsh movements.
|
||||||
|
|
||||||
|
For another language I made, it was really important that I explained the different types of weird sounds that a goblin might make, and what clicks are, and how those work together, and how you would write that because I was giving it to sound people who then had to implement this.
|
||||||
|
|
||||||
|
*Is there a lot that you have to develop on the back-end that you don't show the client? Is there a more complex grammar?*
|
||||||
|
|
||||||
|
Yes, but it's also smoke and mirrors. A lot of the time, because I'm a contractor and have to cut down on my hours at some point, I can't spend ages debating whether a word should be something. Sometimes I'm like, "Okay, here's the thing," and I just thought of that in two minutes---but that was the two minutes I had to give you.
|
||||||
|
|
||||||
|
A lot of your job as a contractor is making them feel like there's an adult in charge who knows what's going on, authoritatively stating, "This is how this works." What I have to do is keep good notes on my end where I don't write conflicting things later.
|
||||||
|
|
||||||
|
So what I'm actually doing is making a grammar for me. That's always a bigger document, because it's important for me to know, "Okay, I made this decision, and here's how this decision is going to play out in the long run." That's where conlangs end up dying---when you end up with "well, this word is going to be a regular word, and this word's an irregular word," and then you get to like twenty pages of that and you're like, "Oh crap! What was I trying to do with this language? How do I translate 'I see the sun'?"
|
||||||
|
|
||||||
|
You have to write these things down. Otherwise you end up completely confused because there are so many different types of decisions you have to make: pronominal usage, subjunctive usage, future imperative usage. You know, all these sorts of things you have to figure out. Am I going to bother with that? Is there going to be an optative? Is there going to be a thing marked on the verb where the listener had to signal that they heard it firsthand? Some languages have that narrative morpheme---am I going to have that in every word or not?
|
||||||
|
|
||||||
|
Writing all these things down really helps you out, and the best way I've learned how to do it is to do it ad hoc, but document it well. Then trust your earlier decisions and listen to them, and don't mess up.
|
||||||
|
|
||||||
|
*How constrained do you think of the range of linguistic possibilities as being? I'm thinking here about the old Chomsky debates about whether language is a kind of cognitive structure as opposed to something that is an infinite playground. Even when you've developed languages for non-human beings---do you think of it like, "Okay, here's a checklist, there's a structure, there are some rules that you can't break"?*
|
||||||
|
|
||||||
|
Yes, there's always some rules you can't break, because otherwise you wouldn't be able to signal. I have not yet written a language that's entirely identical to the HTTP protocol---I could do that, that is a language, it's a way of signaling information.
|
||||||
|
|
||||||
|
The movie *Arrival* is a really good example, based on the Ted Chiang story, where the language is outside of the normal constraints of time. The way that they display that is really cool---the ink on the glass, if you haven't seen the movie.
|
||||||
|
|
||||||
|
When I'm making a language, normally what I'm doing is making a language where the assumption is that the brains of the other creatures are similar to humans. Or the assumption is we have a budget this large and we need this to be delivered by this time. You always have to balance time for yourself as well.
|
||||||
|
|
||||||
|
There's a really awesome resource called WALS---the World Atlas of Language Structures, at wals.info---made by the MPI at Leipzig, Martin Haspelmath and others. I've been using this since I was a linguist years ago, professionally, academically. It's really awesome because you can figure out what most human languages do. It's also really useful because if you have, say, prepositions, you're more likely to have adjectives before the noun---that's just how it works, they normally go together. So if I were to make a language with prepositions but post-nominal adjectives, that's actually quite rare. It's cool, it's possible---nothing says it's not possible. There's one language in Australia that does that, because there's always a language in Australia that does something.
|
||||||
|
|
||||||
|
What helps me when I have to make these hard decisions around bizarre languages is remembering that every language would be bizarre to the next person to see it. There are so many examples in the world of things just being bonkers. There's a really good example from northern Russia I saw a few months ago, where one word that's pronounced like "pet" is allophonically identical to another word that's pronounced like "dag"---they would hear them as being the same. I mean, those aren't the actual words, but in that language, allophonic variation is really different from how we think about it.
|
||||||
|
|
||||||
|
I have also tried to make languages that are impossible.
|
||||||
|
|
||||||
|
*What do you mean by that?*
|
||||||
|
|
||||||
|
The less we talk about that the better. I mean, it doesn't really work because I'm human and I use a human brain. Languages that don't make sense according to normal human structures---it doesn't work at the end of the day. I haven't found a way to make one that doesn't make a ton of sense.
|
||||||
|
|
||||||
|
Bird language is a good example. With whistling languages, humans are just never going to be able to do that well. I'm not pitch-perfect in the first place, but on top of that, it's just really difficult. You can make languages, but they're more like codes because they're never used to communicate effective things. I mean, Na'vi had a vocabulary of like 2,000 words last time I was using it, and we had long conversations. We translated *A Midsummer Night's Dream*-type things into it. But the conversations were mainly like "Hello! How are you? I'm good. I'm having some eggs with the rock that you get from the ocean where it is bitter"---because there's no word for salt, so you have to do these weird circumlocutions. We're always limited by our time and ability.
|
||||||
|
|
||||||
|
*Is there something that, if you had infinite time, you would love to be able to do someday?*
|
||||||
|
|
||||||
|
My immediate thought was, I would like to fix the International Code of Zoological Nomenclature.
|
||||||
|
|
||||||
|
*Tell us about why it's broken.*
|
||||||
|
|
||||||
|
Oh man, like there are agreement rules where adjectives have to agree with genera, but not if they're not a Latin or Greek word. And if it's a Greek word but it's been Latinized, then you have to change it---but they don't really talk about what Latinization is.
|
||||||
|
|
||||||
|
Basically, the people who made the code and other scientific codes are not linguists---they're zoologists. So they've sort of fudged things. Like "Latincize" in the glossary is "to give Latin shape or form to a word," which is the least descriptive glossary entry. And it all says, "Latin is ancient and medieval Latin," but they don't specify when the medieval period ends or what medieval Latin even is. No one knows what medieval Latin is, because everything was just bonkers during that period---you had words being used in completely the wrong way all the time.
|
||||||
|
|
||||||
|
A good example I just wrote about in my paper was *branta*. *Branta* is in one dictionary, the Dictionary of Medieval Words from British Sources, from William Turner---not Bootstrap Bill, very same name. William Turner wrote a book on birds in 1544, published in Cologne, and he said "*branta* is the word that English people called this goose." He wrote that in Latin, and that's in the dictionary. But he's clearly using an Anglo-Saxon word there. He's saying *branta*, and it's in the dictionary as *branta*, but it's not Latin, and also it's not medieval Latin because it's after 1544. He was clearly in the Renaissance---he was going to Switzerland and talking to people like Gessner. It doesn't make sense because these things haven't been thought out fully. You end up with these weird edge cases all the time where the code is not good.
|
||||||
|
|
||||||
|
It means that scientists' names get changed all the time for reasons they don't like. I just had a long argument on Taxacom, the taxonomist mailing list, about *dacites*, which has been masculine for the past 200 years. Someone just realized it's a feminine name for a fish. We're like, "Do we have to rename everything?" And they're like, "Yeah, you kind of have to rename everything." That's how it is---it just could be better. So that's something I would like to fix with my time, and I'm actually working on that.
|
||||||
|
|
||||||
|
In terms of other stuff, if I had infinite time and infinite play---because play is also a finite resource in some sense---there's a lot of stuff I would like to do. I would like to imagine what would have happened if Gaulish were still around, the language that pre-existed Latin in France. How would France be different? What would the French speak today? Would it look like Celtic?
|
||||||
|
|
||||||
|
Malta is a really good example of what happens when you mix Italians and Arabs, and then you end up with Maltese. "Chocoholic" is one of my favorite words because it's the stem "chocolate" combined with "holik," which is Arabic. Why not make a whole language that's mixed like that? That would be really fun, just really weird. I'd like to have Algonquian languages spoken on the east coast again, so let's figure out how to do that really well. I like those sort of historical "what if?" questions. What if Hastings had never happened?
|
||||||
|
|
||||||
|
*You've talked about a lot of histories as you're doing this kind of work. How do you think of yourself as part of these earlier legacies? I mean, you talked about Tolkien, and you talked about zoology and taxonomy---whose shoulders are you standing on?*
|
||||||
|
|
||||||
|
Everyone's shoulders. Patrick O'Brian wrote a really awesome series of books called the Master and Commander series---there's like twenty-one of them. I just finished reading them all for the first time a few months ago. They were truly exceptional, and one of the great things about the books is that they're character-driven. They're about the friendship of two men, Jack Aubrey and Stephen Maturin.
|
||||||
|
|
||||||
|
Stephen Maturin is a really fantastic character. He's a bastard child, half Irish, half Catalan. He's a doctor, a surgeon in the Navy, but he's also a member of the Royal Society of France and Royal Society of Britain. He goes around the world with Jack Aubrey, this blonde, kind of portly, ruddy, go-straight-at-'em-boys commander, a ship captain. Their friendship is really weird and great.
|
||||||
|
|
||||||
|
He spends all his time trying to describe new species and trying to stop Napoleon destroying science and presenting things on cool specimens in the world. Reading the book, I realized that's kind of who I've always wanted to be. It may have been influenced by the fact that when I was thirteen, I had a homeschool assignment where I read Patrick O'Brian's biography of Joseph Banks, who was the president of the Royal Society in Britain and was also one of these gentlemen scholars who went to New Zealand and came back and described a lot of species in a very colonialist kind of way.
|
||||||
|
|
||||||
|
I don't want to be a colonialist, but I do want to be someone who adds to the edifice of science, which I see as an edifice---it's something we've built together, it's a shared thing. For me, being a linguist is no different from that. It's part of the world of understanding and looking at things. I think looking at things is the most we can do as a species. There's really not much else that we're good at. We're just good at looking at things and maybe writing them down and talking about it to other people.
|
||||||
|
|
||||||
|
I try to have more fun, because I think that people should have more fun in the world and less not-fun. That's kind of how I see myself. I see myself as part of a long chain of linguists. I'm also part of the Tolkien world, also a Latin teacher and part of the Latin world, also a scientist and part of the science world. All these things sort of come together for me in a really fun way, and it makes it easier for me to code switch and task switch between them because they're all related.
|
||||||
|
|
||||||
|
Fundamentally, I try to think of myself as not being much different than being a dude sitting next to a fire 10,000 years ago and telling a story to the person next to them. Because historically, I haven't changed much. Evolutionarily, I'm basically that same person---maybe I'm a bit stupider and a bit less tall. But that's what I want to do with my time.
|
||||||
|
|
||||||
|
*Finally, are there any lessons you think this practice of conlanging has to offer to the rest of the world? Is there anything that you wish other people understood that people in this world do understand?*
|
||||||
|
|
||||||
|
I think about this interaction I had a lot. I went to a friend's house---she's a mother of three or four kids, she was a birder in Vermont. I was having tea on her back deck, and I saw this little common grackle come by, a bronzed grackle, and I said, "Quiscalus quiscula," or whatever it is.
|
||||||
|
|
||||||
|
She said, "What's that?" I said, "It's Latin," and she said, "Oh, we don't do Latin here."
|
||||||
|
|
||||||
|
I was like, "Why not? It's really fun. Just try saying it." It was really interesting to me because she was pushing back on a bunch of old white men who say, "Oh, the Latin is this, and you have to know it"---which, yeah, those people are jerks, that's not right.
|
||||||
|
|
||||||
|
What I wish people understood is that it can be a joy to mess around with language. It could be a joy to decide that "mess around with language" is now going to be the word *sploo* It could be a joy to sploo. You understood that, I understood it---why not? Like, hey, that's really silly. We just made this little code right here, and I wish people did more of that.
|
||||||
|
|
||||||
|
The other thing I wish people would do would be to stop explicitly judging other people for their use of language.
|
||||||
|
|
||||||
|
We do it implicitly all the time because that's how our brains work. If I hear someone with a Southern accent, I'm going to judge them, and that's unfortunate. It's bigoted of me, and I wish it didn't happen. But it does happen. I wish I didn't correct people in my head, and I wish other people didn't correct people for their use of language. I wish we were able to give people the benefit of the doubt and say, "This academic paper was written by someone who's incredibly smart, but they just don't know academic English, and that's not their fault. It's our fault for imposing this really crappy version of the language on them."
|
||||||
|
|
||||||
|
I wish people knew that more and were more sympathetic. But that's really difficult---it only comes through playing and realizing, "Oh, this actually isn't that hard," or, "Oh, this is hard, and now I know it's hard, so it must be difficult for other people." I wish we all did that more.
|
139
content/articles/mannan-diplomatic_protocols.md
Normal file
139
content/articles/mannan-diplomatic_protocols.md
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
---
|
||||||
|
narrator: Mosud Mannan
|
||||||
|
subject: Diplomatic protocols
|
||||||
|
facilitator: Nathan Schneider
|
||||||
|
date: 2024-12-13
|
||||||
|
approved: 2025-03-04
|
||||||
|
summary: "A diplomat for Bangladesh describes the role of protocol in high-profile international visits and treaty negotiations."
|
||||||
|
location: "Dhaka, Bangladesh"
|
||||||
|
headshot: "/headshots/placeholder-headshot.png"
|
||||||
|
tags: [diplomacy, government, friendship]
|
||||||
|
---
|
||||||
|
|
||||||
|
*How do you introduce yourself?*
|
||||||
|
|
||||||
|
I am a career diplomat, a professional diplomat. I was with the Foreign Office of Bangladesh for 37 years and 9 months. I did an MA at the Fletcher School of Law and Diplomacy in Boston, USA, and completed trainings in New York, USA and in Japan. I also did a short course at the University of Westminster in London. I have been posted as ambassador to four capitals, beginning with Rabat, Morocco. Then I went to Berlin, Germany. After Germany I was posted to Tashkent, that was formerly part of the Soviet Union. After Central Asia, or you can say Middle Asia, I was posted to Turkey. Since Bangladesh doesn't have an embassy in all capitals, one embassy takes care of about six countries. Altogether I was appointed Ambassador of Bangladesh to 18 countries.
|
||||||
|
|
||||||
|
I served as a junior or mid-level diplomat in London, my first posting. There I got two promotions and became a counsellor from second secretary. Then I was sent to open a mission in the Sultanate of Oman, which was previously a consulate. It became an embassy, and at that time I was also a counsellor. After this I went back to Ministry of Foreign Affairs (MOFA), Dhaka. From 2000-2002 I served as Alternate Permanent representative to the UN based in our mission in New York. Before becoming ambassador, I served in Beijing. Beijing was going to host the Olympics, and many changes were taking place. Wen Jiabao became the new Premier of China. I was there for three long years.
|
||||||
|
|
||||||
|
In between my appointment to different missions, I served in MOFA, Dhaka in different capacities from desk officer to Director General, then as Additional Foreign Secretary. I was promoted to the rank of Permanent Secretary while I was serving in Tashkent. I went into retirement after completing my ambassadorial assignment at Turkey with concurrent accreditation to Georgia and Turkmenistan. On my return to Dhaka, I was offered a position by FBCCI the Federation of business and commerce in Bangladesh, since I have long experience negotiating business on behalf of my country. Promoting business and commerce is part of an ambassador's responsibilities---we don't have commercial counselors in all our missions, so generally the ambassador takes care of commercial and business negotiations alongside political negotiations and protocol. I also took keen interest in cultural diplomacy.
|
||||||
|
|
||||||
|
I may add that I did a defense course to learn more about how the military operates and to develop better civil-military relationships among our Third World countries. I completed a one-year course at the National Defence College of Bangladesh, which was established in Dhaka with the help of Great Britain.
|
||||||
|
|
||||||
|
This is, in a nutshell, my background as a career diplomat and ambassador. I was instrumental in the negotiation between Bangladesh and Myanmar on the issue of the demarcation of legal territorial rights in the Bay of Bengal which took place at the International Tribunal for the Law of the Sea (ITLOS) in Hamburg. As Bangladesh Ambassador to Germany, I was instrumental in negotiations with Myanmar, while the Bangladesh High Commissioner in India handled arbitration with India regarding the sea borders and sovereign rights to undersea resources in the continental shelf. We had good results.
|
||||||
|
|
||||||
|
I also did negotiations in the field of business and defense cooperation during my tenure as Ambassador in Turkey during the global Covid crisis.
|
||||||
|
|
||||||
|
*What does the word "protocol" mean for you in the diplomatic context?*
|
||||||
|
|
||||||
|
Protocol has two meanings. Protocol can be a kind of document or agreement. It could be a treaty or a memorandum of understanding. Sometimes you can sign ordinary notes that might last for a few days or a few years. Protocol can also be a special understanding between two friendly countries.
|
||||||
|
|
||||||
|
But protocol also implies an established set of formalities. I was the longest-serving deputy head of protocol in Dhaka, or in some countries they call this the head of ceremonies, in the Protocol Division. I looked after visits and ceremonies for long three years during my tenure as Deputy Chief of Protocol.
|
||||||
|
|
||||||
|
This gave me the opportunity to be included in organizing state level visits of dignitaries and also be responsible for arranging important state functions. The most salient among these for me was the first ever visit to Bangladesh by a US President while in office---we had Jimmy Carter coming to Bangladesh after retirement, but William Jefferson Clinton was the only US president who visited Bangladesh while in power.
|
||||||
|
|
||||||
|
I had to do almost eight months of preparation for this particular visit---his advance team came, and then a second team came just before his landing, and finally the President of the US came to Dhaka. For security reasons, I will not tell certain things even now, even though it was 30 years ago. Many meetings took place as meticulous planning is required when arranging visits of heads of governments or state.
|
||||||
|
|
||||||
|
When you are in charge of protocol, you have to work day and night dealing with big and small facets of the event. It may include working out the details of what negotiations will take place, designing the airport reception to arranging which room the VVIP will stay in, what his/her eating habits are like, paying attention to his/her preferences of cultural activity. Sometimes the VVIP is interested to meet specific individuals. Since President Clinton was very interested in the microfinance system of Bangladesh, for which Grameen Bank and Dr. Yunus got the Nobel Prize in 2006, he was interested to visit a project related to microfinance.
|
||||||
|
|
||||||
|
Of course, any head of state will also visit his own embassy or one of his own projects if he wishes to. Then, as part of protocol, we also invite all heads of state or heads of government who comes to Dhaka to visit the National Memorial of the Liberation War of 1971 in Savar. We finalize all these things in advance, by communicating not just with the embassy in Dhaka but with also with concerned ministries .
|
||||||
|
|
||||||
|
Arranging the US President’s visit to Dhaka was one of the important events during my three years as Deputy Head of Protocol. During my time we had British PM John Major visiting Bangladesh. There was a visit by then Prince of Wales, Prince Charles. I flew with him and had breakfast in his royal jet. With him I flew to different parts of Bangladesh to see social programmes.
|
||||||
|
|
||||||
|
Apart from high profile visits, there were multilateral programs as well. We hosted the D-8, an organization of eight Muslim countries what are focused on developing their economies. It started in the middle of the 1990s in Istanbul. We hosted the second meeting after the Istanbul meeting---it was known as the Dhaka meeting.
|
||||||
|
|
||||||
|
As Deputy Chief of Protocol, I was the main person who coordinated things on the protocol side, it involved being present when our PM or President received or bade farewell to the VVIP dignitaries. I was also responsible for accompanying the dignitaries to different sites and parts of Bangladesh. I'm telling you this because these are the real work of protocol. Everything has to fine-tuned, synchronized perfectly so as to create the best possible impression.
|
||||||
|
|
||||||
|
You have to be very careful, from choosing the menu that is to be served to the smooth conduct of the negotiation meetings.
|
||||||
|
|
||||||
|
Let me recount another event. After a long day at the office---I was at a music performance in the evening. I received an urgent call over the walkie-talkie that three cabinet ministers wished to see me immediately at the State Guest House. They said "Is it possible in five days to organize a Tripartite Meeting between India, Pakistan, and Bangladesh?" The first thing, the most arduous task would be to ensure that the Prime Ministers of India and of Pakistan would attend and also that they agree on the gamut of their discussions. Then follows the hospitality elements---the hotel, the food, where they will stay, how many people will accompany them, what they will visit so on and forth. I immediately set to work, impossible as it sounded, to begin arranging Bangladesh’s hosting of a Tripartite Meeting between India, Pakistan, and Bangladesh at such short notice. It normally takes months to arrange events like this. I organized it on five days' notice. Even our Prime Minister was a little apprehensive that the Tripatrite Meeting could be hosted successfully on five days' notice.
|
||||||
|
|
||||||
|
The then Prime Minister of Pakistan, Nawaz Sharif expressed a desire to see a Royal Bengal tiger or the spotted deer---we have very beautiful deer in Bangladesh. He wanted to go to the Sundarbans and the Chittagong Hill Tracts. Chittagong Hill Tracts had spots of unrest in those days and arranging a trip was going to be a big security concern. Our PM said "If Prime Minister Sharif is going, you will accompany him." Security was provided by the armed forces, of course, because those are border areas. I flew with the Prime Minister of Pakistan and went to different parts of the country. He was enchanted to see the beauty of the landscape. I am sure he was thinking about the political consequences of the Liberation War of 1971 that led to the birth of Bangladesh but I along with my colleagues were praying that the trip concluded satisfactorily without any security incidents.
|
||||||
|
|
||||||
|
One has to be very meticulous when offering protocol. This is the diplomatic protocol I'm talking about, not just signing a protocol. Signing a protocol is also interesting, but that is different. Many small things---the understanding and exchange of niceties, even the exchange of gifts---can be part of protocol. When a mayor offers a key of the city to a visiting dignitary, that is also part of diplomatic protocol.
|
||||||
|
|
||||||
|
*How much of the rules of diplomacy are understood to be universal, or are already in place, as opposed to the details that you have to work out?*
|
||||||
|
|
||||||
|
First, basically, between two countries, or even in multilateral cases, you have the Vienna Convention, which sets some basic guidelines around embassies and treaties. Then there are diplomatic niceties. There are many formal things that you have to maintain. Protocol is not a light matter. There is no room for whimsicality.
|
||||||
|
|
||||||
|
In protocol one has to work out all the details when you are organizing an event or ceremony. A plethora of things play a role during a very high-level visit. No mistakes can be made. You can't play the wrong national anthem or have the flag unfurled on the wrong end. Even with all the attention given to details, mistakes occasionally happen.
|
||||||
|
|
||||||
|
Once in an embassy National Day event---I will not say which embassy---this was when I was in Tashkent, the CD player suddenly stopped, guests waited for the national anthem to resume, the ambassador turned red in the face. You understand, all the dignitaries were present and the national anthem had halted because of a technical glitch. I'm sure next day the person in charge, whether it was staff or junior officer, was packing his baggage and was headed back to his capital. In Bangladesh too, once when the Prime Minister came to attend a formal program, there was a technical problem that prevented the national anthem from being played, and the next day the chief of protocol was fired. These things happen. With protocol, you have to be extraordinarily careful, you have to be calm and collected under pressure, and you have to be well-trained on how to swiftly handle a *faux pas* or unmeditated disruptions. One has to understand the enormity of any failings and one has to always be on alert.
|
||||||
|
|
||||||
|
*How did you learn to develop that sense of detail? *
|
||||||
|
|
||||||
|
I took interest, that's the main thing. From the very beginning I knew this is one of the most interesting jobs because you will be meeting the heads of state and government, and at least the foreign ministers. My opportunity came as a junior officer to be a guide to a visiting minister---showing him around, taking him to the market, taking him to another ministry, just accompanying him---I was very alert from the onset. And I received very glowing commendations after the visit. No matter how difficult the task was, I never said ‘no’ to anybody---I tried to manage. That is another hallmark of a diplomat, protocol instills this quality because we are entrusted to create positivity and an atmosphere of confidence. The objective has to be achieved, no matter how difficult. At the same time the process has to go smoothly, almost seem effortless.
|
||||||
|
|
||||||
|
Having social connections always pays off in the protocol world. Arranging a visit to a factory or visiting an institution at moment’s notice would otherwise be difficult. If you don't have a good relationship with the top RMG industrialists for example---you know, the top seven in the world are in Bangladesh---then you will not be able to, at a moment's notice, arrange visits.
|
||||||
|
|
||||||
|
One has to know all the key protocol people at the ministry or the visa section and so on. Once, a VVIP dignitary from Bangladesh sent a message from the plane that for some urgent family reasons, he needed to go to Europe after his London visit. I was at that time, President of the London Diplomatic Association. I just called up a diplomat friend at one of the embassy's visa section. He told me, "You are our President. Just send the passport. We will do it while he is in London." And so within couple of hours, the visa was arranged.
|
||||||
|
|
||||||
|
Having a network of friends and contacts can help you in multifarious ways. When we were doing the negotiations in Hamburg, I found there many of my friends with whom I had worked in New York. They were posted as officers or judges in Hamburg. They were very understanding with regard to the Bangladesh position while Bangladesh and Myanmar were having this arbitration over the demarcation of the Bay of Bengal. It became easy for me. When you have a known face, they say, "Mosud, don't worry, we'll take care of that."
|
||||||
|
|
||||||
|
*What is the difference in your relationship to these protocols when you are the protocol officer as opposed to being the ambassador? Those are both roles you've held, but they seem distinct; one is designing the protocol, and one is performing it.*
|
||||||
|
|
||||||
|
A protocol officer, or in my case the Deputy Chief of Protocol, generally doesn't sign any agreement. An Ambassador is authorized on behalf of the country to negotiate everything. I did it a couple of times.
|
||||||
|
|
||||||
|
Sometimes you can come back after serving as ambassador and become the Chief of Protocol, because generally the Chief of Protocol is the most senior one, just below the foreign secretary. He doesn't do all the running around. That is done by the head of ceremonies, which I did for three years.
|
||||||
|
|
||||||
|
At the presentation line or during the credential handing over by an Ambassador, the Chief of Protocol is seen often next to the President or the Prime Minister. When you are ambassador or Chief of Protocol, you are permitted to go inside the aircraft when a visiting dignitary is coming and welcome him.
|
||||||
|
|
||||||
|
Chief of Protocols have deputies like the head of ceremonies. When you are Ambassador, you have the Minister Counsellor, Counselors, First Secretary so on. So you know all is being taken care by this team. As Ambassador you just offer the bouquet. The head of ceremonies has a more intricate job. The head of ceremonies has to be everywhere and get everything done plus he is still young and is learning to juggle more efficiently and with better ease.
|
||||||
|
|
||||||
|
I remember a particular visit. Alberto Fujimori was the President of Peru. He was visiting Dhaka with his daughter. At the airport, in the course of the conversation, he remarked that his daughter would be celebrating her birthday in Bangladesh during the visit. The visit was only for two days, but within that span I was asked by my ministry to organize a birthday party for Mr. Fujimori’s daughter. I organized a fitting birthday party the following afternoon. Mr. Fujimori was of course, delighted at the gesture.
|
||||||
|
|
||||||
|
On another occasion, we were informed that Yasser Arafat was arriving in Dhaka in two hours. The Prime Minister's office called and told me our Prime Minister would be at the airport to receive Mr. Arafat. I was instructed to do the needful including arranging a lunch for one hundred people. I was enjoying my weekend with my son, showing him one of the Mughal era antiquities in Dhaka. I took the instructions and calculated how best to get all this done before the aircraft carrying Mr. Arafat arrived at Dhaka in less than two hours. I returned home scrambling to dress for the occasion and rushed to the airport before our Prime Minister arrived.
|
||||||
|
|
||||||
|
*When you're training younger people coming into this work, what kinds of skills do you focus on helping them develop? *
|
||||||
|
|
||||||
|
First and foremost, patience. In the dead of the night, you may have a call from the Prime Minister or President's office to do something right away. Let us say, for example, the Finance Minister from China will be landing shortly, and Mosud Mannan has to accompany. The price of one’s patience and dexterity is of course, sweet. You get to enjoy unique perks: as a young official I got to see the gold-plated interior of the royal jet of Saudi Arabia, and I shook hands with Mr. Nelson Mandela.
|
||||||
|
|
||||||
|
So first and foremost, I will advise young diplomats to cultivate patience, not to get stressed out with the high-voltage tasks they have to deliver and the tightropes they have to cross. You have to know how to think quickly, act fast. That just comes with the territory. You have to be culturally sensitive and know how to negotiate with the different embassies. When I joined the Federation of Bangladesh Chambers of Commerce and Industries (FBCCI), I had to negotiate with Saudi Arabia again, because during their Dhaka visit they wanted a brand new hotel for their Commerce Minister. I tried to offer reputed hotels that we had in mind. But no, they wanted the newest hotel in Dhaka---I had to see that it got reserved for the 21 or 31 member entourage. So you insist, or yield according what is the best choice under the circumstances. And you prepare yourself developing a certain mindset. Life in protocol demands that one is capable and success-oriented. These things are acquired over time, not overnight.
|
||||||
|
|
||||||
|
You also have to be very careful about your appearance. Our principal at the Foreign Service Training Institute taught us that--- whether you eat or not, buy two good pairs of suits, two good pairs of shoes. If you are wearing spectacles, they should be clean and nice. Always carry a pen with a notebook, too, because if you don't have a good memory you need to keep track of what people are requesting. You have to learn these things quickly. You will not have all of your thirty-years-plus career to learn. You have to do it within the first two years of your service.
|
||||||
|
|
||||||
|
Not everybody is suited for protocol. You have to be by nature outgoing---not a person who is too academic, and who only knows to write good speeches. Speechwriting will be your bonus if you can write. Maybe your minister is not a bureaucrat---he is coming from the business sphere and doesn't know anything about China--Bangladesh relationship, because maybe he mainly does business with India. He looks at the Ambassador and asks “Who will write my speech? I forgot to bring it from Dhaka." And naturally we prepare it, while we were in a car or in the residence, or in the office.
|
||||||
|
|
||||||
|
You have to be very well versed in how to check the proposed protocol, MOU, or treaty that is going to be signed. Once a certain cabinet minister from our country was ponderously going through a draft text that was going to be signed when the Prime Minister arrived, I had to nudge: "I have checked it thoroughly, Sir. Please approve it now, because it has to be translated into three languages, and the Prime Minister is arriving tomorrow." I didn't show disrespect, but I just told him, "We are running out of time---the Chinese authorities are waiting for us downstairs in the embassy".
|
||||||
|
|
||||||
|
Sometimes you have to know how to be not rude, but a little bit firm--- you have to know how to negotiate with all kinds of people: people who are easy; people who are difficult. Because many of the ministers are good in politics but necessarily not so in diplomacy or specific topics.
|
||||||
|
|
||||||
|
A diplomat should be well-read. He should read books on diplomacy. He/she should learn one or two languages. There's no ending---if you want to be the best, and survive and continue in the service, there is no end of learning. There are books of the best speeches of the world translated into English. You have to learn when to crack a joke in diplomacy. You have to know how to appreciate music, dance, and other things, and you have to have the habit of reading---not just political or history books. You have to know how to read between the lines of the newspaper. You have to learn about your own language, your own literature, and the country where you are posted--- their literature, language, and culture. It's not so easy. That's why many people, after a few years, fail to continue, or spend more time back at home, or they are not very good in diplomacy.
|
||||||
|
|
||||||
|
You have to know your strength. First you negotiate through niceties, and then in the long run you have to exert your power or strength at the table. You should know how to softly negotiate, and then put your cards down and say, "I have 42 votes, and you have 15, so I already have won. So it's no good negotiating anymore."
|
||||||
|
|
||||||
|
When Bangladesh was a member of the Security Council, I was one of the alternate representatives. Sometimes, the US permanent Representative to the UN would drop by to discuss things with my Ambassador. Behind closed doors, they would talk amongst themselves. Security Council votes mattered. Since I was part of many negotiations to gain votes for Bangladesh, I know how diplomats can accomplish these things. It is not as easy as it sounds. You have to know the game. You have to know international law. More than that, you have to know about history, and you have to make good friends. My Ambassador did all this, and I believe, I did too. It is not a bookish thing. It is not an academic thing. You have to have two or three options, and make sure that one will work.
|
||||||
|
|
||||||
|
*Have there been times when you've had to break the rules?*
|
||||||
|
|
||||||
|
Generally, countries like Bangladesh don't break the rules. The rules are generally not broken. I will say the rules are pushed apart by powerful countries, because they have other powers, because they are not only negotiating politically. They will push the rules by offering to give you some help, maybe in defense or commerce.
|
||||||
|
|
||||||
|
I would say it is not rule breaking. It is power. And you know which are the countries who have that power. There are not more than 15--20 countries who are that powerful, who can push you with, "I promised you this thing, so you will promise me a vote in the Security Council."
|
||||||
|
|
||||||
|
I will not say that this is not a correct thing to do. This is human nature. Everyone wants to do their negotiation successfully. But you have to know the right moment to be nice and when to get what you want.
|
||||||
|
|
||||||
|
Rule breaking generally happens when countries are at war. However, I mainly got things done with friendship.
|
||||||
|
|
||||||
|
Let me give you an example. At the time we were working on negotiations for the Millennium Development Goals. That was before the Sustainable Development Goals. Bangladesh had several proposals for the MDGs. My ambassador told me he knew I was good in negotiation. He said: "Mosud, go and get all our proposals included the MDG list." This was a tall order! I went to some of the good friends I knew from London and told them, "Please help me to get all these things through." Happily for me, they supported me, and I got it through. My ambassador mentioned this to the Speaker of the Bangladesh National Parliament, who was also a former foreign minister and a career diplomat. The Speaker stood up and congratulated me: "You have put all of Bangladesh's demands in the MDGs." I said, "Yes, sir." He shook my hand warmly pleased by the outcome.
|
||||||
|
|
||||||
|
You can do these things through friendship and networking. I encourage the next generation of diplomats to build friendships. My advice to them would be build your network and show your charisma.
|
||||||
|
|
||||||
|
In Bangladesh we don't train two hundred diplomats at a time. We take ten to fifteen, maximum twenty, and they are the best of the best out of maybe 100,000 people---graduates from different universities. If they're not good, that's their bad luck. They will not get the best postings---nothing will happen for them. They will see in the long run that it is their own fault. If you are good, you will enjoy many things.
|
||||||
|
|
||||||
|
That's why I will say, I was given the best postings---London to begin with, then New York, during the Security Council, then ambassador to Germany, ambassador to Turkey, deputy head of mission in China. I went to Central Asia, which was very nice.
|
||||||
|
|
||||||
|
*What makes countries follow the international rules? It's not like there is a police officer that's going to put them in jail. What makes countries want to follow these norms and participate in the shared protocols?*
|
||||||
|
|
||||||
|
There is an incentive to follow the norms and uphold shared protocols. Things gain a certain clarity because of maintenance of protocol codes. You do not misread or misjudge situations. If you do not observe protocol, you will land in trouble. Others will not show respect to you because you have broken the rules. Generally, diplomats don't act on caprice and generally they will not act on their own whims to make another country upset. Even when situations between countries become hostile, terse or tense, protocol is observed. Countries diffuse situations or can improve relations by handling things on the basis of protocol requirements.
|
||||||
|
|
||||||
|
*After this career, do you have thoughts about what kinds of rules or protocols could make this international order fair?*
|
||||||
|
|
||||||
|
The world, to some extent, doesn't revolve around only protocol. It depends on whether we are fair or not. Whether we are fair or not fair will be decided by the culture you follow in your day-to-day life. If you're from the USA, a big, strong country, they have their own culture, they have their way of life, they have their wealth, and they have their might. In Russia, they have different culture and literature, a distinctive way of thinking. China is totally different. Chinese people have their own way of seeing things, their own ways of doing things.
|
||||||
|
|
||||||
|
It is not that we just need to make some protocol rules fair, and then everything will be good. You can say the world would be fairer if we had more countries on the Security Council, not just five. Out of the 194 countries we could have maybe twenty or twenty-five countries, or even fifteen. There should be more. That is one thing which can make things fairer.
|
||||||
|
|
||||||
|
But total fairness will come when we will all start appreciating each other's culture, religion, education, and characteristics, and not think about our differences. Changing our mindset will take a long time. I mean one or two centuries. Perhaps then people will not be bothered with all these things like they are today. They will think a human being is a human being. He needs this this thing just like I do. Maybe I earn more because I'm more educated---let me give you more opportunity.
|
||||||
|
|
||||||
|
We should also have a balance in population growth. It is very difficult to be really fair without taking into consideration all these things in everyday life. We have to balance all these things, and it will take time, this balancing act. We have to try to understand, have debates, and then have a peaceful world and love each other.
|
||||||
|
|
||||||
|
Protocol alone can't give you a fair world, I'm sorry to say. A fair world will not come out of diplomacy. Protocol won't ensure the stopping of all wars. Even if you stop all the wars, you may still look down on a poor person. We have to bring an end to poverty and the diseases that have spread all over many parts of the world, and the problem of narcotics. We have to take into consideration all these things, and these have nothing to do with being fair in protocol. You will not stop a powerful warlord or a drug lord through protocol, through being very kind to him. It will not do. He has to understand that he is spoiling the lives of millions. When I was a kid, how big was the world? Only 3 billion. Now it is 8 billion. We need balance. Maybe I will write a book on it when I have time and am not running around so much.
|
212
content/articles/prodromou-distributed_social_networks.md
Normal file
212
content/articles/prodromou-distributed_social_networks.md
Normal file
@ -0,0 +1,212 @@
|
|||||||
|
---
|
||||||
|
narrator: Evan Prodromou
|
||||||
|
subject: Distributed social networks
|
||||||
|
facilitator: Nathan Schneider
|
||||||
|
date: 2024-12-06
|
||||||
|
approved: 2025-04-01
|
||||||
|
summary: "A career-long journey to build online social networks that cannot be controlled by a single company, culminating with the ActivityPub standard."
|
||||||
|
location: "Montreal, Canada"
|
||||||
|
headshot: "/headshots/placeholder-headshot.png"
|
||||||
|
links:
|
||||||
|
- text: Website
|
||||||
|
url: https://evanp.me/
|
||||||
|
- text: "ActivityPub: Programming the Social Web"
|
||||||
|
url: https://www.oreilly.com/library/view/activitypub/9781098162733/
|
||||||
|
tags: [decentralization, open source, organizations, social media, software, standards]
|
||||||
|
---
|
||||||
|
|
||||||
|
*How do you introduce yourself?*
|
||||||
|
|
||||||
|
My name is Evan Prodromou, and I'm a software developer, entrepreneur, and architect from Montreal, Canada. I'm best known for my work on distributed social networks, and in other circles for wikis and AI. I have a lot of different hats.
|
||||||
|
|
||||||
|
*Let's get to know some of those hats. How would you outline the trajectory of your life and career? Where did you start and where are you now?*
|
||||||
|
|
||||||
|
I did well in school and ended up going to UC Berkeley as a physics student in the eighties. The University of California was an incredibly exciting time to be in physics---I had more Nobel laureates in my department than there were in all of the Soviet Union at the time. These were all the people who came out of the Manhattan project and were still producing great work from Lawrence Berkeley Labs and Lawrence Livermore Labs.
|
||||||
|
|
||||||
|
One of my great opportunities was working as a research assistant for Charles Townes, who won the Nobel Prize for inventing the laser. A lot of my work as a young physics student was doing software development because these older generation professors had computer-driven experimental equipment but not a lot of programming skills. I did a lot of writing code in Fortran and C to control telescopes and various material sciences machines.
|
||||||
|
|
||||||
|
When I got out of university, I started working in software development while I decided which graduate student program I would go to. It turned out that I really liked writing software and I really liked making money, and those were two things that I wasn't going to get to do as a PhD student. So I stayed in the software business.
|
||||||
|
|
||||||
|
I worked at Microsoft for about three years and then moved on to a company called Securant, which did security software. They were bought by RSA. At that point, with a little money under my mattress, I decided I would start my own business and start working on my own projects instead of working on someone else's projects.
|
||||||
|
|
||||||
|
I started a service called WikiTravel in 2003 with my wife. We were partners on that project---my wife is an information scientist who does data organization and taxonomy, so her input was really valuable on WikiTravel. It was like Wikipedia meets Lonely Planet, a worldwide travel guide built by travelers themselves sharing information with each other. By 2007 we had sold it to Internet Brands.
|
||||||
|
|
||||||
|
I was looking for my next thing to do and wondering where my life was going to go when I was invited to an event in Boston at the Free Software Foundation, the older open source organization run by Richard Stallman. They invited me and a number of other people who had been involved in Creative Commons---WikiTravel was all Free Software, all Creative Commons content---and other people who had built big network services using open standards and open-source software. They asked us to come do a big workshop and think about what we were going to do about network standards.
|
||||||
|
|
||||||
|
That was me, Aaron Swartz was there, Mike Links, Lewis Villa, and Benjamin Mako Hill. It was a really great group of people who were very enthusiastic about taking this movement around open source software, which had been about programming editors and compilers, and bringing it to network services that people use over the Internet. This was in 2007, so definitely ten years late, but still a very interesting set of people.
|
||||||
|
|
||||||
|
We put together the Franklin Street Statement---Franklin Street is where the FSF headquarters were---about how people should use network services. Use open source software, use open data, use systems that you can set up yourself and can control on your own servers. Don't use stuff that you have to be dependent on. It was a really exciting time. I came out of the meeting thinking, "Boy, I can't wait to start a new service."
|
||||||
|
|
||||||
|
This was 2008. Twitter had just launched at South by Southwest in 2007. They had been running in stealth mode among Web 2.0 digerati, and in March of 2007 they opened up to the public. I was there, and I tried it, and I was like, "Oh, I get this." About six months later, I started writing the software that would become StatusNet and started writing the code that would become Identi.ca.
|
||||||
|
|
||||||
|
This was mid-2000s, and there was this open-source inevitabilism---this sense that if you've got a word processor, we're going to make an open-source word processor that's going to be as good or better, and we're going to wipe out your business. If you've got a server operating system, we're going to make an open-source server operating system. No matter what commercial corporate organizations could make, we would undercut the value by making an open-source alternative.
|
||||||
|
|
||||||
|
*Some worked better than others.*
|
||||||
|
|
||||||
|
Yes, exactly. So I was like, "Oh boy, I'm going to be the one that makes the open-source Twitter." I started building it and shared it with this group of people who had been at this Franklin Street meeting. They were excited about it. They were working on Identi.ca, they were sharing and having conversations there.
|
||||||
|
|
||||||
|
Then we had a moment where people were starting to use the source code on their own servers, and they were like, "Well, now we're cut off from the conversation. We took the software, we're exercising this control that you say we should have, but if we move to our own servers, we're locked out."
|
||||||
|
|
||||||
|
Within about a week, I wrote the first distributed social networking protocol called OpenMicroBlogging, and it was dead simple. You could follow someone and anything they posted would get posted into your timeline. I don't think it had replies, it didn't have likes, it didn't have any rich interaction, but it was enough to make someone remote into part of your network, and that felt like it would work well enough.
|
||||||
|
|
||||||
|
There was a lot of excitement at the time in these social systems and in the software that I wrote because Twitter was having a lot of technical problems as it grew. There was real interest from the wider social networking community saying, "Hey, this open source software---anybody can install it, it can be distributed. Why are we trying to do all our work on this one server rather than using this distributed system?"
|
||||||
|
|
||||||
|
I raised venture capital in this company. The original name of the software was Laconica---like *laconic*, meaning "short text"---but we changed it to StatusNet, and that's what it was known as for most of the time period. I raised venture capital, which was first time I had done that. That was very interesting.
|
||||||
|
|
||||||
|
At the same time we were doing this, there was a lot of activity going on in other parts of what was loosely called the "open web stack." OAuth had started, based on work from teams at Flickr and Twitter. Then Google jumped in, and some of the bigger companies jumped in. That little circle of people became the Open Web Foundation, and they developed a few really interesting protocols.
|
||||||
|
|
||||||
|
Brad Fitzpatrick, who had founded LiveJournal and then was at Google at the time, created this protocol called PubSubHubbub---worst name ever. But it built on the push process that I had done with OpenMicroBlogging. He made it scalable, at Google scale, and it really got picked up. There was a point at which all the Google blogs and WordPress blogs and Tumblr had this push mechanism built in.
|
||||||
|
|
||||||
|
There was also the development of a data structure system based on RSS and Atom called ActivityStreams. It basically took the flat blog post structure of RSS, where it's a title and some text and maybe an image embedded, and they were like, "What if we added rich semantic meaning to this content?" So this item in this feed doesn't represent a blog post---it represents a like, or it represents a comment or reply. They built in this structure on top of Atom.
|
||||||
|
|
||||||
|
It also became quite popular. Facebook had an ActivityStreams feed, WordPress had it, and I think Google had it in some of their systems. The Open Web Foundation that was putting out interesting systems. WebFinger came out at this time too---having an email address identifier that you could use for different services.
|
||||||
|
|
||||||
|
StatusNet was doing well. We launched a SaaS service so you could sign up and get your own StatusNet system for like $5 a month---your own social network that would connect to all the other StatusNet social networks and Identi.ca. But we were running into some problems with OpenMicroBlogging barely working.
|
||||||
|
|
||||||
|
StatusNet included me, Brooke Vibber (who had been CTO at Wikipedia and had joined StatusNet to help us build this system), James Walker (who had been one of the core Drupal developers), and Zack Copley (who had been at StatusNet since the beginning). We were lucky to have a lot of really great open-source software developers. We put together a standard called OStatus. It was basically taking PubSubHubbub, ActivityStreams, this other comment system called Salmon, and WebFinger, and putting the glue together to make them work together as a standard.
|
||||||
|
|
||||||
|
When I say *standard* here---this is an interesting time period because there was a lot of "Hey, we made a protocol, we're sharing it with everyone, if you want to implement this, you can" without a lot of the overhead that was happening in bigger standards organizations. It was really refreshing but also turned out to be a problem for adoption because bigger corporations were like, "Hey, we have no idea who has any intellectual property in these projects, who's got patents, have you done a patent search?" It was just a bunch of engineers throwing things together.
|
||||||
|
|
||||||
|
We had two ways that our software was used. One was in enterprises---Target, Motorola, Deutsche Bank, and a number of big companies had installed our software on their internal networks for their employees. We were doing pretty well in this area, but this other company Yammer had done way better. They had a really aggressive customer acquisition strategy and they basically cleaned our clocks. They were acquired by Microsoft, and that was it for my investors. They were like, "All right, you're done. We're not going to invest more in you for this enterprise social networking stuff because clearly you've been beat."
|
||||||
|
|
||||||
|
Then, on the public side, around 2011 and 2012 is really when we saw the consolidation of social networks. I call it the big squeeze. There had been a lot of interesting social networks in the late 2000s---Hi5, Bebo, MySpace, and different regional ones in different countries. Gradually, with a huge amount of venture capital and a lot of work, the few big networks had pushed out these other ones. Twitter, Facebook, LinkedIn---they had done really good work, but they had pretty much taken over these markets.
|
||||||
|
|
||||||
|
One thing that was interesting at this time was that the success of Facebook or Twitter in these early five or six years was partly due to the fact that they were open platforms. Facebook had launched Facebook Platform in 2007, which was their API system. You could actually build software that would run in the browser on the Facebook web page---put a little widget on someone's profile that was active and would do things like show a movie or something. It was a very open platform for developers.
|
||||||
|
|
||||||
|
Similarly, Twitter's API was kind of a mistake---they used Ruby on Rails, which comes with an API built in, and they didn't turn that off. It became a huge success. People loved developing for it. They built alternative UIs, data scrapers, and all kinds of things using the APIs. That's one of the ways you can be successful in business---make a lot of other people successful. If you can make someone who built a Twitter API client dependent on that service, they're going to be advocates for your service. They're not really going to be open to other services---they're on the Twitter train.
|
||||||
|
|
||||||
|
Because of that, we had a hard time talking to people about how there could be other platforms, how you could set up your own platform and still stay connected to others. As we were getting into the early 2010s, it was like, "Why would you have another social network? There is one social network: Facebook. Or there is one microblogging network: Twitter. What's the point of having multiple ones? Why would you connect multiple ones?"
|
||||||
|
|
||||||
|
I think we kind of hit a high point in those early 2010s with Google Buzz. Google had hired a lot of the people I was talking about who were involved in the process building lightweight standards---Brad Fitzpatrick, Chris Messina, John Panzer, Joseph Smart. They had brought together a lot of people who had done interesting work in this area, and they wanted to put out the most open, open-standards, distributed system.
|
||||||
|
|
||||||
|
The way Google Buzz worked was that you could pull all your different social network presences together and then rebroadcast them through open standards. They used the same stack that we did---they were using ActivityStreams and PubSubHubbub and Salmon. We thought it was awesome. Around 2011 or 2012, engineers at the Google I/O conference did demo a three-way interaction between Google Buzz, Cliqset, and StatusNet using OStatus. They had this whole conversation happen live on stage. It was this great moment, like "Wow, this is really taking off!"
|
||||||
|
|
||||||
|
*I don't remember that---it's the dream we're still chasing, right?*
|
||||||
|
|
||||||
|
But Google Buzz had a fatal flaw. The way that they kickstarted your social graph---the number of people that you're connected to---was using your Gmail contact list. Almost immediately there started being stories about people who were like, "Wait a minute, my abusive ex-boyfriend now has access to all my social networking stuff because I had his email address in my contact list." It was just a bad example of "Hey, we're going to use this data that we've collected for you as part of this one system to kickstart this other system."
|
||||||
|
|
||||||
|
They got sued and had a multi-million-dollar settlement. It was really bad---it had nothing to do with how the software worked, it was all about this contact list integration. But at this point at Google, they're associating open standards with catastrophic failure, terrible press, and bad privacy situations.
|
||||||
|
|
||||||
|
For me, it was a bad time because we had run out of money and had no additional investors. We had a small amount of revenue coming in from the SaaS service that we were running, but it couldn't support the big free networks we were running like Identi.ca. So I had to shut down the company. I had to let go all the engineers, and I also had this huge social network, Identi.ca, that was costing like $5,000 a month---it was a very expensive process for me to keep all the servers running.
|
||||||
|
|
||||||
|
So I wrote a new software package called pump.io that was written in Node.js. The previous version had been in PHP. It basically took everything that we had learned from five years of running a social network and applied it to the new structures. So instead of using Atom, which is an XML standard, we used JSON. This was almost entirely me solo, working by myself, because I'd lost all my employees.
|
||||||
|
|
||||||
|
*Because you were paying the server costs, you wanted to enable other people to migrate off it and run their own servers?*
|
||||||
|
|
||||||
|
Partly. But also because it meant I could run my servers much more cheaply.
|
||||||
|
|
||||||
|
*It reduced the load.*
|
||||||
|
|
||||||
|
Exactly. I converted from StatusNet to pump.io and transferred StatusNet---which became GNU social---to some enthusiasts at the Free Software Foundation who were like, "We want to keep running with this." I was like, "Great, take it, go with it." Then I built this pump.io project. It turned out great---Identi.ca is still running and still uses pump.io software. It is nowhere near its peak though. It was about 5 million users; now it's probably like 500 users, maybe. It's a very small number of people.
|
||||||
|
|
||||||
|
I did this pump.io software, released it, and moved Identi.ca to it, and then kind of walked away. I had done what I intended to do, and I was like, "Hey, that dream of a distributed social network is gone. These big social networks like Twitter and Facebook are no longer one among many---they are essential infrastructure, they're part of the way that the Internet works."
|
||||||
|
|
||||||
|
*Just as they were shutting down their open APIs.*
|
||||||
|
|
||||||
|
Absolutely. At this time, Twitter had a big event called the Chirp Developer Conference, which they had been organizing for like six months---"Come to the Chirp conference, exciting stuff!" Then, just before the conference, they had a big blog post---I think it was from Ev Williams---that was like, "Hey, we're shutting down the API for all but a few uses." We were at the conference. Our software actually had a Twitter-compatible API, so we were encouraging developers to take their tools and port them to use StatusNet instead. We had some interest there, but it was mostly these folks who had become dependent on these big networks and who had been part of making them successful---they were kind of out in the cold.
|
||||||
|
|
||||||
|
That was an interesting lesson. Same thing with Facebook Platform, although it was less dramatic. They did it gradually over time, just turning off a few API endpoints at a time. They converted to this format called Open Graph, which was not as featureful as their previous API, and then they turned off the old API.
|
||||||
|
|
||||||
|
At this time, Diaspora started. Diaspora was four young men at NYU, and they decided they were going to do a distributed version of Facebook. They dropped out of school, did a Kickstarter, and raised more than $200,000, which was the second biggest Kickstarter ever at that point. And they moved to California for some reason---that was probably how they spent most of their $200,000.
|
||||||
|
|
||||||
|
They built this great service, but it wasn't compatible with our distributed social networking. Me and my team were like, "Wow, this seems like a real opportunity that went to waste---they just did a brand new protocol and didn't even work with us to have some interoperability." So we started a project called the Federated Social Web Summit, where we tried to gather everyone who was working in social web software. We put out invitations to, I think, like a hundred projects. We got like 50 projects in. Almost none of them had compatible protocols---all of them were writing their own software and writing their own protocols.
|
||||||
|
|
||||||
|
We set up the summit process so it wasn't open to the public, it was only for the developers, and you had to have working code to come and be able to demo it. It was a super success. So first of all, the Diaspora guys were like, "Oh yeah, we should probably support your protocol too," so they supported OStatus, which was awesome---just wonderful folks.
|
||||||
|
|
||||||
|
We did three iterations of that---one in Portland, one in San Francisco, and one in Berlin over three different years. So this is like 2010, 2011, and 2012, and it was a great process. We had a super valuable process. I think we got a lot of cross-pollination.
|
||||||
|
|
||||||
|
One of the things that happened is that some of the projects had been involved in the World Wide Web Consortium, and the W3C got interested in supporting this kind of work. So I joined a group at W3C---they invited me to join to do what they call an interest group, where you're thinking far ahead and exploring a new space. At the time, I had started another company called Breather, so I wasn't working on social software at all. Breather was room rental.
|
||||||
|
|
||||||
|
Let me rewind a second and talk about OpenSocial. About the time that Facebook Platform started, there were all these other social networks---again, Hi5, Bebo, Orkut. It sounds like glossolalia when I say them out loud! If you look at the Wikipedia list of social networking platforms, there are so many, and they all have silly names.
|
||||||
|
|
||||||
|
But all these other ones were like, "Hey, we have to build our own platform." The solution that they came up with was, "We can't compete with Facebook by all having our own different ways for building applications." So they built a single way for building widgets on a homepage called OpenSocial, and it covered one part of the problem. They didn't have any federation involved. The idea was if I build a zombie bite app and put it in Orkut, it should also work in Hi5.
|
||||||
|
|
||||||
|
*So it enabled developers to simultaneously develop for all these smaller networks.*
|
||||||
|
|
||||||
|
Yes---you could just build something once and then register it on all these different services.
|
||||||
|
|
||||||
|
OpenSocial was announced with great fanfare. Google led it. They had a bunch of developers doing it. Then by early 2010s, all these companies had gone out of business. What had actually happened was that enterprise social networks---at big companies like IBM and Boeing---had invested in building applications on top of this framework for their employees. When the OpenSocial organization peaked and then dropped off---I was on the board at the time---we thought, "How about we hand off all our IP, like all our standards, all our domains, off to W3C?" The W3C took it. I think partly because they had a lot of the same corporate members---IBM and Boeing were OpenSocial members, and they were W3C members, and the W3C members wanted to keep control.
|
||||||
|
|
||||||
|
Then W3C had to decide what to do with it. They asked this very active W3C employee named Harry Halpin. He was like, "I've got an idea. Let's pull together these OpenSocial folks, all these Federated Social Web folks, and Tim Berners-Lee." Tim Berners-Lee, founder of W3C, the father of the Web, was starting to get interested in social networking too, and he wanted to use his favorite technology, the Resource Description Framework or RDF, to solve social networking.
|
||||||
|
|
||||||
|
So Harry was like, "Let's bring these three groups together and make a working group at W3C," which is how you make standards. They asked Tantek Çelik---who has been doing browser standards at Microsoft, then at Mozilla, for the last twenty years---to be a co-chair. Then there was Art Barstow, who was working at IBM and had done a lot of RDF stuff. And me. So they asked the three of us to co-chair this group.
|
||||||
|
|
||||||
|
It was really interesting. The way that a group gets created at W3C is that they have to put together a charter---what is this group going to do, what's its outputs---and then they put it up for approval by the membership. And it got shot down. First of all, there were a number of big commercial social networks that were members of this group of W3C because they cared about HTML and stuff, and they were like, "No, we don't want you commodifying our business." Google at the time had been really burnt by Google Buzz, and they were like, "No way, no how---open standards toxic, do not want."
|
||||||
|
|
||||||
|
So we had to adjust this charter until these folks would sign on. I think when it came down to it, none of them said yes---they all just abstained from the vote. I think their expectation was that we were just going to face-plant, which was probably a good bet at the time.
|
||||||
|
|
||||||
|
So we started with literally zero. I was an open-source guy who had been doing open standards at this point for like six-seven years---I was probably the most experienced social network developer in that group. There was no one from Twitter, no one from Facebook, no one from Google. We had James Snell, who had worked at IBM and had done a lot of the ActivityStreams work there, but almost nobody involved were professional social networking folks.
|
||||||
|
|
||||||
|
We had a couple of people who had done open standards stuff from the Federated Social Web Summit group, and we had Tantek, who is the kind of standards guy who wants to get lots more people involved in standards. He was like, "Anybody who comes and says they're interested in being in this group, we just let them in." W3C has this whole thing where you have to be a member of a member organization or get invited by the chairs. And Tantek was like, "Let's just invite everybody." So we invited all these folks, and we had this super mixed bag of people.
|
||||||
|
|
||||||
|
We had probably three main tracks of folks involved. The first was from the track that I had been part of using ActivityStreams, using PubSubHubbub, using this OStatus stack, and then also OpenSocial, which also used a lot of the same technologies. They used ActivityStreams, they had a RESTful interface---it was at least very compatible.
|
||||||
|
|
||||||
|
We had Tantek who had been doing IndieWeb work for like a decade, which was about grassroots, amateur software developers---no standards, just a very open process. That group was like, "What is the minimal amount that we can do to support social standards?"
|
||||||
|
|
||||||
|
And then we had a third group that was led by Tim Berners-Lee, who gets a lot of weight at the W3C, as you can imagine. By this time he was *Sir* Tim Berners-Lee, and he was also participating with this whole semantic web group around him. They were like, "The only thing you need is RDF, and it'll all work, and it works perfectly. And why are we even here? We already have RDF."
|
||||||
|
|
||||||
|
I doubt any of them had ever used a social networking platform in their entire life. We were explaining things like a feed of activity, or liking something, having any kind of feedback to someone like commenting or liking or sharing, and they just couldn't handle it. They just had a very RDF-centric view of the world.
|
||||||
|
|
||||||
|
None of these folks knew what they wanted to do, so we put together this huge set of user stories---I think like 200 user stories, all these different things that you could do with social networks. Then we narrowed it down to something like 20 or 25---these are the ones that we're going to work on. And that was a fight.
|
||||||
|
|
||||||
|
Then we were opening up for potential standards, and we had these three groups who put together three different sets of standards. The IndieWeb folks put together a very light set of standards---Micropub, WebMention, a couple of other things---and they were like, "This is all we need. This is the lightest way you could possibly do social networking." And it was fine, it just wasn't as full-featured as some of the other stuff.
|
||||||
|
|
||||||
|
The people around Tim Berners-Lee put together this thing where you could publish a profile and declare like five friends or something, and they were like, "There you go, social networking." And we were like, "It doesn't do anything---what are you talking about?" And they got really upset, and they left. All of a sudden there were stories in all the major newspapers like "Tim Berners-Lee is going to solve social networking!" He started the Solid project at that time, took it out of the standards process, and got venture capital and went and built---what it's called---Inrupt. So he was off on his own.
|
||||||
|
|
||||||
|
That left the group around OStatus, and one of the people who had been a developer for pump.io, and had built some of the clients and software that worked with pump.io, was like, "Hey, I think pump.io has a great API, great federation, super nice architecture." This is Erin Shepherd. She wrote up a submission. Basically, she took the pump.io API, added some things, took out the word "pump.io," and changed how it worked just a small bit. Then she submitted it.
|
||||||
|
|
||||||
|
So we had these submissions---the RDF people had gone, so we had these two sets of submissions. One was from the IndieWeb group and then the one Erin did, which became called ActivityPump. That was the name because it took pump.io plus activities. The idea is you were pumping it out. It wasn't a great name.
|
||||||
|
|
||||||
|
*But it was also a kind of tribute to what had come before.*
|
||||||
|
|
||||||
|
We couldn't agree on any one of the models. Finally, Tantek and I sat down, and Tantek was like, "Hey, look, we can just publish all of these. Let's just go ahead and do it. That way we don't have to argue about which one's right and which one's wrong. Let's just get them out, and they'll be official W3C standards, and they're out there."
|
||||||
|
|
||||||
|
James Snell had taken the earlier versions of ActivityStreams and made a new one that was JSON-based---ActivityStreams 2.0. He had built most of it already, so we were in an editorial stage by then. It's the data structures defining what is a note, what is an article, what is an image. What does it mean to like something, to follow someone? He set up that architecture of the data structures. ActivityPump was the protocol for getting those data structures moved around.
|
||||||
|
|
||||||
|
But Erin, who submitted this proposal, was not interested in taking it any further. We had two people who had joined the group from an open-source project called MediaGoblin. It was kind of a distributed social network with a focus on images and video and things like that. They wanted to support OStatus, and I had been like, "Hey, you should come be part of this W3C thing. We're doing the next protocol after OStatus, so come help build that."
|
||||||
|
|
||||||
|
That was Christine Lemmer-Webber and Jessica Tallon, and they stepped up to edit the ActivityPump document, which was amazing. But it was their first time ever in standards world. At this point our star Tim Berners-Lee had left. We had a year and a half to two years to finish this project, and we had these two groups---the IndieWeb group and this ActivityPump group---that were not really working on the same stuff at all, with some hostility.
|
||||||
|
|
||||||
|
I know that for Christine and Jessica it was really tough. When you're doing standards, you get all these comments from folks who had nothing to do with social networking, and they had to manage it and edit this project. James Snell left about this time, so I took over ActivityStreams to get it over the finish line.
|
||||||
|
|
||||||
|
In 2016, this new project called Mastodon started. I don't know who it was---I definitely tried to point it out to them, but it may have been Christine who was like, "Look, don't use that old standard. It's got a lot of problems with it. You should use the new standard that we're almost done with."
|
||||||
|
|
||||||
|
And they did. So Eugen Rochko and a couple of other friends and collaborators built Mastodon on top of ActivityPub. We hit the end of our time period, and we had published a lot of documents, but we hadn't finished what was still called ActivityPump at the time. The W3C gave us an extension on our time to finish because Mastodon was doing so well.
|
||||||
|
|
||||||
|
I think we finished the actual spec in January 2019. We were done, and we had this popular open-source project using it. A bunch of other open-source projects started using the protocol---PeerTube for video, then Funkwhale for audio. It had a nice, lively little community happening with hundreds of thousands of people on the network. One of the last things we did with the standard was change the name from Activity Pump to ActivityPub. ActivityPump was a terrible name.
|
||||||
|
|
||||||
|
*I think both names have their virtues.*
|
||||||
|
|
||||||
|
Well, the social media space had almost a tradition of ridiculous names for a while.
|
||||||
|
|
||||||
|
Once ActivityPub was done, I set it as my goal to make Identi.ca compatible with this new standard. I had handed pump.io off to a maintainer named AJ, and they were working on it. I kind of drifted off. I worked at Wikipedia for two years and then worked for a couple of startups, and I really was not working on distributed social networking, which was such a relief, to be honest.
|
||||||
|
|
||||||
|
*Everything you've just described sounds so exhausting.*
|
||||||
|
|
||||||
|
Social networks are really hard when they're not popular, and they're hard for other reasons when they become popular. The scaling problems with social networks go up exponentially. Your resource demands grow as your number of users grow because they have more conversations, more connections. Your needs as the systems grow are way bigger, which is why so many social networks collapse.
|
||||||
|
|
||||||
|
It's a lot of time, a lot of effort. After 2013, this was no longer my full-time job. I was working at different places, I had two different startups, and I was doing this work as my second work. That's still the case to this day---I don't work professionally on ActivityPub.
|
||||||
|
|
||||||
|
Christine and, to some extent, Jessica continued at the W3C. We had this group called the Social Web Community Group, or Social CG, and it kind of picked up where the working group left off and worked on extensions and documentation and things like that, helping developers work together. But one of the things that happens when you publish a standard that takes years to get create is it becomes very fossilized, very ossified. You can add on to it, but you can't really go back and say, "Oh, it would have been better if we had done this." We had a working network of thousands of servers. If you change how it works fundamentally, half of those servers or three-quarters of those servers are going to be cut off. So you have to just do backwards-compatible changes, iterative changes rather than really big changes.
|
||||||
|
|
||||||
|
*Do you have any regrets about what is in that ossified standard?*
|
||||||
|
|
||||||
|
I don't have huge regrets. If I have any, it's that I did not help get us to a working reference implementation before I stepped back. There are some parts of the stack that were never built out. Mastodon had to define how servers authenticate each other. There was a lot of work that went into filling in the gaps in this structure that could have been done with a reference implementation instead.
|
||||||
|
|
||||||
|
Christine was co-leading the Community Group, but she had a lot of other things on her plate. And there was some really toxic behaviour in the Group. She stepped away from the W3C entirely, so by 2022, there's not really anybody with their hand on the tiller, and that's exactly the time when Elon Musk buys Twitter and people start thinking about going to other social networks. There was this flood of people onto Mastodon, and I was like, "Oh, this is great! Hey, wait a minute---what's going on? Nobody's running the store over here."
|
||||||
|
|
||||||
|
So in late 2022, early 2023, I was like, "Okay, my name is on these documents. I've access to all these GitHub repos. There are GitHub issue repositories that have like 200 un-triaged issues." And I was like, "Somebody's got to get in here. I think I'm the last person standing." So I started maintaining the spec again.
|
||||||
|
|
||||||
|
That happened about the same time that we started having meetings again. So it has really reinvigorated this organization. Now some of that stuff that was undocumented---like how you use WebFinger with ActivityPub, or how you use HTTP signatures, which is the authentication between servers---that's documented now in official documents. We're working on new kinds of social activities like geosocial---doing check-ins, saying where you are, putting things on maps---and doing groups, like having a distributed group that you can post to privately. We've done work on end-to-end encryption.
|
||||||
|
|
||||||
|
Over the last year, I wrote a book for O'Reilly, *ActivityPub: Programming for the Social Web.* I also started a nonprofit called the Social Web Foundation for encouraging use of ActivityPub. We lucked out that there has been commercial uptake with ActivityPub---Threads from Meta, as well as Flipboard, WordPress, and Ghost. The intent is to keep that rolling.
|
||||||
|
|
||||||
|
I started a cooperative Mastodon service at cosocial.ca. It's become a bigger part of my life over the last couple years than it had been for the years before.
|
||||||
|
|
||||||
|
I'm kind of a universalist---I think everyone should have access to this kind of technology and be able to make choices, stay connected to people even if they're on other social platforms. I think that one way that happens is by connecting more platforms to the network. I would love to see Snap and LinkedIn and TikTok all be connected over this space.
|
||||||
|
|
||||||
|
However, there's also this cultural underground that has built up. It's people with a mix of privacy concerns, maybe some anarcho-libertarian structures, folks who are very on that side of the political spectrum. And I don't know if it's entirely because of Christine and Jessica, who's also trans, or Erin, who's also trans---so like three of the five authors of this spec are trans women. That kernel of techie trans people became a really big, important part of the network as it exists now. They're like, "Why are you trying to bring people from outside to our Fediverse, which should be just for us?"
|
||||||
|
|
||||||
|
Being able to keep the flavor of that culture alive while still making the technology available to more people worldwide is tough, and I don't think---I have some people who get really angry at me about it. It's hard to figure out how to make sure that you can have this place that is safe and exciting and enjoyable, but at the same time make this technology available to everyone.
|
||||||
|
|
||||||
|
I don't know if I have an answer to that, or if I'm even the person who needs to have that answer. I'd like to at least make it technically possible---I'm not sure if I can be the person who preserves that culture. That might be something that others have to do.
|
@ -1,11 +1,12 @@
|
|||||||
---
|
---
|
||||||
title: "Michael Zargham: Ultimate frisbee"
|
|
||||||
narrator: Michael Zargham
|
narrator: Michael Zargham
|
||||||
subject: Ultimate frisbee
|
subject: Ultimate frisbee
|
||||||
facilitator: Nathan Schneider
|
facilitator: Nathan Schneider
|
||||||
date: 2024-11-04
|
date: 2024-11-04
|
||||||
approved: 2024-12-02
|
approved: 2024-12-02
|
||||||
summary: "As a sport often played with no referees, ultimate frisbee has developed a strong set of norms for addressing conflict and self-governing."
|
summary: "As a sport often played with no referees, ultimate frisbee has developed a strong set of norms for addressing conflict and self-governing."
|
||||||
|
location: "East Greenbush, NY USA"
|
||||||
|
headshot: "/headshots/placeholder-headshot.png"
|
||||||
tags: [frisbee, sports, organizations, dispute resolution]
|
tags: [frisbee, sports, organizations, dispute resolution]
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -93,7 +94,7 @@ In practice, what I did was almost entirely dispute resolution. The organization
|
|||||||
|
|
||||||
I spent quite a lot of time on the phone, usually reflecting what I thought were steel-manned versions of other people's positions back to each other to diffuse situations. I had to do some agenda setting, but that organization was already about 30 years old, and like my experience with frisbee at Dartmouth, there was a lot of "the way things were done" already established. It had annealed, stabilized itself.
|
I spent quite a lot of time on the phone, usually reflecting what I thought were steel-manned versions of other people's positions back to each other to diffuse situations. I had to do some agenda setting, but that organization was already about 30 years old, and like my experience with frisbee at Dartmouth, there was a lot of "the way things were done" already established. It had annealed, stabilized itself.
|
||||||
|
|
||||||
I dealt with some interesting challenges, like our relationship with the cricket club. We shared physical field space with them, and as president, I also had to sit on another board---the board of cricket and ultimate. This entity existed solely to be the container of the two organizations for dealing with city contracts because we were sharing stewardship of the field site. We had a cricket and ultimate association thing where the presidents of both boards and about four other people served as officers, just as an adapter to the city. We had a historic clubhouse, this beautiful field site, and the legal interoperability required this other board.
|
I dealt with some interesting challenges, like our relationship with the cricket club. We shared physical field space with them, and as president, I also had to sit on another board---the board of cricket and ultimate. This entity existed solely to be the container of the two organizations for dealing with city contracts because we were sharing stewardship of the field site. We had a historic clubhouse, this beautiful field site, and the legal interoperability required this other board.
|
||||||
|
|
||||||
That was a strange, bespoke artifact---suddenly being told, "Oh, you're on this other board too now, good luck!" We didn't have to do much, but we did have meetings about repairs because this building had very specific requirements around what you could do to it. We had to take care of it in certain ways.
|
That was a strange, bespoke artifact---suddenly being told, "Oh, you're on this other board too now, good luck!" We didn't have to do much, but we did have meetings about repairs because this building had very specific requirements around what you could do to it. We had to take care of it in certain ways.
|
||||||
|
|
@ -1,26 +1,105 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="{{ .Site.LanguageCode | default "en" }}">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8" />
|
<meta charset="utf-8" />
|
||||||
<title>
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
{{ .Title }}
|
|
||||||
</title>
|
{{/* Generate consistent title */}}
|
||||||
<meta name="description" content="{{ .Description }}" />
|
{{ $title := "" }}
|
||||||
|
{{ if .Params.narrator }}
|
||||||
|
{{ $title = printf "%s: %s" .Params.narrator .Params.subject }}
|
||||||
|
{{ else if .IsHome }}
|
||||||
|
{{ $title = .Title }}
|
||||||
|
{{ else }}
|
||||||
|
{{ $title = printf "%s - %s" .Title .Site.Title }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<!-- Basic SEO -->
|
||||||
|
<title>{{ $title }}</title>
|
||||||
|
|
||||||
|
{{/* Generate description from summary, description, or default site description */}}
|
||||||
|
{{ $description := "" }}
|
||||||
|
{{ with .Description }}
|
||||||
|
{{ $description = . }}
|
||||||
|
{{ else }}
|
||||||
|
{{ with .Summary }}
|
||||||
|
{{ $description = . | plainify | truncate 160 }}
|
||||||
|
{{ else }}
|
||||||
|
{{ $description = .Site.Params.description }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
<meta name="description" content="{{ $description }}" />
|
||||||
|
|
||||||
|
{{/* Generate keywords from tags */}}
|
||||||
|
{{ with .Params.tags }}
|
||||||
|
<meta name="keywords" content="{{ delimit . ", " }}" />
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<!-- Open Graph / Facebook -->
|
||||||
|
<meta property="og:type" content="{{ if .IsPage }}article{{ else }}website{{ end }}" />
|
||||||
|
<meta property="og:url" content="{{ .Permalink }}" />
|
||||||
|
<meta property="og:title" content="{{ $title }}" />
|
||||||
|
<meta property="og:description" content="{{ $description }}" />
|
||||||
|
{{ with .Params.images | default .Site.Params.images }}
|
||||||
|
<meta property="og:image" content="{{ index . 0 | absURL }}" />
|
||||||
|
{{ end }}
|
||||||
|
{{ with .Site.Params.facebookAppID }}
|
||||||
|
<meta property="fb:app_id" content="{{ . }}" />
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<!-- Twitter -->
|
||||||
|
<meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<meta name="twitter:title" content="{{ $title }}" />
|
||||||
|
<meta name="twitter:description" content="{{ $description }}" />
|
||||||
|
{{ with .Params.images }}
|
||||||
|
<meta name="twitter:image" content="{{ index . 0 | absURL }}" />
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<!-- Article Specific -->
|
||||||
|
{{ if and .IsPage (eq .Type "articles") }}
|
||||||
|
<meta property="article:published_time" content="{{ .Date.Format "2006-01-02T15:04:05Z07:00" }}" />
|
||||||
|
<meta property="article:modified_time" content="{{ .Lastmod.Format "2006-01-02T15:04:05Z07:00" }}" />
|
||||||
|
<meta property="article:section" content="Oral History" />
|
||||||
|
{{ with .Params.tags }}
|
||||||
|
{{ range . }}
|
||||||
|
<meta property="article:tag" content="{{ . }}" />
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
{{/* Author information using standard meta tags instead of article:author */}}
|
||||||
|
{{ with .Params.narrator }}
|
||||||
|
<meta name="author" content="{{ . }}" />
|
||||||
|
{{ end }}
|
||||||
|
{{ with .Params.facilitator }}
|
||||||
|
<meta name="interviewer" content="{{ . }}" />
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
|
<!-- Canonical URL -->
|
||||||
|
<link rel="canonical" href="{{ .Permalink }}" />
|
||||||
|
|
||||||
|
<!-- CSS Variables and Styles -->
|
||||||
{{ partial "css-variables.html" . }}
|
{{ partial "css-variables.html" . }}
|
||||||
{{/* styles */}}
|
|
||||||
{{ $options := dict "inlineImports" true }}
|
{{/* Main Styles */}}
|
||||||
{{ $styles := resources.Get "css/styles.css" }}
|
{{ $styles := resources.Get "scss/main.scss" }}
|
||||||
{{ $styles = $styles | resources.PostCSS $options }}
|
{{ $styles = $styles | resources.ToCSS (dict "targetPath" "css/styles.css" "enableSourceMap" true) }}
|
||||||
|
{{ $styles = $styles | resources.PostCSS }}
|
||||||
|
|
||||||
{{ if hugo.IsProduction }}
|
{{ if hugo.IsProduction }}
|
||||||
{{ $styles = $styles | minify | fingerprint | resources.PostProcess }}
|
{{ $styles = $styles | minify | fingerprint | resources.PostProcess }}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
<link href="{{ $styles.RelPermalink }}" rel="stylesheet" />
|
<link href="{{ $styles.RelPermalink }}" rel="stylesheet" />
|
||||||
<link href="/css/wompum.css" rel="stylesheet" />
|
|
||||||
</head>
|
</head>
|
||||||
<body class="">
|
<body class="">
|
||||||
{{ partial "header.html" . }}
|
{{ partial "header.html" . }}
|
||||||
<div class="container px-4 lg:mx-auto my-10">
|
<div class="px-4 lg:mx-auto">
|
||||||
{{ block "main" . }}{{ end }}
|
{{ block "main" . }}{{ end }}
|
||||||
</div>
|
</div>
|
||||||
|
<script src="/js/sigil.js"></script>
|
||||||
|
<script src="/js/colorCalculator.js"></script>
|
||||||
|
<script src="/js/wompum.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,18 +1,17 @@
|
|||||||
{{ define "main" }}
|
{{ define "main" }}
|
||||||
|
<article class="single-default">
|
||||||
<article class="flex flex-col lg:flex-row-reverse">
|
<header class="mb-4">{{ partial "article-wompum.html" . }}</header>
|
||||||
<header class="lg:sticky lg:top-0 lg:h-screen lg:overflow-y-auto lg:w-1/3 p-4">
|
|
||||||
<h1 class="font-bold">{{ .Title }}</h1>
|
<div class="prose lg:prose-xl p-4 mx-auto">
|
||||||
<p><strong>Date:</strong> <time datetime="{{ .Date.Format "2006-01-02" }}">{{ .Date.Format "January 2, 2006" }}</time></p>
|
|
||||||
<p><strong>Narrator:</strong> {{ .Params.narrator }}</p>
|
|
||||||
<p><strong>Facilitator:</strong> {{ .Params.facilitator }}</p>
|
|
||||||
<p><strong>Subject:</strong> {{ .Params.subject }}</p>
|
|
||||||
<p><strong>Tags:</strong> {{ partial "tags.html" . }}</p>
|
|
||||||
</header>
|
|
||||||
<div class="prose lg:prose-xl lg:w-2/3 p-4">
|
|
||||||
{{ partial "article-wompum.html" . }}
|
|
||||||
<p class="font-bold text-4xl">{{ .Title }}</p>
|
<p class="font-bold text-4xl">{{ .Title }}</p>
|
||||||
{{ .Content }}
|
{{ .Content }}
|
||||||
|
|
||||||
|
{{/* Check for additional partials to include */}}
|
||||||
|
{{ with .Params.include_partials }}
|
||||||
|
{{ range . }}
|
||||||
|
{{ partial . $ }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
{{ end }}
|
{{ end }}
|
@ -1,14 +1,28 @@
|
|||||||
{{ define "main" }}
|
{{ define "main" }}
|
||||||
<h1 class="text-2xl font-bold">Topic: {{ .Title }}</h1>
|
<header class="my-8">
|
||||||
<ul class="mt-4 space-y-4">
|
<p class="text-center font-iosevka capitalize">{{ .Data.Singular }}</p>
|
||||||
{{ range .Data.Pages }}
|
<h1 class="text-4xl font-bold text-center capitalize">{{ .Title }}</h1>
|
||||||
<li class="border-l border-gray-300 pl-4">
|
</header>
|
||||||
<p class="text-xs text-gray-800"><time datetime="{{ .Date.Format " 2006-01-02" }}">{{ .Date.Format "January 2, 2006"
|
<main class="container mx-auto">
|
||||||
}}</time></p>
|
<ul class="mt-4 space-y-4">
|
||||||
<a class="font-bold hover:text-green-900 underline" href="{{ .RelPermalink }}">{{ .Title }}</a>
|
{{ partial "article-list.html" (dict "Pages" .Data.Pages) }}
|
||||||
<p class="text-sm">{{ .Params.summary }}</p>
|
</ul>
|
||||||
{{ partial "tags.html" .}}
|
|
||||||
</li>
|
<section>
|
||||||
{{ end }}
|
<h2 class="text-4xl my-8 font-bold text-center">Other {{ .Data.Plural | title }}</h2>
|
||||||
</ul>
|
<div class="tag-cloud font-iosevka text-gray-600 text-center">
|
||||||
|
{{ $terms := index .Site.Taxonomies .Data.Plural }}
|
||||||
|
{{ range $term, $pages := $terms }}
|
||||||
|
{{ if ne $term $.Title }}
|
||||||
|
{{ with $.Site.GetPage (printf "/%s/%s" $.Data.Plural ($term | urlize)) }}
|
||||||
|
<a href="{{ .RelPermalink }}"
|
||||||
|
class="tag inline-block p-2 my-1 border border-gray-100 rounded-lg hover:bg-yellow-100 whitespace-nowrap">
|
||||||
|
{{ .Title }}
|
||||||
|
</a>
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
{{ end }}
|
{{ end }}
|
44
layouts/articles/single.html
Normal file
44
layouts/articles/single.html
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
{{ define "main" }}
|
||||||
|
|
||||||
|
<article class="single-article">
|
||||||
|
|
||||||
|
<header class="mb-4">{{ partial "article-wompum.html" . }}</header>
|
||||||
|
|
||||||
|
<div class="flex gap-4">
|
||||||
|
<aside class="lg:sticky lg:top-0 lg:h-screen lg:overflow-y-auto lg:w-1/3 p-4 font-iosevka">
|
||||||
|
{{ if .Params.headshot }}
|
||||||
|
<div class="narrator__container w-48 mb-2" data-text="{{ .Params.narrator }}">
|
||||||
|
<div class="narrator__frame">
|
||||||
|
<img src="{{ .Params.headshot }}" alt="Photo of {{ .Params.narrator }}" class="narrator__image" loading="lazy">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
<p><strong>Date:</strong> <time datetime="{{ .Date.Format " 2006-01-02" }}">{{ .Date.Format "January 2, 2006" }}</time></p>
|
||||||
|
<p><strong>Narrator:</strong> <a href="{{ "/narrator/" | relLangURL }}{{ .Params.narrator | urlize }}">{{ .Params.narrator }}</a></p>
|
||||||
|
<p><strong>Facilitator:</strong> <a href="{{ "/facilitator/" | relLangURL }}{{ .Params.facilitator | urlize }}">{{ .Params.facilitator }}</a></p>
|
||||||
|
<p><strong>Subject:</strong> {{ .Params.subject }}</p>
|
||||||
|
<p><strong>Topics:</strong> {{ partial "tags.html" . }}</p>
|
||||||
|
{{ if .Params.links }}
|
||||||
|
<div class="mt-4">
|
||||||
|
<p><strong>Narrator Links:</strong></p>
|
||||||
|
<ul class="list-disc pl-4 ml-4 mt-2">
|
||||||
|
{{ range .Params.links }}
|
||||||
|
<li class="mb-2">
|
||||||
|
<a href="{{ .url }}" target="_blank" rel="noopener noreferrer">{{ .text }} <sup>↗</sup></a>
|
||||||
|
</li>
|
||||||
|
{{ end }}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
</aside>
|
||||||
|
<div class="prose lg:prose-xl lg:w-2/3 p-4">
|
||||||
|
<p class="font-bold text-4xl">{{ partial "article-title" . }}</p>
|
||||||
|
{{ .Content }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
|
<aside class="max-w-screen-xl mx-auto px-4 lg:px-0">
|
||||||
|
{{ partial "related-articles" (dict "page" . "tags" .Params.tags "limit" 3) }}
|
||||||
|
</aside>
|
||||||
|
<div class="text-center my-12"><a href="/">Go Home</a></div>
|
||||||
|
{{ end }}
|
@ -1,22 +1,29 @@
|
|||||||
{{ define "main" }}
|
{{ define "main" }}
|
||||||
<main>
|
<main class="flex gap-4 lg:gap-16 justify-around mt-8 max-w-screen-xl mx-auto px-4 lg:px-0">
|
||||||
<h1 class="text-4xl font-bold">Protocol Oral History Project</h1>
|
<ul class="flex flex-col gap-4 w-full">
|
||||||
|
{{ partial "article-list.html" (dict "Pages" (where .Site.RegularPages "Section" "articles")) }}
|
||||||
<ul class="flex flex-col gap-4 my-4">
|
|
||||||
{{ range where .Site.RegularPages "Section" "oral-histories" }}
|
|
||||||
<li class="border-l border-gray-300 pl-4">
|
|
||||||
{{ partial "article-wompum.html" . }}
|
|
||||||
<p class="text-xs text-gray-800"><time datetime="{{ .Date.Format " 2006-01-02" }}">{{ .Date.Format "January 2, 2006" }}</time></p>
|
|
||||||
<a class="font-bold hover:text-green-900 underline" href="{{ .RelPermalink }}">{{ .Title }}</a>
|
|
||||||
<p class="text-sm">{{ .Params.summary }}</p>
|
|
||||||
{{ partial "tags.html" .}}
|
|
||||||
</li>
|
|
||||||
{{ end }}
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<article class="prose lg:prose-xl">
|
<aside class="max-w-prose w-1/4 flex flex-col gap-8 mb-8">
|
||||||
<h2 class="text-4xl">{{ .Title }}</h2>
|
|
||||||
{{ .Content }}
|
<section>
|
||||||
</article>
|
<h2 class="text-2xl mb-4 font-bold">About</h2>
|
||||||
|
{{ .Content }}
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2 class="text-2xl mb-4 font-bold">Topics</h2>
|
||||||
|
<div class="tag-cloud font-iosevka text-gray-600 text-sm">
|
||||||
|
{{ $tags := .Site.Taxonomies.tags }}
|
||||||
|
{{ range $tag, $pages := $tags }}
|
||||||
|
<a href="{{ "/tags/" | relLangURL }}{{ $tag | urlize }}" style="font-size: {{ add 1 (div (len $pages) 2) }}em;" data-count="{{ len $pages}}"
|
||||||
|
class="tag inline-block p-2 my-1 border border-gray-100 rounded-lg hover:bg-yellow-100 whitespace-nowrap">
|
||||||
|
{{ $tag }}
|
||||||
|
</a>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
</aside>
|
||||||
</main>
|
</main>
|
||||||
{{ end }}
|
{{ end }}
|
20
layouts/partials/article-list.html
Normal file
20
layouts/partials/article-list.html
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
{{ $pages := .Pages }}
|
||||||
|
{{ range $pages }}
|
||||||
|
{{- $page := . -}}
|
||||||
|
{{- if reflect.IsMap . -}}
|
||||||
|
{{- $page = .page -}}
|
||||||
|
{{- end -}}
|
||||||
|
<li class="flex gap-4 items-center">
|
||||||
|
<a class="flex-1 min-w-0" href="{{ $page.RelPermalink }}">{{ partial "article-wompum.html" $page }}</a>
|
||||||
|
<time class="text-gray-800 font-iosevka w-12 flex-shrink-0" datetime="{{ $page.Date.Format "2006-01-02" }}">
|
||||||
|
<p>{{ $page.Date.Format "Jan" }}</p>
|
||||||
|
<p>{{ $page.Date.Format "02" }}</p>
|
||||||
|
<p>{{ $page.Date.Format "2006" }}</p>
|
||||||
|
</time>
|
||||||
|
<div class="w-3/5 flex-shrink-0">
|
||||||
|
<a class="text-2xl font-bold hover:text-green-900 underline" href="{{ $page.RelPermalink }}">{{ partial "article-title" $page }}</a>
|
||||||
|
<p class="max-w-prose">{{ $page.Params.summary }}</p>
|
||||||
|
{{ partial "tags.html" $page }}
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
{{ end }}
|
3
layouts/partials/article-title.html
Normal file
3
layouts/partials/article-title.html
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{{- if and .Params.narrator .Params.subject -}}
|
||||||
|
<span class="artile__title-narrator font-iosevka">{{- .Params.narrator }}</span>: <span class="artile__title-subject">{{ .Params.subject -}}</span>
|
||||||
|
{{- end -}}
|
@ -1,12 +1,7 @@
|
|||||||
<div class="wompum-container">
|
<div class="wompum-container">
|
||||||
<div class="wompum-grid"
|
<div class="wompum-article-grid"
|
||||||
data-metadata="{{ jsonify .Params }}"
|
data-metadata="{{ dict "narrator" .Params.narrator "subject" .Params.subject "facilitator" .Params.facilitator | jsonify }}"
|
||||||
>
|
data-columns="7"
|
||||||
<!-- Grid will be populated by JavaScript -->
|
data-rows="5">
|
||||||
<!-- 7x5 = 35 cells total -->
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script src="/js/sigil.js"></script>
|
|
||||||
<script src="/js/colorCalculator.js"></script>
|
|
||||||
<script src="/js/wompum.js"></script>
|
|
||||||
|
20
layouts/partials/facilitator-list.html
Normal file
20
layouts/partials/facilitator-list.html
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<section>
|
||||||
|
<h2 class="text-4xl mb-4">Facilitators</h2>
|
||||||
|
<div class="tag-cloud font-iosevka text-gray-600">
|
||||||
|
{{ $facilitators := slice }}
|
||||||
|
{{ range .Site.RegularPages }}
|
||||||
|
{{ with .Params.facilitator }}
|
||||||
|
{{ $facilitators = $facilitators | append . }}
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
||||||
|
{{ $facilitators = $facilitators | uniq | sort }}
|
||||||
|
{{ range $facilitator := $facilitators }}
|
||||||
|
<a href="{{ "/facilitator/" | relLangURL }}{{ $facilitator | urlize }}"
|
||||||
|
class="tag inline-block p-2 my-1 border border-gray-100 rounded-lg hover:bg-yellow-100 whitespace-nowrap"
|
||||||
|
style="font-size: 1rem;">
|
||||||
|
{{ $facilitator }}
|
||||||
|
</a>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
@ -1,13 +1,25 @@
|
|||||||
<!-- basic header partial in hugo with just home and about -->
|
<!-- basic header partial in hugo with just home and about -->
|
||||||
<header class="p-4">
|
<header class="flex flex-col mb-4">
|
||||||
<nav>
|
<div class="flex justify-between items-center p-4">
|
||||||
<ul class="flex gap-4">
|
<h1 class="text-2xl font-bold">
|
||||||
<li>
|
<a href="/">{{ .Site.Title }}</a>
|
||||||
<a href="/" class="hover:text-blue-700">Home</a>
|
</h1>
|
||||||
</li>
|
<nav class="font-iosevka">
|
||||||
<li>
|
<ul class="flex gap-4">
|
||||||
<a href="/about" class="hover:text-blue-700">About</a>
|
<li>
|
||||||
</li>
|
<a href="/" class="hover:text-blue-700">Home</a>
|
||||||
</ul>
|
</li>
|
||||||
</nav>
|
<li>
|
||||||
|
<a href="/about" class="hover:text-blue-700">About</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
<div class="wompum-container">
|
||||||
|
<div class="wompum-grid h-2"
|
||||||
|
data-text="{{ .Site.Title }}"
|
||||||
|
data-columns="7"
|
||||||
|
data-rows="1">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
37
layouts/partials/related-articles.html
Normal file
37
layouts/partials/related-articles.html
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
{{- $tags := .tags -}}
|
||||||
|
{{- $limit := default 3 .limit -}}
|
||||||
|
{{- $currentPath := .page.RelPermalink -}}
|
||||||
|
|
||||||
|
{{- $related := where (where site.RegularPages "Type" "articles") "RelPermalink" "!=" $currentPath -}}
|
||||||
|
{{- $matchingArticles := slice -}}
|
||||||
|
|
||||||
|
{{/* First try to find articles with matching tags */}}
|
||||||
|
{{- range $related -}}
|
||||||
|
{{- $matches := 0 -}}
|
||||||
|
{{- range .Params.tags -}}
|
||||||
|
{{- if in $tags . -}}
|
||||||
|
{{- $matches = add $matches 1 -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- if gt $matches 0 -}}
|
||||||
|
{{- $matchingArticles = $matchingArticles | append (dict "page" . "matches" $matches) -}}
|
||||||
|
{{- end -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{/* If we found matching articles, sort by number of matching tags */}}
|
||||||
|
{{- $finalArticles := slice -}}
|
||||||
|
{{- if gt (len $matchingArticles) 0 -}}
|
||||||
|
{{- $finalArticles = first $limit (sort $matchingArticles "matches" "desc") -}}
|
||||||
|
{{- else -}}
|
||||||
|
{{/* Fallback to showing other articles sorted by date */}}
|
||||||
|
{{- $finalArticles = first $limit (sort $related "Date" "desc") -}}
|
||||||
|
{{- end -}}
|
||||||
|
|
||||||
|
{{- if gt (len $finalArticles) 0 -}}
|
||||||
|
<div class="related-articles flex flex-col gap-4">
|
||||||
|
<h2 class="title text-3xl font-bold">Related Articles</h2>
|
||||||
|
<ul class="flex flex-col gap-4 w-full">
|
||||||
|
{{ partial "article-list" (dict "Pages" $finalArticles) }}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
{{- end -}}
|
@ -1,8 +1,8 @@
|
|||||||
{{- if .Params.tags }}
|
{{- if .Params.tags }}
|
||||||
<div class="flex flex-wrap gap-2 my-2 text-xs">
|
<div class="flex flex-wrap gap-2 my-2 text-xs font-iosevka">
|
||||||
{{- range .Params.tags }}
|
{{- range .Params.tags }}
|
||||||
<a href="{{ "tags/" | relURL }}{{ . | urlize }}"
|
<a href="{{ "tags/" | relURL }}{{ . | urlize }}"
|
||||||
class="px-3 py-1 bg-green-100 hover:bg-green-300 rounded no-underline">
|
class="px-3 py-1 border border-green-100 hover:bg-green-300 text-green-900 rounded no-underline">
|
||||||
{{ . }}
|
{{ . }}
|
||||||
</a>
|
</a>
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
85
layouts/partials/wompum-demo.html
Normal file
85
layouts/partials/wompum-demo.html
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
<div class="wompum-demo max-w-2xl mx-auto">
|
||||||
|
<h2 class="text-2xl font-bold mb-4">Wompum Grid Protocol</h2>
|
||||||
|
|
||||||
|
<p>We use a protocol to generate the colorful wompum style grid for articles and other places around the site, learn how it works here.</p>
|
||||||
|
|
||||||
|
<div class="mb-8 font-iosevka">
|
||||||
|
<label class="block mb-2">Enter text to generate a grid:</label>
|
||||||
|
<input type="text"
|
||||||
|
class="w-full p-2 border rounded"
|
||||||
|
placeholder="Type something..."
|
||||||
|
oninput="updateWompumDemo(this.value)">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>First we generate a sigil by removing spaces, turning to lowercase, removing anything that isn't a consonant, removing repeat letters, find the unicode character number, and finally get the digital root of those numbers. From there the sigil digits are used to choose a color from our pallet.</p>
|
||||||
|
|
||||||
|
<div class="transformation-steps space-y-4 mb-8 font-iosevka">
|
||||||
|
<div>
|
||||||
|
<span class="font-bold">Original Text:</span>
|
||||||
|
<span class="text-input-display"></span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-bold">Lowercase:</span>
|
||||||
|
<span class="text-cleaned-display"></span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-bold">Consonants only:</span>
|
||||||
|
<span class="text-consonants-display"></span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-bold">Unique consonants:</span>
|
||||||
|
<span class="text-unique-display"></span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-bold">Letters to numbers:</span>
|
||||||
|
<span class="text-sigil-numbers"></span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-bold">Digital root:</span>
|
||||||
|
<span class="text-sigil-root"></span>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="font-bold">The final grid:</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="wompum-container h-48 mb-8">
|
||||||
|
<div class="wompum-grid h-full"
|
||||||
|
data-text=""
|
||||||
|
data-columns="5"
|
||||||
|
data-rows="3">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function updateWompumDemo(text) {
|
||||||
|
// Update displays
|
||||||
|
document.querySelector('.text-input-display').textContent = text;
|
||||||
|
document.querySelector('.text-cleaned-display').textContent = text.toLowerCase().replace(/[^a-z]/g, '');
|
||||||
|
document.querySelector('.text-consonants-display').textContent = text.toLowerCase().replace(/[^a-z]/g, '').replace(/[aeiou]/g, '');
|
||||||
|
|
||||||
|
const uniqueConsonants = [...new Set(text.toLowerCase().replace(/[^a-z]/g, '').replace(/[aeiou]/g, ''))].join('');
|
||||||
|
document.querySelector('.text-unique-display').textContent = uniqueConsonants;
|
||||||
|
|
||||||
|
// Show character to number conversion
|
||||||
|
const charNumbers = [...uniqueConsonants].map(char => char.charCodeAt(0)).join(', ');
|
||||||
|
document.querySelector('.text-sigil-numbers').textContent = charNumbers;
|
||||||
|
|
||||||
|
// Show digital root calculation
|
||||||
|
const sigilArray = Sigil.generate(text);
|
||||||
|
document.querySelector('.text-sigil-root').textContent = sigilArray.join(', ');
|
||||||
|
|
||||||
|
// Update grid
|
||||||
|
const grid = document.querySelector('.wompum-demo .wompum-grid');
|
||||||
|
grid.dataset.text = text;
|
||||||
|
|
||||||
|
// Remove existing grid
|
||||||
|
while (grid.firstChild) {
|
||||||
|
grid.firstChild.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reinitialize grid
|
||||||
|
new WompumGrid(grid).init();
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</div>
|
1
layouts/shortcodes/i.html
Normal file
1
layouts/shortcodes/i.html
Normal file
@ -0,0 +1 @@
|
|||||||
|
<p class="interviewer-question">{{ .Inner }}</p>
|
5
package-lock.json
generated
5
package-lock.json
generated
@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"name": "oral-history-project",
|
"name": "protocol-oral-history-project",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "oral-history-project",
|
"name": "protocol-oral-history-project",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@tailwindcss/typography": "^0.4.1",
|
"@tailwindcss/typography": "^0.4.1",
|
||||||
@ -1258,6 +1258,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-8.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-8.3.1.tgz",
|
||||||
"integrity": "sha512-leHXsQRq89S3JC9zw/tKyiVV2jAhnfQe0J8VI4eQQbUjwIe0XxVqLrR+7UsahF1s9wi4GlqP6SJ8ydf44cgF2Q==",
|
"integrity": "sha512-leHXsQRq89S3JC9zw/tKyiVV2jAhnfQe0J8VI4eQQbUjwIe0XxVqLrR+7UsahF1s9wi4GlqP6SJ8ydf44cgF2Q==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chalk": "^4.0.0",
|
"chalk": "^4.0.0",
|
||||||
"chokidar": "^3.3.0",
|
"chokidar": "^3.3.0",
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
"tailwindcss": "hugo-starter-tailwind-basic"
|
"tailwindcss": "hugo-starter-tailwind-basic"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"dependencies": {},
|
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@tailwindcss/typography": "^0.4.1",
|
"@tailwindcss/typography": "^0.4.1",
|
||||||
"autoprefixer": "^10.3.1",
|
"autoprefixer": "^10.3.1",
|
||||||
@ -19,6 +18,10 @@
|
|||||||
"postcss-purgecss": "^2.0.3",
|
"postcss-purgecss": "^2.0.3",
|
||||||
"tailwindcss": "^2.2.7"
|
"tailwindcss": "^2.2.7"
|
||||||
},
|
},
|
||||||
|
"scripts": {
|
||||||
|
"build:css": "postcss assets/css/tailwind.css -o static/css/tailwind.css",
|
||||||
|
"watch:css": "postcss assets/css/tailwind.css -o static/css/tailwind.css --watch"
|
||||||
|
},
|
||||||
"name": "protocol-oral-history-project",
|
"name": "protocol-oral-history-project",
|
||||||
"version": "0.1.0"
|
"version": "0.1.0"
|
||||||
}
|
}
|
||||||
|
6
postcss.config.js
Normal file
6
postcss.config.js
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
module.exports = {
|
||||||
|
plugins: {
|
||||||
|
tailwindcss: {},
|
||||||
|
autoprefixer: {},
|
||||||
|
},
|
||||||
|
};
|
@ -1,30 +0,0 @@
|
|||||||
.wompum-container {
|
|
||||||
width: 100%;
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.wompum-grid {
|
|
||||||
display: grid;
|
|
||||||
gap: 0;
|
|
||||||
padding: 0;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.wompum-cell {
|
|
||||||
width: 100%;
|
|
||||||
min-height: 30px; /* Minimum height for cells */
|
|
||||||
background-color: var(--sand-500);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create pseudo-random pattern using prime numbers */
|
|
||||||
.wompum-cell:nth-child(7n+1) {
|
|
||||||
background-color: var(--sand-100);
|
|
||||||
}
|
|
||||||
|
|
||||||
.wompum-cell:nth-child(5n+2) {
|
|
||||||
background-color: var(--sand-900);
|
|
||||||
}
|
|
||||||
|
|
||||||
.wompum-cell:nth-child(11n+3) {
|
|
||||||
background-color: var(--sand-500);
|
|
||||||
}
|
|
BIN
static/fonts/EBGaramond12-Italic.woff
Normal file
BIN
static/fonts/EBGaramond12-Italic.woff
Normal file
Binary file not shown.
BIN
static/fonts/EBGaramond12-Italic.woff2
Normal file
BIN
static/fonts/EBGaramond12-Italic.woff2
Normal file
Binary file not shown.
BIN
static/fonts/EBGaramond12-Regular.woff
Normal file
BIN
static/fonts/EBGaramond12-Regular.woff
Normal file
Binary file not shown.
BIN
static/fonts/EBGaramond12-Regular.woff2
Normal file
BIN
static/fonts/EBGaramond12-Regular.woff2
Normal file
Binary file not shown.
BIN
static/fonts/Iosevka-Bold-Italic.woff
Normal file
BIN
static/fonts/Iosevka-Bold-Italic.woff
Normal file
Binary file not shown.
BIN
static/fonts/Iosevka-Bold-Italic.woff2
Normal file
BIN
static/fonts/Iosevka-Bold-Italic.woff2
Normal file
Binary file not shown.
BIN
static/fonts/Iosevka-Bold.woff
Normal file
BIN
static/fonts/Iosevka-Bold.woff
Normal file
Binary file not shown.
BIN
static/fonts/Iosevka-Bold.woff2
Normal file
BIN
static/fonts/Iosevka-Bold.woff2
Normal file
Binary file not shown.
BIN
static/fonts/Iosevka-Light-Italic.woff
Normal file
BIN
static/fonts/Iosevka-Light-Italic.woff
Normal file
Binary file not shown.
BIN
static/fonts/Iosevka-Light-Italic.woff2
Normal file
BIN
static/fonts/Iosevka-Light-Italic.woff2
Normal file
Binary file not shown.
BIN
static/fonts/Iosevka-Light.woff
Normal file
BIN
static/fonts/Iosevka-Light.woff
Normal file
Binary file not shown.
BIN
static/fonts/Iosevka-Light.woff2
Normal file
BIN
static/fonts/Iosevka-Light.woff2
Normal file
Binary file not shown.
BIN
static/fonts/Iosevka-Oblique.woff
Normal file
BIN
static/fonts/Iosevka-Oblique.woff
Normal file
Binary file not shown.
BIN
static/fonts/Iosevka-Oblique.woff2
Normal file
BIN
static/fonts/Iosevka-Oblique.woff2
Normal file
Binary file not shown.
BIN
static/fonts/Iosevka.woff
Normal file
BIN
static/fonts/Iosevka.woff
Normal file
Binary file not shown.
BIN
static/fonts/Iosevka.woff2
Normal file
BIN
static/fonts/Iosevka.woff2
Normal file
Binary file not shown.
BIN
static/headshots/placeholder-headshot.png
Normal file
BIN
static/headshots/placeholder-headshot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.9 MiB |
BIN
static/images/default-og.jpg
Normal file
BIN
static/images/default-og.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 66 KiB |
@ -1,7 +1,6 @@
|
|||||||
class WompumGrid {
|
class WompumGrid {
|
||||||
constructor(element, metadata) {
|
constructor(element) {
|
||||||
this.gridElement = element;
|
this.gridElement = element;
|
||||||
this.metadata = metadata;
|
|
||||||
this.gridSize = {
|
this.gridSize = {
|
||||||
columns: parseInt(element.dataset.columns) || 7,
|
columns: parseInt(element.dataset.columns) || 7,
|
||||||
rows: parseInt(element.dataset.rows) || 5
|
rows: parseInt(element.dataset.rows) || 5
|
||||||
@ -10,27 +9,19 @@ class WompumGrid {
|
|||||||
// Set grid template columns based on data attribute or default
|
// Set grid template columns based on data attribute or default
|
||||||
this.gridElement.style.gridTemplateColumns = `repeat(${this.gridSize.columns}, 1fr)`;
|
this.gridElement.style.gridTemplateColumns = `repeat(${this.gridSize.columns}, 1fr)`;
|
||||||
|
|
||||||
// Generate sigils for each metadata component
|
|
||||||
this.sigils = {
|
|
||||||
narrator: Sigil.generate(metadata.narrator),
|
|
||||||
subject: Sigil.generate(metadata.subject),
|
|
||||||
facilitator: Sigil.generate(metadata.facilitator)
|
|
||||||
};
|
|
||||||
|
|
||||||
// Initialize color calculator
|
// Initialize color calculator
|
||||||
this.colorCalculator = new ColorCalculator();
|
this.colorCalculator = new ColorCalculator();
|
||||||
|
|
||||||
// Store sigils as data attributes for future use
|
// Generate sigil from text content if provided
|
||||||
this.gridElement.dataset.narratorSigil = JSON.stringify(this.sigils.narrator);
|
const text = element.dataset.text || '';
|
||||||
this.gridElement.dataset.subjectSigil = JSON.stringify(this.sigils.subject);
|
this.sigil = Sigil.generate(text);
|
||||||
this.gridElement.dataset.facilitatorSigil = JSON.stringify(this.sigils.facilitator);
|
this.gridElement.dataset.sigil = JSON.stringify(this.sigil);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get sigil digit for a cell based on its section and position
|
// Get sigil digit for a cell based on its position
|
||||||
getSigilDigit(section, position) {
|
getSigilDigit(position) {
|
||||||
const sigil = this.sigils[section];
|
if (!this.sigil || !this.sigil.length) return 0;
|
||||||
if (!sigil || !sigil.length) return 0;
|
return this.sigil[position % this.sigil.length];
|
||||||
return sigil[position % sigil.length];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get influences from adjacent cells
|
// Get influences from adjacent cells
|
||||||
@ -60,18 +51,35 @@ class WompumGrid {
|
|||||||
return influences;
|
return influences;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply metadata-based design to the grid
|
// Create basic grid cells
|
||||||
|
createGrid() {
|
||||||
|
const totalCells = this.gridSize.columns * this.gridSize.rows;
|
||||||
|
|
||||||
|
for (let i = 0; i < totalCells; i++) {
|
||||||
|
const cell = document.createElement('div');
|
||||||
|
const column = i % this.gridSize.columns;
|
||||||
|
const row = Math.floor(i / this.gridSize.columns);
|
||||||
|
|
||||||
|
cell.className = 'wompum-cell';
|
||||||
|
cell.setAttribute('data-cell-index', i);
|
||||||
|
cell.setAttribute('data-column', column);
|
||||||
|
cell.setAttribute('data-row', row);
|
||||||
|
|
||||||
|
// Set sigil digit based on cell position
|
||||||
|
const sigilDigit = this.getSigilDigit(i);
|
||||||
|
cell.setAttribute('data-sigil-digit', sigilDigit);
|
||||||
|
|
||||||
|
this.gridElement.appendChild(cell);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
applyMetadataDesign() {
|
applyMetadataDesign() {
|
||||||
const cells = this.gridElement.querySelectorAll('.wompum-cell');
|
const cells = this.gridElement.querySelectorAll('.wompum-cell');
|
||||||
|
|
||||||
cells.forEach(cell => {
|
cells.forEach(cell => {
|
||||||
const section = cell.dataset.section;
|
|
||||||
const column = parseInt(cell.dataset.column);
|
const column = parseInt(cell.dataset.column);
|
||||||
const row = parseInt(cell.dataset.row);
|
const row = parseInt(cell.dataset.row);
|
||||||
|
const sigilDigit = parseInt(cell.dataset.sigilDigit);
|
||||||
// Get sigil digit for this cell
|
|
||||||
const sigilDigit = this.getSigilDigit(section, row);
|
|
||||||
cell.dataset.sigilDigit = sigilDigit;
|
|
||||||
|
|
||||||
// Get influences from adjacent cells
|
// Get influences from adjacent cells
|
||||||
const influences = this.getInfluences(column, row);
|
const influences = this.getInfluences(column, row);
|
||||||
@ -82,40 +90,51 @@ class WompumGrid {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize the grid
|
|
||||||
init() {
|
init() {
|
||||||
if (!this.gridElement) return;
|
if (!this.gridElement) return;
|
||||||
this.createGrid();
|
this.createGrid();
|
||||||
this.applyMetadataDesign();
|
this.applyMetadataDesign();
|
||||||
this.setGridAreas();
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ArticleGrid extends WompumGrid {
|
||||||
|
constructor(element, metadata) {
|
||||||
|
super(element);
|
||||||
|
this.metadata = metadata;
|
||||||
|
|
||||||
|
// Generate sigils for each metadata component
|
||||||
|
this.sigils = {
|
||||||
|
narrator: Sigil.generate(metadata.narrator),
|
||||||
|
subject: Sigil.generate(metadata.subject),
|
||||||
|
facilitator: Sigil.generate(metadata.facilitator)
|
||||||
|
};
|
||||||
|
|
||||||
|
// Store sigils as data attributes
|
||||||
|
Object.entries(this.sigils).forEach(([key, value]) => {
|
||||||
|
this.gridElement.dataset[`${key}Sigil`] = JSON.stringify(value);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Define grid areas for each section
|
getSigilDigit(position, section) {
|
||||||
setGridAreas() {
|
const sigil = this.sigils[section];
|
||||||
const totalColumns = this.gridSize.columns;
|
if (!sigil || !sigil.length) return 0;
|
||||||
const narratorColumns = 2;
|
return sigil[position % sigil.length];
|
||||||
const facilitatorColumns = 2;
|
|
||||||
const subjectColumns = totalColumns - narratorColumns - facilitatorColumns;
|
|
||||||
|
|
||||||
this.gridElement.style.gridTemplateAreas = `
|
|
||||||
"narrator subject facilitator"
|
|
||||||
`;
|
|
||||||
// this.gridElement.style.gridTemplateColumns = `${narratorColumns}fr ${subjectColumns}fr ${facilitatorColumns}fr`;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the grid cells with position awareness
|
|
||||||
createGrid() {
|
createGrid() {
|
||||||
const totalCells = this.gridSize.columns * this.gridSize.rows;
|
const totalCells = this.gridSize.columns * this.gridSize.rows;
|
||||||
|
const narratorColumns = 2;
|
||||||
|
const facilitatorColumns = 2;
|
||||||
|
|
||||||
for (let i = 0; i < totalCells; i++) {
|
for (let i = 0; i < totalCells; i++) {
|
||||||
const cell = document.createElement('div');
|
const cell = document.createElement('div');
|
||||||
const column = i % this.gridSize.columns;
|
const column = i % this.gridSize.columns;
|
||||||
const row = Math.floor(i / this.gridSize.columns);
|
const row = Math.floor(i / this.gridSize.columns);
|
||||||
|
|
||||||
// Determine which section this cell belongs to
|
// Determine section based on column position
|
||||||
let section;
|
let section;
|
||||||
if (column < 2) section = 'narrator';
|
if (column < narratorColumns) section = 'narrator';
|
||||||
else if (column >= this.gridSize.columns - 2) section = 'facilitator';
|
else if (column >= this.gridSize.columns - facilitatorColumns) section = 'facilitator';
|
||||||
else section = 'subject';
|
else section = 'subject';
|
||||||
|
|
||||||
cell.className = 'wompum-cell';
|
cell.className = 'wompum-cell';
|
||||||
@ -124,26 +143,126 @@ class WompumGrid {
|
|||||||
cell.setAttribute('data-column', column);
|
cell.setAttribute('data-column', column);
|
||||||
cell.setAttribute('data-row', row);
|
cell.setAttribute('data-row', row);
|
||||||
|
|
||||||
|
// Set sigil digit based on section and position
|
||||||
|
const sigilDigit = this.getSigilDigit(row, section);
|
||||||
|
cell.setAttribute('data-sigil-digit', sigilDigit);
|
||||||
|
|
||||||
this.gridElement.appendChild(cell);
|
this.gridElement.appendChild(cell);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wait for DOM to be ready
|
class RadialWompumGrid {
|
||||||
|
constructor(element, size = 10) {
|
||||||
|
this.element = element; // Remove .parentElement
|
||||||
|
this.segments = size;
|
||||||
|
this.colorCalculator = new ColorCalculator();
|
||||||
|
this.sigil = Sigil.generate(this.element.dataset.text || '');
|
||||||
|
}
|
||||||
|
|
||||||
|
createSegment(index) {
|
||||||
|
const angle = (360 / this.segments);
|
||||||
|
// Add a small gap by reducing the arc angle
|
||||||
|
const gap = 2; // degrees of gap
|
||||||
|
const startAngle = (index * angle) + (gap / 2);
|
||||||
|
const endAngle = ((index + 1) * angle) - (gap / 2);
|
||||||
|
const outerRadius = 50;
|
||||||
|
const innerRadius = 0;
|
||||||
|
|
||||||
|
const start = this.polarToCartesian(startAngle, outerRadius);
|
||||||
|
const end = this.polarToCartesian(endAngle, outerRadius);
|
||||||
|
const innerStart = this.polarToCartesian(startAngle, innerRadius);
|
||||||
|
const innerEnd = this.polarToCartesian(endAngle, innerRadius);
|
||||||
|
|
||||||
|
const largeArcFlag = (angle - gap) > 180 ? 1 : 0;
|
||||||
|
|
||||||
|
const d = [
|
||||||
|
`M ${start.x} ${start.y}`,
|
||||||
|
`A ${outerRadius} ${outerRadius} 0 ${largeArcFlag} 1 ${end.x} ${end.y}`,
|
||||||
|
`L ${innerEnd.x} ${innerEnd.y}`,
|
||||||
|
`A ${innerRadius} ${innerRadius} 0 ${largeArcFlag} 0 ${innerStart.x} ${innerStart.y}`,
|
||||||
|
'Z'
|
||||||
|
].join(' ');
|
||||||
|
|
||||||
|
const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
|
||||||
|
path.setAttribute('d', d);
|
||||||
|
|
||||||
|
const sigilDigit = this.getSigilDigit(index);
|
||||||
|
// Pass empty array for influences since we don't need adjacent segments
|
||||||
|
const color = this.colorCalculator.getColor(sigilDigit, []);
|
||||||
|
path.setAttribute('fill', color);
|
||||||
|
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
polarToCartesian(angle, radius) {
|
||||||
|
const radian = (angle - 90) * Math.PI / 180.0;
|
||||||
|
return {
|
||||||
|
x: 50 + (radius * Math.cos(radian)),
|
||||||
|
y: 50 + (radius * Math.sin(radian))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
getSigilDigit(position) {
|
||||||
|
if (!this.sigil || !this.sigil.length) return 0;
|
||||||
|
return this.sigil[position % this.sigil.length];
|
||||||
|
}
|
||||||
|
|
||||||
|
getInfluences(index) {
|
||||||
|
const prev = (index - 1 + this.segments) % this.segments;
|
||||||
|
const next = (index + 1) % this.segments;
|
||||||
|
return [
|
||||||
|
this.getSigilDigit(prev),
|
||||||
|
this.getSigilDigit(next)
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
createSVG() {
|
||||||
|
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
|
||||||
|
svg.setAttribute('viewBox', '0 0 100 100');
|
||||||
|
svg.setAttribute('class', 'wompum-radial-grid');
|
||||||
|
|
||||||
|
for (let i = 0; i < this.segments; i++) {
|
||||||
|
svg.appendChild(this.createSegment(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
return svg;
|
||||||
|
}
|
||||||
|
|
||||||
|
init() {
|
||||||
|
if (!this.sigil || !this.sigil.length) {
|
||||||
|
console.error('No sigil generated from text:', this.element.getAttribute('data-text'));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const svg = this.createSVG();
|
||||||
|
this.element.insertBefore(svg, this.element.firstChild);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize grids
|
||||||
document.addEventListener('DOMContentLoaded', () => {
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
// Find all grid elements
|
// Initialize basic grids
|
||||||
const gridElements = document.querySelectorAll('.wompum-grid');
|
document.querySelectorAll('.wompum-grid').forEach(element => {
|
||||||
|
const grid = new WompumGrid(element);
|
||||||
// Initialize a grid for each element found
|
grid.init();
|
||||||
gridElements.forEach(element => {
|
});
|
||||||
|
|
||||||
|
// Initialize article grids
|
||||||
|
document.querySelectorAll('.wompum-article-grid').forEach(element => {
|
||||||
let metadata = {};
|
let metadata = {};
|
||||||
try {
|
try {
|
||||||
metadata = JSON.parse(element.dataset.metadata || '{}');
|
metadata = JSON.parse(element.dataset.metadata || '{}');
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('Error parsing metadata for grid:', e);
|
console.error('Error parsing metadata for article grid:', e);
|
||||||
}
|
}
|
||||||
|
|
||||||
const wompum = new WompumGrid(element, metadata);
|
const grid = new ArticleGrid(element, metadata);
|
||||||
wompum.init();
|
grid.init();
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
// Initialize radial grids for profile images
|
||||||
|
document.querySelectorAll('.narrator__container').forEach(element => {
|
||||||
|
const grid = new RadialWompumGrid(element);
|
||||||
|
grid.init();
|
||||||
|
});
|
||||||
|
});
|
18
tailwind.config.js
Normal file
18
tailwind.config.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
module.exports = {
|
||||||
|
content: [
|
||||||
|
'./layouts/**/*.html',
|
||||||
|
'./content/**/*.md',
|
||||||
|
'./assets/scss/**/*.scss',
|
||||||
|
],
|
||||||
|
theme: {
|
||||||
|
extend: {
|
||||||
|
fontFamily: {
|
||||||
|
'garamond': ['EB Garamond 12', 'serif'],
|
||||||
|
'iosevka': ['Iosevka', 'monospace'],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
plugins: [
|
||||||
|
require('@tailwindcss/typography'),
|
||||||
|
],
|
||||||
|
};
|
Reference in New Issue
Block a user