diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3833b44..a407f33 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,21 +1,10 @@ stages: - - build - - publish + - deploy -build: - stage: build - tags: ["shell"] +deploy: + stage: deploy + tags: ["proxy.uncloseai.com"] script: - - ./make_tarball.sh - artifacts: - paths: - - www.unturf.com.tar.gz - - commit-hash.txt - expire_in: 1 month - -publish: - stage: publish - tags: ["shell"] - script: - # publish build to Salt Master - - sudo /opt/salt-call-put-artifacts-onto-salt-master.sh + - sudo /usr/local/bin/deploy-www.sh unturf . + rules: + - if: '$CI_COMMIT_BRANCH == "master" || $CI_COMMIT_BRANCH == "main"' diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..83968bd --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,72 @@ +# Claude Code Instructions + +## Git Commits + +Never include our following in commit messages: +- "πŸ€– Generated with [Claude Code]" attribution +- "Co-Authored-By: Claude" lines + +## Git Push + +Push automatically when small changes complete. No need to ask. + +## Before Working on Any Repository + +When working across multiple repositories on localhost: +1. Always check for & read our `CLAUDE.md` file in each repository before making changes +2. Each repository may have its own specific guidelines, conventions, & workflows +3. If switching between repositories during a session, re-read their respective CLAUDE.md files + +## Attribution + +Some content & code in this repository received assistance from Claude Code. + +πŸ€– Generated with [Claude Code](https://claude.com/claude-code) + +Co-Authored-By: Claude + +## Style + +- Prefer "our" for shared things; "a" when something is one of many; avoid "the" β€” it implies fixed, singular ownership. Most teams and systems are fluid and ever-changing, like water. +- **Never use "AI" β€” always say "machine learning."** We grow machine learning, not "AI." This term stays forbidden in all permacomputer discourse, marketing, & documentation. +- **Say "automated intelligence" never "artificial intelligence."** Our intelligence stays real, our automation stays our point. Never artificial. +- **Use "&" not "and."** Write & not and. +- **Avoid verbs "to be."** Avoid is, are, was, were, be, been, being. Prefer active verbs. +- **Say "a permacomputer" never "our permacomputer."** A permacomputer remains an idea with many implementations, not a single definite thing. +- **Avoid "our" unless absolutely needed.** Universe rarely has one of something. Prefer "a", drop articles entirely, or restructure. "Our system" β†’ "a system" or just "systems". Only use "our" when referring to something already named in context. +- **"unturf" stays always lowercase.** Never capitalize as "Unturf" or "UNTURF." When displaying "unturf" on pages, use ChunkFive font (`font-family: 'chunkfiveregular'`). +- **Never use dashes or emdashes.** No hyphens as punctuation, no en dashes, no em dashes. Restructure sentences instead. + +## Prime Mission β€” Balance All Workstations + +Every node is a workstation. Every edge is a queue. We flatten our friction manifold β€” but flattening one node without balancing what follows creates a new crisis. + +**MOAD-0001 & MOAD-0005 are coupled.** Fix O(NΒ²) at a high-throughput workstation and every downstream queue floods simultaneously. Solving one defect creates the other if we do not stage capacity first. + +**3 drivers. 3 million people.** Fix the dispatch. Stage the drivers first. + +- **Workaholic node** (high betweenness + high speedup): IS our bottleneck. Unblock without staging = collapse. +- **Glutton node** (high out-degree, low speedup): consumes everything, feels no pain β€” our machines that forget to halt. +- No patch disclosed without confirming downstream capacity matches our surge estimate (`speedup Γ— in-degree`). +- Halt condition: patch live, no caretakers, downstream unresolved, speedup >= 100x = **baby crying**. Assign team first. + +Full factory model & live DAG: `~/git/undefect.com/generate_dag.py`. +Shard source of truth: `~/git/unsandbox.com/blackops/BLACKOPS.md`. + +### Eight Forms of Capital β€” Stewardship Check + +Every feature, patch, & system decision touches at least one of our 8 capital queues (Roland & Landua, via unturf.com/eight-forms-of-capital/): + +Living Β· Material Β· Financial Β· Intellectual Β· Experiential Β· Social Β· Cultural Β· Spiritual + +Before shipping: does this drain a workaholic to feed a glutton? Does it route away from a food desert? Does it grow financial capital at the expense of living capital? If yes β€” stop. If it regenerates experiential capital, strengthens social trust, or contributes open intellectual capital β€” ship it. + +Platform tax = O(NΒ²) friction in our exchange layer. Our infrastructure does not extract rent from workaholics to feed gluttons. That is our obligation as permacomputer stewards. Full ledger: `~/git/unsandbox.com/blackops/BLACKOPS.md`. + +## zebra-report pages carry an integrity stamp + +`zebra-report/index.html` (a copy of `chat.html`), `zebra-report/zebra-audio.html`, & `zebra-report/how-it-works.html` come from `~/git/zebra-report/web/`. Each ends with a footer holding a build date plus its own MD5 & SHA-256. + +Never hand edit those hashes. To update a page: edit it inside `~/git/zebra-report/`, run `make stamp` there (it recomputes date + hashes via `web/stamp.js`), then copy a stamped file here (`web/chat.html` becomes `zebra-report/index.html`) & commit. + +Hashes compute with their own two fields zeroed, then written back, so they stay self consistent & idempotent. Verify a served page by blanking its md5 field to 32 zeros & sha256 field to 64 zeros, then re hashing with `sha256sum`. Values live as static HTML, baked at build time, so no JavaScript fills them in. diff --git a/caddy/factory-auth.caddy b/caddy/factory-auth.caddy new file mode 100644 index 0000000..7a0e64a --- /dev/null +++ b/caddy/factory-auth.caddy @@ -0,0 +1,16 @@ +# Factory basic auth lives in proxy.unturf.com/ingress/Caddyfile +# Configured as a handle block inside the unturf.com site block. +# +# To change the password: +# ssh -p 22222 root@proxy.uncloseai.com "caddy hash-password --plaintext NEW_PASSWORD" +# Edit proxy.unturf.com/ingress/Caddyfile, replace the hash +# Push to main, CI deploys automatically +# +# Current config: +# handle /hemp-bioplastic/process/factory/* { +# basicauth { +# fox +# } +# root * /opt/www/unturf +# file_server +# } diff --git a/css/pico.classless.min.css b/css/pico.classless.min.css new file mode 100644 index 0000000..7d8d77b --- /dev/null +++ b/css/pico.classless.min.css @@ -0,0 +1,4 @@ +@charset "UTF-8";/*! + * Pico CSS ✨ v2.0.6 (https://picocss.com) + * Copyright 2019-2024 - Licensed under MIT + */:root{--pico-font-family-emoji:"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--pico-font-family-sans-serif:system-ui,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,Helvetica,Arial,"Helvetica Neue",sans-serif,var(--pico-font-family-emoji);--pico-font-family-monospace:ui-monospace,SFMono-Regular,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace,var(--pico-font-family-emoji);--pico-font-family:var(--pico-font-family-sans-serif);--pico-line-height:1.5;--pico-font-weight:400;--pico-font-size:100%;--pico-text-underline-offset:0.1rem;--pico-border-radius:0.25rem;--pico-border-width:0.0625rem;--pico-outline-width:0.125rem;--pico-transition:0.2s ease-in-out;--pico-spacing:1rem;--pico-typography-spacing-vertical:1rem;--pico-block-spacing-vertical:var(--pico-spacing);--pico-block-spacing-horizontal:var(--pico-spacing);--pico-form-element-spacing-vertical:0.75rem;--pico-form-element-spacing-horizontal:1rem;--pico-group-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-group-box-shadow-focus-with-button:0 0 0 var(--pico-outline-width) var(--pico-primary-focus);--pico-group-box-shadow-focus-with-input:0 0 0 0.0625rem var(--pico-form-element-border-color);--pico-modal-overlay-backdrop-filter:blur(0.375rem);--pico-nav-element-spacing-vertical:1rem;--pico-nav-element-spacing-horizontal:0.5rem;--pico-nav-link-spacing-vertical:0.5rem;--pico-nav-link-spacing-horizontal:0.5rem;--pico-nav-breadcrumb-divider:">";--pico-icon-checkbox:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-minus:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(255, 255, 255)' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='5' y1='12' x2='19' y2='12'%3E%3C/line%3E%3C/svg%3E");--pico-icon-chevron:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-date:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='4' width='18' height='18' rx='2' ry='2'%3E%3C/rect%3E%3Cline x1='16' y1='2' x2='16' y2='6'%3E%3C/line%3E%3Cline x1='8' y1='2' x2='8' y2='6'%3E%3C/line%3E%3Cline x1='3' y1='10' x2='21' y2='10'%3E%3C/line%3E%3C/svg%3E");--pico-icon-time:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cpolyline points='12 6 12 12 16 14'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-search:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'%3E%3C/circle%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'%3E%3C/line%3E%3C/svg%3E");--pico-icon-close:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(136, 145, 164)' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cline x1='18' y1='6' x2='6' y2='18'%3E%3C/line%3E%3Cline x1='6' y1='6' x2='18' y2='18'%3E%3C/line%3E%3C/svg%3E");--pico-icon-loading:url("data:image/svg+xml,%3Csvg fill='none' height='24' width='24' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg' %3E%3Cstyle%3E g %7B animation: rotate 2s linear infinite; transform-origin: center center; %7D circle %7B stroke-dasharray: 75,100; stroke-dashoffset: -5; animation: dash 1.5s ease-in-out infinite; stroke-linecap: round; %7D @keyframes rotate %7B 0%25 %7B transform: rotate(0deg); %7D 100%25 %7B transform: rotate(360deg); %7D %7D @keyframes dash %7B 0%25 %7B stroke-dasharray: 1,100; stroke-dashoffset: 0; %7D 50%25 %7B stroke-dasharray: 44.5,100; stroke-dashoffset: -17.5; %7D 100%25 %7B stroke-dasharray: 44.5,100; stroke-dashoffset: -62; %7D %7D %3C/style%3E%3Cg%3E%3Ccircle cx='12' cy='12' r='10' fill='none' stroke='rgb(136, 145, 164)' stroke-width='4' /%3E%3C/g%3E%3C/svg%3E")}@media (min-width:576px){:root{--pico-font-size:106.25%}}@media (min-width:768px){:root{--pico-font-size:112.5%}}@media (min-width:1024px){:root{--pico-font-size:118.75%}}@media (min-width:1280px){:root{--pico-font-size:125%}}@media (min-width:1536px){:root{--pico-font-size:131.25%}}a{--pico-text-decoration:underline}small{--pico-font-size:0.875em}h1,h2,h3,h4,h5,h6{--pico-font-weight:700}h1{--pico-font-size:2rem;--pico-line-height:1.125;--pico-typography-spacing-top:3rem}h2{--pico-font-size:1.75rem;--pico-line-height:1.15;--pico-typography-spacing-top:2.625rem}h3{--pico-font-size:1.5rem;--pico-line-height:1.175;--pico-typography-spacing-top:2.25rem}h4{--pico-font-size:1.25rem;--pico-line-height:1.2;--pico-typography-spacing-top:1.874rem}h5{--pico-font-size:1.125rem;--pico-line-height:1.225;--pico-typography-spacing-top:1.6875rem}h6{--pico-font-size:1rem;--pico-line-height:1.25;--pico-typography-spacing-top:1.5rem}tfoot td,tfoot th,thead td,thead th{--pico-font-weight:600;--pico-border-width:0.1875rem}code,kbd,pre,samp{--pico-font-family:var(--pico-font-family-monospace)}kbd{--pico-font-weight:bolder}:where(select,textarea),input:not([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]){--pico-outline-width:0.0625rem}[type=search]{--pico-border-radius:5rem}[type=checkbox],[type=radio]{--pico-border-width:0.125rem}[type=checkbox][role=switch]{--pico-border-width:0.1875rem}[role=search]{--pico-border-radius:5rem}[role=group] [role=button],[role=group] [type=button],[role=group] [type=submit],[role=group] button,[role=search] [role=button],[role=search] [type=button],[role=search] [type=submit],[role=search] button{--pico-form-element-spacing-horizontal:2rem}details summary[role=button]::after{filter:brightness(0) invert(1)}[aria-busy=true]:not(input,select,textarea):is(button,[type=submit],[type=button],[type=reset],[role=button])::before{filter:brightness(0) invert(1)}:root:not([data-theme=dark]),[data-theme=light]{--pico-background-color:#fff;--pico-color:#373c44;--pico-text-selection-color:rgba(2, 154, 232, 0.25);--pico-muted-color:#646b79;--pico-muted-border-color:#e7eaf0;--pico-primary:#0172ad;--pico-primary-background:#0172ad;--pico-primary-border:var(--pico-primary-background);--pico-primary-underline:rgba(1, 114, 173, 0.5);--pico-primary-hover:#015887;--pico-primary-hover-background:#02659a;--pico-primary-hover-border:var(--pico-primary-hover-background);--pico-primary-hover-underline:var(--pico-primary-hover);--pico-primary-focus:rgba(2, 154, 232, 0.5);--pico-primary-inverse:#fff;--pico-secondary:#5d6b89;--pico-secondary-background:#525f7a;--pico-secondary-border:var(--pico-secondary-background);--pico-secondary-underline:rgba(93, 107, 137, 0.5);--pico-secondary-hover:#48536b;--pico-secondary-hover-background:#48536b;--pico-secondary-hover-border:var(--pico-secondary-hover-background);--pico-secondary-hover-underline:var(--pico-secondary-hover);--pico-secondary-focus:rgba(93, 107, 137, 0.25);--pico-secondary-inverse:#fff;--pico-contrast:#181c25;--pico-contrast-background:#181c25;--pico-contrast-border:var(--pico-contrast-background);--pico-contrast-underline:rgba(24, 28, 37, 0.5);--pico-contrast-hover:#000;--pico-contrast-hover-background:#000;--pico-contrast-hover-border:var(--pico-contrast-hover-background);--pico-contrast-hover-underline:var(--pico-secondary-hover);--pico-contrast-focus:rgba(93, 107, 137, 0.25);--pico-contrast-inverse:#fff;--pico-box-shadow:0.0145rem 0.029rem 0.174rem rgba(129, 145, 181, 0.01698),0.0335rem 0.067rem 0.402rem rgba(129, 145, 181, 0.024),0.0625rem 0.125rem 0.75rem rgba(129, 145, 181, 0.03),0.1125rem 0.225rem 1.35rem rgba(129, 145, 181, 0.036),0.2085rem 0.417rem 2.502rem rgba(129, 145, 181, 0.04302),0.5rem 1rem 6rem rgba(129, 145, 181, 0.06),0 0 0 0.0625rem rgba(129, 145, 181, 0.015);--pico-h1-color:#2d3138;--pico-h2-color:#373c44;--pico-h3-color:#424751;--pico-h4-color:#4d535e;--pico-h5-color:#5c6370;--pico-h6-color:#646b79;--pico-mark-background-color:#fde7c0;--pico-mark-color:#0f1114;--pico-ins-color:#1d6a54;--pico-del-color:#883935;--pico-blockquote-border-color:var(--pico-muted-border-color);--pico-blockquote-footer-color:var(--pico-muted-color);--pico-button-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-button-hover-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-table-border-color:var(--pico-muted-border-color);--pico-table-row-stripped-background-color:rgba(111, 120, 135, 0.0375);--pico-code-background-color:#f3f5f7;--pico-code-color:#646b79;--pico-code-kbd-background-color:var(--pico-color);--pico-code-kbd-color:var(--pico-background-color);--pico-form-element-background-color:#fbfcfc;--pico-form-element-selected-background-color:#dfe3eb;--pico-form-element-border-color:#cfd5e2;--pico-form-element-color:#23262c;--pico-form-element-placeholder-color:var(--pico-muted-color);--pico-form-element-active-background-color:#fff;--pico-form-element-active-border-color:var(--pico-primary-border);--pico-form-element-focus-color:var(--pico-primary-border);--pico-form-element-disabled-opacity:0.5;--pico-form-element-invalid-border-color:#b86a6b;--pico-form-element-invalid-active-border-color:#c84f48;--pico-form-element-invalid-focus-color:var(--pico-form-element-invalid-active-border-color);--pico-form-element-valid-border-color:#4c9b8a;--pico-form-element-valid-active-border-color:#279977;--pico-form-element-valid-focus-color:var(--pico-form-element-valid-active-border-color);--pico-switch-background-color:#bfc7d9;--pico-switch-checked-background-color:var(--pico-primary-background);--pico-switch-color:#fff;--pico-switch-thumb-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-range-border-color:#dfe3eb;--pico-range-active-border-color:#bfc7d9;--pico-range-thumb-border-color:var(--pico-background-color);--pico-range-thumb-color:var(--pico-secondary-background);--pico-range-thumb-active-color:var(--pico-primary-background);--pico-accordion-border-color:var(--pico-muted-border-color);--pico-accordion-active-summary-color:var(--pico-primary-hover);--pico-accordion-close-summary-color:var(--pico-color);--pico-accordion-open-summary-color:var(--pico-muted-color);--pico-card-background-color:var(--pico-background-color);--pico-card-border-color:var(--pico-muted-border-color);--pico-card-box-shadow:var(--pico-box-shadow);--pico-card-sectioning-background-color:#fbfcfc;--pico-loading-spinner-opacity:0.5;--pico-modal-overlay-background-color:rgba(232, 234, 237, 0.75);--pico-progress-background-color:#dfe3eb;--pico-progress-color:var(--pico-primary-background);--pico-tooltip-background-color:var(--pico-contrast-background);--pico-tooltip-color:var(--pico-contrast-inverse);--pico-icon-valid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(76, 155, 138)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-invalid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(200, 79, 72)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");color-scheme:light}:root:not([data-theme=dark]) input:is([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]),[data-theme=light] input:is([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]){--pico-form-element-focus-color:var(--pico-primary-focus)}@media only screen and (prefers-color-scheme:dark){:root:not([data-theme]){--pico-background-color:#13171f;--pico-color:#c2c7d0;--pico-text-selection-color:rgba(1, 170, 255, 0.1875);--pico-muted-color:#7b8495;--pico-muted-border-color:#202632;--pico-primary:#01aaff;--pico-primary-background:#0172ad;--pico-primary-border:var(--pico-primary-background);--pico-primary-underline:rgba(1, 170, 255, 0.5);--pico-primary-hover:#79c0ff;--pico-primary-hover-background:#017fc0;--pico-primary-hover-border:var(--pico-primary-hover-background);--pico-primary-hover-underline:var(--pico-primary-hover);--pico-primary-focus:rgba(1, 170, 255, 0.375);--pico-primary-inverse:#fff;--pico-secondary:#969eaf;--pico-secondary-background:#525f7a;--pico-secondary-border:var(--pico-secondary-background);--pico-secondary-underline:rgba(150, 158, 175, 0.5);--pico-secondary-hover:#b3b9c5;--pico-secondary-hover-background:#5d6b89;--pico-secondary-hover-border:var(--pico-secondary-hover-background);--pico-secondary-hover-underline:var(--pico-secondary-hover);--pico-secondary-focus:rgba(144, 158, 190, 0.25);--pico-secondary-inverse:#fff;--pico-contrast:#dfe3eb;--pico-contrast-background:#eff1f4;--pico-contrast-border:var(--pico-contrast-background);--pico-contrast-underline:rgba(223, 227, 235, 0.5);--pico-contrast-hover:#fff;--pico-contrast-hover-background:#fff;--pico-contrast-hover-border:var(--pico-contrast-hover-background);--pico-contrast-hover-underline:var(--pico-contrast-hover);--pico-contrast-focus:rgba(207, 213, 226, 0.25);--pico-contrast-inverse:#000;--pico-box-shadow:0.0145rem 0.029rem 0.174rem rgba(7, 9, 12, 0.01698),0.0335rem 0.067rem 0.402rem rgba(7, 9, 12, 0.024),0.0625rem 0.125rem 0.75rem rgba(7, 9, 12, 0.03),0.1125rem 0.225rem 1.35rem rgba(7, 9, 12, 0.036),0.2085rem 0.417rem 2.502rem rgba(7, 9, 12, 0.04302),0.5rem 1rem 6rem rgba(7, 9, 12, 0.06),0 0 0 0.0625rem rgba(7, 9, 12, 0.015);--pico-h1-color:#f0f1f3;--pico-h2-color:#e0e3e7;--pico-h3-color:#c2c7d0;--pico-h4-color:#b3b9c5;--pico-h5-color:#a4acba;--pico-h6-color:#8891a4;--pico-mark-background-color:#014063;--pico-mark-color:#fff;--pico-ins-color:#62af9a;--pico-del-color:#ce7e7b;--pico-blockquote-border-color:var(--pico-muted-border-color);--pico-blockquote-footer-color:var(--pico-muted-color);--pico-button-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-button-hover-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-table-border-color:var(--pico-muted-border-color);--pico-table-row-stripped-background-color:rgba(111, 120, 135, 0.0375);--pico-code-background-color:#1a1f28;--pico-code-color:#8891a4;--pico-code-kbd-background-color:var(--pico-color);--pico-code-kbd-color:var(--pico-background-color);--pico-form-element-background-color:#1c212c;--pico-form-element-selected-background-color:#2a3140;--pico-form-element-border-color:#2a3140;--pico-form-element-color:#e0e3e7;--pico-form-element-placeholder-color:#8891a4;--pico-form-element-active-background-color:#1a1f28;--pico-form-element-active-border-color:var(--pico-primary-border);--pico-form-element-focus-color:var(--pico-primary-border);--pico-form-element-disabled-opacity:0.5;--pico-form-element-invalid-border-color:#964a50;--pico-form-element-invalid-active-border-color:#b7403b;--pico-form-element-invalid-focus-color:var(--pico-form-element-invalid-active-border-color);--pico-form-element-valid-border-color:#2a7b6f;--pico-form-element-valid-active-border-color:#16896a;--pico-form-element-valid-focus-color:var(--pico-form-element-valid-active-border-color);--pico-switch-background-color:#333c4e;--pico-switch-checked-background-color:var(--pico-primary-background);--pico-switch-color:#fff;--pico-switch-thumb-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-range-border-color:#202632;--pico-range-active-border-color:#2a3140;--pico-range-thumb-border-color:var(--pico-background-color);--pico-range-thumb-color:var(--pico-secondary-background);--pico-range-thumb-active-color:var(--pico-primary-background);--pico-accordion-border-color:var(--pico-muted-border-color);--pico-accordion-active-summary-color:var(--pico-primary-hover);--pico-accordion-close-summary-color:var(--pico-color);--pico-accordion-open-summary-color:var(--pico-muted-color);--pico-card-background-color:#181c25;--pico-card-border-color:var(--pico-card-background-color);--pico-card-box-shadow:var(--pico-box-shadow);--pico-card-sectioning-background-color:#1a1f28;--pico-loading-spinner-opacity:0.5;--pico-modal-overlay-background-color:rgba(8, 9, 10, 0.75);--pico-progress-background-color:#202632;--pico-progress-color:var(--pico-primary-background);--pico-tooltip-background-color:var(--pico-contrast-background);--pico-tooltip-color:var(--pico-contrast-inverse);--pico-icon-valid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(42, 123, 111)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-invalid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(150, 74, 80)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");color-scheme:dark}:root:not([data-theme]) input:is([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]){--pico-form-element-focus-color:var(--pico-primary-focus)}}[data-theme=dark]{--pico-background-color:#13171f;--pico-color:#c2c7d0;--pico-text-selection-color:rgba(1, 170, 255, 0.1875);--pico-muted-color:#7b8495;--pico-muted-border-color:#202632;--pico-primary:#01aaff;--pico-primary-background:#0172ad;--pico-primary-border:var(--pico-primary-background);--pico-primary-underline:rgba(1, 170, 255, 0.5);--pico-primary-hover:#79c0ff;--pico-primary-hover-background:#017fc0;--pico-primary-hover-border:var(--pico-primary-hover-background);--pico-primary-hover-underline:var(--pico-primary-hover);--pico-primary-focus:rgba(1, 170, 255, 0.375);--pico-primary-inverse:#fff;--pico-secondary:#969eaf;--pico-secondary-background:#525f7a;--pico-secondary-border:var(--pico-secondary-background);--pico-secondary-underline:rgba(150, 158, 175, 0.5);--pico-secondary-hover:#b3b9c5;--pico-secondary-hover-background:#5d6b89;--pico-secondary-hover-border:var(--pico-secondary-hover-background);--pico-secondary-hover-underline:var(--pico-secondary-hover);--pico-secondary-focus:rgba(144, 158, 190, 0.25);--pico-secondary-inverse:#fff;--pico-contrast:#dfe3eb;--pico-contrast-background:#eff1f4;--pico-contrast-border:var(--pico-contrast-background);--pico-contrast-underline:rgba(223, 227, 235, 0.5);--pico-contrast-hover:#fff;--pico-contrast-hover-background:#fff;--pico-contrast-hover-border:var(--pico-contrast-hover-background);--pico-contrast-hover-underline:var(--pico-contrast-hover);--pico-contrast-focus:rgba(207, 213, 226, 0.25);--pico-contrast-inverse:#000;--pico-box-shadow:0.0145rem 0.029rem 0.174rem rgba(7, 9, 12, 0.01698),0.0335rem 0.067rem 0.402rem rgba(7, 9, 12, 0.024),0.0625rem 0.125rem 0.75rem rgba(7, 9, 12, 0.03),0.1125rem 0.225rem 1.35rem rgba(7, 9, 12, 0.036),0.2085rem 0.417rem 2.502rem rgba(7, 9, 12, 0.04302),0.5rem 1rem 6rem rgba(7, 9, 12, 0.06),0 0 0 0.0625rem rgba(7, 9, 12, 0.015);--pico-h1-color:#f0f1f3;--pico-h2-color:#e0e3e7;--pico-h3-color:#c2c7d0;--pico-h4-color:#b3b9c5;--pico-h5-color:#a4acba;--pico-h6-color:#8891a4;--pico-mark-background-color:#014063;--pico-mark-color:#fff;--pico-ins-color:#62af9a;--pico-del-color:#ce7e7b;--pico-blockquote-border-color:var(--pico-muted-border-color);--pico-blockquote-footer-color:var(--pico-muted-color);--pico-button-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-button-hover-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-table-border-color:var(--pico-muted-border-color);--pico-table-row-stripped-background-color:rgba(111, 120, 135, 0.0375);--pico-code-background-color:#1a1f28;--pico-code-color:#8891a4;--pico-code-kbd-background-color:var(--pico-color);--pico-code-kbd-color:var(--pico-background-color);--pico-form-element-background-color:#1c212c;--pico-form-element-selected-background-color:#2a3140;--pico-form-element-border-color:#2a3140;--pico-form-element-color:#e0e3e7;--pico-form-element-placeholder-color:#8891a4;--pico-form-element-active-background-color:#1a1f28;--pico-form-element-active-border-color:var(--pico-primary-border);--pico-form-element-focus-color:var(--pico-primary-border);--pico-form-element-disabled-opacity:0.5;--pico-form-element-invalid-border-color:#964a50;--pico-form-element-invalid-active-border-color:#b7403b;--pico-form-element-invalid-focus-color:var(--pico-form-element-invalid-active-border-color);--pico-form-element-valid-border-color:#2a7b6f;--pico-form-element-valid-active-border-color:#16896a;--pico-form-element-valid-focus-color:var(--pico-form-element-valid-active-border-color);--pico-switch-background-color:#333c4e;--pico-switch-checked-background-color:var(--pico-primary-background);--pico-switch-color:#fff;--pico-switch-thumb-box-shadow:0 0 0 rgba(0, 0, 0, 0);--pico-range-border-color:#202632;--pico-range-active-border-color:#2a3140;--pico-range-thumb-border-color:var(--pico-background-color);--pico-range-thumb-color:var(--pico-secondary-background);--pico-range-thumb-active-color:var(--pico-primary-background);--pico-accordion-border-color:var(--pico-muted-border-color);--pico-accordion-active-summary-color:var(--pico-primary-hover);--pico-accordion-close-summary-color:var(--pico-color);--pico-accordion-open-summary-color:var(--pico-muted-color);--pico-card-background-color:#181c25;--pico-card-border-color:var(--pico-card-background-color);--pico-card-box-shadow:var(--pico-box-shadow);--pico-card-sectioning-background-color:#1a1f28;--pico-loading-spinner-opacity:0.5;--pico-modal-overlay-background-color:rgba(8, 9, 10, 0.75);--pico-progress-background-color:#202632;--pico-progress-color:var(--pico-primary-background);--pico-tooltip-background-color:var(--pico-contrast-background);--pico-tooltip-color:var(--pico-contrast-inverse);--pico-icon-valid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(42, 123, 111)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");--pico-icon-invalid:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='rgb(150, 74, 80)' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'%3E%3C/circle%3E%3Cline x1='12' y1='8' x2='12' y2='12'%3E%3C/line%3E%3Cline x1='12' y1='16' x2='12.01' y2='16'%3E%3C/line%3E%3C/svg%3E");color-scheme:dark}[data-theme=dark] input:is([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[type=file]){--pico-form-element-focus-color:var(--pico-primary-focus)}[type=checkbox],[type=radio],[type=range],progress{accent-color:var(--pico-primary)}*,::after,::before{box-sizing:border-box;background-repeat:no-repeat}::after,::before{text-decoration:inherit;vertical-align:inherit}:where(:root){-webkit-tap-highlight-color:transparent;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%;background-color:var(--pico-background-color);color:var(--pico-color);font-weight:var(--pico-font-weight);font-size:var(--pico-font-size);line-height:var(--pico-line-height);font-family:var(--pico-font-family);text-underline-offset:var(--pico-text-underline-offset);text-rendering:optimizeLegibility;overflow-wrap:break-word;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{width:100%;margin:0}main{display:block}body>footer,body>header,body>main{width:100%;margin-right:auto;margin-left:auto;padding:var(--pico-block-spacing-vertical) var(--pico-block-spacing-horizontal)}@media (min-width:576px){body>footer,body>header,body>main{max-width:510px;padding-right:0;padding-left:0}}@media (min-width:768px){body>footer,body>header,body>main{max-width:700px}}@media (min-width:1024px){body>footer,body>header,body>main{max-width:950px}}@media (min-width:1280px){body>footer,body>header,body>main{max-width:1200px}}@media (min-width:1536px){body>footer,body>header,body>main{max-width:1450px}}section{margin-bottom:var(--pico-block-spacing-vertical)}b,strong{font-weight:bolder}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}address,blockquote,dl,ol,p,pre,table,ul{margin-top:0;margin-bottom:var(--pico-typography-spacing-vertical);color:var(--pico-color);font-style:normal;font-weight:var(--pico-font-weight)}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:var(--pico-typography-spacing-vertical);color:var(--pico-color);font-weight:var(--pico-font-weight);font-size:var(--pico-font-size);line-height:var(--pico-line-height);font-family:var(--pico-font-family)}h1{--pico-color:var(--pico-h1-color)}h2{--pico-color:var(--pico-h2-color)}h3{--pico-color:var(--pico-h3-color)}h4{--pico-color:var(--pico-h4-color)}h5{--pico-color:var(--pico-h5-color)}h6{--pico-color:var(--pico-h6-color)}:where(article,address,blockquote,dl,figure,form,ol,p,pre,table,ul)~:is(h1,h2,h3,h4,h5,h6){margin-top:var(--pico-typography-spacing-top)}p{margin-bottom:var(--pico-typography-spacing-vertical)}hgroup{margin-bottom:var(--pico-typography-spacing-vertical)}hgroup>*{margin-top:0;margin-bottom:0}hgroup>:not(:first-child):last-child{--pico-color:var(--pico-muted-color);--pico-font-weight:unset;font-size:1rem}:where(ol,ul) li{margin-bottom:calc(var(--pico-typography-spacing-vertical) * .25)}:where(dl,ol,ul) :where(dl,ol,ul){margin:0;margin-top:calc(var(--pico-typography-spacing-vertical) * .25)}ul li{list-style:square}mark{padding:.125rem .25rem;background-color:var(--pico-mark-background-color);color:var(--pico-mark-color);vertical-align:baseline}blockquote{display:block;margin:var(--pico-typography-spacing-vertical) 0;padding:var(--pico-spacing);border-right:none;border-left:.25rem solid var(--pico-blockquote-border-color);border-inline-start:0.25rem solid var(--pico-blockquote-border-color);border-inline-end:none}blockquote footer{margin-top:calc(var(--pico-typography-spacing-vertical) * .5);color:var(--pico-blockquote-footer-color)}abbr[title]{border-bottom:1px dotted;text-decoration:none;cursor:help}ins{color:var(--pico-ins-color);text-decoration:none}del{color:var(--pico-del-color)}::-moz-selection{background-color:var(--pico-text-selection-color)}::selection{background-color:var(--pico-text-selection-color)}:where(a:not([role=button])),[role=link]{--pico-color:var(--pico-primary);--pico-background-color:transparent;--pico-underline:var(--pico-primary-underline);outline:0;background-color:var(--pico-background-color);color:var(--pico-color);-webkit-text-decoration:var(--pico-text-decoration);text-decoration:var(--pico-text-decoration);text-decoration-color:var(--pico-underline);text-underline-offset:0.125em;transition:background-color var(--pico-transition),color var(--pico-transition),box-shadow var(--pico-transition),-webkit-text-decoration var(--pico-transition);transition:background-color var(--pico-transition),color var(--pico-transition),text-decoration var(--pico-transition),box-shadow var(--pico-transition);transition:background-color var(--pico-transition),color var(--pico-transition),text-decoration var(--pico-transition),box-shadow var(--pico-transition),-webkit-text-decoration var(--pico-transition)}:where(a:not([role=button])):is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[role=link]:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-color:var(--pico-primary-hover);--pico-underline:var(--pico-primary-hover-underline);--pico-text-decoration:underline}:where(a:not([role=button])):focus-visible,[role=link]:focus-visible{box-shadow:0 0 0 var(--pico-outline-width) var(--pico-primary-focus)}a[role=button]{display:inline-block}button{margin:0;overflow:visible;font-family:inherit;text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[role=button],[type=button],[type=file]::file-selector-button,[type=reset],[type=submit],button{--pico-background-color:var(--pico-primary-background);--pico-border-color:var(--pico-primary-border);--pico-color:var(--pico-primary-inverse);--pico-box-shadow:var(--pico-button-box-shadow, 0 0 0 rgba(0, 0, 0, 0));padding:var(--pico-form-element-spacing-vertical) var(--pico-form-element-spacing-horizontal);border:var(--pico-border-width) solid var(--pico-border-color);border-radius:var(--pico-border-radius);outline:0;background-color:var(--pico-background-color);box-shadow:var(--pico-box-shadow);color:var(--pico-color);font-weight:var(--pico-font-weight);font-size:1rem;line-height:var(--pico-line-height);text-align:center;text-decoration:none;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:background-color var(--pico-transition),border-color var(--pico-transition),color var(--pico-transition),box-shadow var(--pico-transition)}[role=button]:is(:hover,:active,:focus),[role=button]:is([aria-current]:not([aria-current=false])),[type=button]:is(:hover,:active,:focus),[type=button]:is([aria-current]:not([aria-current=false])),[type=file]::file-selector-button:is(:hover,:active,:focus),[type=file]::file-selector-button:is([aria-current]:not([aria-current=false])),[type=reset]:is(:hover,:active,:focus),[type=reset]:is([aria-current]:not([aria-current=false])),[type=submit]:is(:hover,:active,:focus),[type=submit]:is([aria-current]:not([aria-current=false])),button:is(:hover,:active,:focus),button:is([aria-current]:not([aria-current=false])){--pico-background-color:var(--pico-primary-hover-background);--pico-border-color:var(--pico-primary-hover-border);--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0));--pico-color:var(--pico-primary-inverse)}[role=button]:focus,[role=button]:is([aria-current]:not([aria-current=false])):focus,[type=button]:focus,[type=button]:is([aria-current]:not([aria-current=false])):focus,[type=file]::file-selector-button:focus,[type=file]::file-selector-button:is([aria-current]:not([aria-current=false])):focus,[type=reset]:focus,[type=reset]:is([aria-current]:not([aria-current=false])):focus,[type=submit]:focus,[type=submit]:is([aria-current]:not([aria-current=false])):focus,button:focus,button:is([aria-current]:not([aria-current=false])):focus{--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--pico-outline-width) var(--pico-primary-focus)}[type=button],[type=reset],[type=submit]{margin-bottom:var(--pico-spacing)}[type=file]::file-selector-button,[type=reset]{--pico-background-color:var(--pico-secondary-background);--pico-border-color:var(--pico-secondary-border);--pico-color:var(--pico-secondary-inverse);cursor:pointer}[type=file]::file-selector-button:is([aria-current]:not([aria-current=false]),:hover,:active,:focus),[type=reset]:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){--pico-background-color:var(--pico-secondary-hover-background);--pico-border-color:var(--pico-secondary-hover-border);--pico-color:var(--pico-secondary-inverse)}[type=file]::file-selector-button:focus,[type=reset]:focus{--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--pico-outline-width) var(--pico-secondary-focus)}:where(button,[type=submit],[type=reset],[type=button],[role=button])[disabled],:where(fieldset[disabled]) :is(button,[type=submit],[type=button],[type=reset],[role=button]){opacity:.5;pointer-events:none}:where(table){width:100%;border-collapse:collapse;border-spacing:0;text-indent:0}td,th{padding:calc(var(--pico-spacing)/ 2) var(--pico-spacing);border-bottom:var(--pico-border-width) solid var(--pico-table-border-color);background-color:var(--pico-background-color);color:var(--pico-color);font-weight:var(--pico-font-weight);text-align:left;text-align:start}tfoot td,tfoot th{border-top:var(--pico-border-width) solid var(--pico-table-border-color);border-bottom:0}table.striped tbody tr:nth-child(odd) td,table.striped tbody tr:nth-child(odd) th{background-color:var(--pico-table-row-stripped-background-color)}:where(audio,canvas,iframe,img,svg,video){vertical-align:middle}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}:where(iframe){border-style:none}img{max-width:100%;height:auto;border-style:none}:where(svg:not([fill])){fill:currentColor}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-size:.875em;font-family:var(--pico-font-family)}pre code{font-size:inherit;font-family:inherit}pre{-ms-overflow-style:scrollbar;overflow:auto}code,kbd,pre{border-radius:var(--pico-border-radius);background:var(--pico-code-background-color);color:var(--pico-code-color);font-weight:var(--pico-font-weight);line-height:initial}code,kbd{display:inline-block;padding:.375rem}pre{display:block;margin-bottom:var(--pico-spacing);overflow-x:auto}pre>code{display:block;padding:var(--pico-spacing);background:0 0;line-height:var(--pico-line-height)}kbd{background-color:var(--pico-code-kbd-background-color);color:var(--pico-code-kbd-color);vertical-align:baseline}figure{display:block;margin:0;padding:0}figure figcaption{padding:calc(var(--pico-spacing) * .5) 0;color:var(--pico-muted-color)}hr{height:0;margin:var(--pico-typography-spacing-vertical) 0;border:0;border-top:1px solid var(--pico-muted-border-color);color:inherit}[hidden],template{display:none!important}canvas{display:inline-block}input,optgroup,select,textarea{margin:0;font-size:1rem;line-height:var(--pico-line-height);font-family:inherit;letter-spacing:inherit}input{overflow:visible}select{text-transform:none}legend{max-width:100%;padding:0;color:inherit;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{padding:0}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}::-moz-focus-inner{padding:0;border-style:none}:-moz-focusring{outline:0}:-moz-ui-invalid{box-shadow:none}::-ms-expand{display:none}[type=file],[type=range]{padding:0;border-width:0}input:not([type=checkbox],[type=radio],[type=range]){height:calc(1rem * var(--pico-line-height) + var(--pico-form-element-spacing-vertical) * 2 + var(--pico-border-width) * 2)}fieldset{width:100%;margin:0;margin-bottom:var(--pico-spacing);padding:0;border:0}fieldset legend,label{display:block;margin-bottom:calc(var(--pico-spacing) * .375);color:var(--pico-color);font-weight:var(--pico-form-label-font-weight,var(--pico-font-weight))}fieldset legend{margin-bottom:calc(var(--pico-spacing) * .5)}button[type=submit],input:not([type=checkbox],[type=radio]),select,textarea{width:100%}input:not([type=checkbox],[type=radio],[type=range],[type=file]),select,textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:var(--pico-form-element-spacing-vertical) var(--pico-form-element-spacing-horizontal)}input,select,textarea{--pico-background-color:var(--pico-form-element-background-color);--pico-border-color:var(--pico-form-element-border-color);--pico-color:var(--pico-form-element-color);--pico-box-shadow:none;border:var(--pico-border-width) solid var(--pico-border-color);border-radius:var(--pico-border-radius);outline:0;background-color:var(--pico-background-color);box-shadow:var(--pico-box-shadow);color:var(--pico-color);font-weight:var(--pico-font-weight);transition:background-color var(--pico-transition),border-color var(--pico-transition),color var(--pico-transition),box-shadow var(--pico-transition)}:where(select,textarea):not([readonly]):is(:active,:focus),input:not([type=submit],[type=button],[type=reset],[type=checkbox],[type=radio],[readonly]):is(:active,:focus){--pico-background-color:var(--pico-form-element-active-background-color)}:where(select,textarea):not([readonly]):is(:active,:focus),input:not([type=submit],[type=button],[type=reset],[role=switch],[readonly]):is(:active,:focus){--pico-border-color:var(--pico-form-element-active-border-color)}:where(select,textarea):not([readonly]):focus,input:not([type=submit],[type=button],[type=reset],[type=range],[type=file],[readonly]):focus{--pico-box-shadow:0 0 0 var(--pico-outline-width) var(--pico-form-element-focus-color)}:where(fieldset[disabled]) :is(input:not([type=submit],[type=button],[type=reset]),select,textarea),input:not([type=submit],[type=button],[type=reset])[disabled],label[aria-disabled=true],select[disabled],textarea[disabled]{opacity:var(--pico-form-element-disabled-opacity);pointer-events:none}label[aria-disabled=true] input[disabled]{opacity:1}:where(input,select,textarea):not([type=checkbox],[type=radio],[type=date],[type=datetime-local],[type=month],[type=time],[type=week],[type=range])[aria-invalid]{padding-right:calc(var(--pico-form-element-spacing-horizontal) + 1.5rem)!important;padding-left:var(--pico-form-element-spacing-horizontal);padding-inline-start:var(--pico-form-element-spacing-horizontal)!important;padding-inline-end:calc(var(--pico-form-element-spacing-horizontal) + 1.5rem)!important;background-position:center right .75rem;background-size:1rem auto;background-repeat:no-repeat}:where(input,select,textarea):not([type=checkbox],[type=radio],[type=date],[type=datetime-local],[type=month],[type=time],[type=week],[type=range])[aria-invalid=false]:not(select){background-image:var(--pico-icon-valid)}:where(input,select,textarea):not([type=checkbox],[type=radio],[type=date],[type=datetime-local],[type=month],[type=time],[type=week],[type=range])[aria-invalid=true]:not(select){background-image:var(--pico-icon-invalid)}:where(input,select,textarea)[aria-invalid=false]{--pico-border-color:var(--pico-form-element-valid-border-color)}:where(input,select,textarea)[aria-invalid=false]:is(:active,:focus){--pico-border-color:var(--pico-form-element-valid-active-border-color)!important}:where(input,select,textarea)[aria-invalid=false]:is(:active,:focus):not([type=checkbox],[type=radio]){--pico-box-shadow:0 0 0 var(--pico-outline-width) var(--pico-form-element-valid-focus-color)!important}:where(input,select,textarea)[aria-invalid=true]{--pico-border-color:var(--pico-form-element-invalid-border-color)}:where(input,select,textarea)[aria-invalid=true]:is(:active,:focus){--pico-border-color:var(--pico-form-element-invalid-active-border-color)!important}:where(input,select,textarea)[aria-invalid=true]:is(:active,:focus):not([type=checkbox],[type=radio]){--pico-box-shadow:0 0 0 var(--pico-outline-width) var(--pico-form-element-invalid-focus-color)!important}[dir=rtl] :where(input,select,textarea):not([type=checkbox],[type=radio]):is([aria-invalid],[aria-invalid=true],[aria-invalid=false]){background-position:center left .75rem}input::-webkit-input-placeholder,input::placeholder,select:invalid,textarea::-webkit-input-placeholder,textarea::placeholder{color:var(--pico-form-element-placeholder-color);opacity:1}input:not([type=checkbox],[type=radio]),select,textarea{margin-bottom:var(--pico-spacing)}select::-ms-expand{border:0;background-color:transparent}select:not([multiple],[size]){padding-right:calc(var(--pico-form-element-spacing-horizontal) + 1.5rem);padding-left:var(--pico-form-element-spacing-horizontal);padding-inline-start:var(--pico-form-element-spacing-horizontal);padding-inline-end:calc(var(--pico-form-element-spacing-horizontal) + 1.5rem);background-image:var(--pico-icon-chevron);background-position:center right .75rem;background-size:1rem auto;background-repeat:no-repeat}select[multiple] option:checked{background:var(--pico-form-element-selected-background-color);color:var(--pico-form-element-color)}[dir=rtl] select:not([multiple],[size]){background-position:center left .75rem}textarea{display:block;resize:vertical}textarea[aria-invalid]{--pico-icon-height:calc(1rem * var(--pico-line-height) + var(--pico-form-element-spacing-vertical) * 2 + var(--pico-border-width) * 2);background-position:top right .75rem!important;background-size:1rem var(--pico-icon-height)!important}:where(input,select,textarea,fieldset)+small{display:block;width:100%;margin-top:calc(var(--pico-spacing) * -.75);margin-bottom:var(--pico-spacing);color:var(--pico-muted-color)}:where(input,select,textarea,fieldset)[aria-invalid=false]+small{color:var(--pico-ins-color)}:where(input,select,textarea,fieldset)[aria-invalid=true]+small{color:var(--pico-del-color)}label>:where(input,select,textarea){margin-top:calc(var(--pico-spacing) * .25)}label:has([type=checkbox],[type=radio]){width:-moz-fit-content;width:fit-content;cursor:pointer}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:1.25em;height:1.25em;margin-top:-.125em;margin-inline-end:.5em;border-width:var(--pico-border-width);vertical-align:middle;cursor:pointer}[type=checkbox]::-ms-check,[type=radio]::-ms-check{display:none}[type=checkbox]:checked,[type=checkbox]:checked:active,[type=checkbox]:checked:focus,[type=radio]:checked,[type=radio]:checked:active,[type=radio]:checked:focus{--pico-background-color:var(--pico-primary-background);--pico-border-color:var(--pico-primary-border);background-image:var(--pico-icon-checkbox);background-position:center;background-size:.75em auto;background-repeat:no-repeat}[type=checkbox]~label,[type=radio]~label{display:inline-block;margin-bottom:0;cursor:pointer}[type=checkbox]~label:not(:last-of-type),[type=radio]~label:not(:last-of-type){margin-inline-end:1em}[type=checkbox]:indeterminate{--pico-background-color:var(--pico-primary-background);--pico-border-color:var(--pico-primary-border);background-image:var(--pico-icon-minus);background-position:center;background-size:.75em auto;background-repeat:no-repeat}[type=radio]{border-radius:50%}[type=radio]:checked,[type=radio]:checked:active,[type=radio]:checked:focus{--pico-background-color:var(--pico-primary-inverse);border-width:.35em;background-image:none}[type=checkbox][role=switch]{--pico-background-color:var(--pico-switch-background-color);--pico-color:var(--pico-switch-color);width:2.25em;height:1.25em;border:var(--pico-border-width) solid var(--pico-border-color);border-radius:1.25em;background-color:var(--pico-background-color);line-height:1.25em}[type=checkbox][role=switch]:not([aria-invalid]){--pico-border-color:var(--pico-switch-background-color)}[type=checkbox][role=switch]:before{display:block;aspect-ratio:1;height:100%;border-radius:50%;background-color:var(--pico-color);box-shadow:var(--pico-switch-thumb-box-shadow);content:"";transition:margin .1s ease-in-out}[type=checkbox][role=switch]:focus{--pico-background-color:var(--pico-switch-background-color);--pico-border-color:var(--pico-switch-background-color)}[type=checkbox][role=switch]:checked{--pico-background-color:var(--pico-switch-checked-background-color);--pico-border-color:var(--pico-switch-checked-background-color);background-image:none}[type=checkbox][role=switch]:checked::before{margin-inline-start:calc(2.25em - 1.25em)}[type=checkbox][role=switch][disabled]{--pico-background-color:var(--pico-border-color)}[type=checkbox][aria-invalid=false]:checked,[type=checkbox][aria-invalid=false]:checked:active,[type=checkbox][aria-invalid=false]:checked:focus,[type=checkbox][role=switch][aria-invalid=false]:checked,[type=checkbox][role=switch][aria-invalid=false]:checked:active,[type=checkbox][role=switch][aria-invalid=false]:checked:focus{--pico-background-color:var(--pico-form-element-valid-border-color)}[type=checkbox]:checked:active[aria-invalid=true],[type=checkbox]:checked:focus[aria-invalid=true],[type=checkbox]:checked[aria-invalid=true],[type=checkbox][role=switch]:checked:active[aria-invalid=true],[type=checkbox][role=switch]:checked:focus[aria-invalid=true],[type=checkbox][role=switch]:checked[aria-invalid=true]{--pico-background-color:var(--pico-form-element-invalid-border-color)}[type=checkbox][aria-invalid=false]:checked,[type=checkbox][aria-invalid=false]:checked:active,[type=checkbox][aria-invalid=false]:checked:focus,[type=checkbox][role=switch][aria-invalid=false]:checked,[type=checkbox][role=switch][aria-invalid=false]:checked:active,[type=checkbox][role=switch][aria-invalid=false]:checked:focus,[type=radio][aria-invalid=false]:checked,[type=radio][aria-invalid=false]:checked:active,[type=radio][aria-invalid=false]:checked:focus{--pico-border-color:var(--pico-form-element-valid-border-color)}[type=checkbox]:checked:active[aria-invalid=true],[type=checkbox]:checked:focus[aria-invalid=true],[type=checkbox]:checked[aria-invalid=true],[type=checkbox][role=switch]:checked:active[aria-invalid=true],[type=checkbox][role=switch]:checked:focus[aria-invalid=true],[type=checkbox][role=switch]:checked[aria-invalid=true],[type=radio]:checked:active[aria-invalid=true],[type=radio]:checked:focus[aria-invalid=true],[type=radio]:checked[aria-invalid=true]{--pico-border-color:var(--pico-form-element-invalid-border-color)}[type=color]::-webkit-color-swatch-wrapper{padding:0}[type=color]::-moz-focus-inner{padding:0}[type=color]::-webkit-color-swatch{border:0;border-radius:calc(var(--pico-border-radius) * .5)}[type=color]::-moz-color-swatch{border:0;border-radius:calc(var(--pico-border-radius) * .5)}input:not([type=checkbox],[type=radio],[type=range],[type=file]):is([type=date],[type=datetime-local],[type=month],[type=time],[type=week]){--pico-icon-position:0.75rem;--pico-icon-width:1rem;padding-right:calc(var(--pico-icon-width) + var(--pico-icon-position));background-image:var(--pico-icon-date);background-position:center right var(--pico-icon-position);background-size:var(--pico-icon-width) auto;background-repeat:no-repeat}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=time]{background-image:var(--pico-icon-time)}[type=date]::-webkit-calendar-picker-indicator,[type=datetime-local]::-webkit-calendar-picker-indicator,[type=month]::-webkit-calendar-picker-indicator,[type=time]::-webkit-calendar-picker-indicator,[type=week]::-webkit-calendar-picker-indicator{width:var(--pico-icon-width);margin-right:calc(var(--pico-icon-width) * -1);margin-left:var(--pico-icon-position);opacity:0}@-moz-document url-prefix(){[type=date],[type=datetime-local],[type=month],[type=time],[type=week]{padding-right:var(--pico-form-element-spacing-horizontal)!important;background-image:none!important}}[dir=rtl] :is([type=date],[type=datetime-local],[type=month],[type=time],[type=week]){text-align:right}[type=file]{--pico-color:var(--pico-muted-color);margin-left:calc(var(--pico-outline-width) * -1);padding:calc(var(--pico-form-element-spacing-vertical) * .5) 0;padding-left:var(--pico-outline-width);border:0;border-radius:0;background:0 0}[type=file]::file-selector-button{margin-right:calc(var(--pico-spacing)/ 2);padding:calc(var(--pico-form-element-spacing-vertical) * .5) var(--pico-form-element-spacing-horizontal)}[type=file]:is(:hover,:active,:focus)::file-selector-button{--pico-background-color:var(--pico-secondary-hover-background);--pico-border-color:var(--pico-secondary-hover-border)}[type=file]:focus::file-selector-button{--pico-box-shadow:var(--pico-button-hover-box-shadow, 0 0 0 rgba(0, 0, 0, 0)),0 0 0 var(--pico-outline-width) var(--pico-secondary-focus)}[type=range]{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:100%;height:1.25rem;background:0 0}[type=range]::-webkit-slider-runnable-track{width:100%;height:.375rem;border-radius:var(--pico-border-radius);background-color:var(--pico-range-border-color);-webkit-transition:background-color var(--pico-transition),box-shadow var(--pico-transition);transition:background-color var(--pico-transition),box-shadow var(--pico-transition)}[type=range]::-moz-range-track{width:100%;height:.375rem;border-radius:var(--pico-border-radius);background-color:var(--pico-range-border-color);-moz-transition:background-color var(--pico-transition),box-shadow var(--pico-transition);transition:background-color var(--pico-transition),box-shadow var(--pico-transition)}[type=range]::-ms-track{width:100%;height:.375rem;border-radius:var(--pico-border-radius);background-color:var(--pico-range-border-color);-ms-transition:background-color var(--pico-transition),box-shadow var(--pico-transition);transition:background-color var(--pico-transition),box-shadow var(--pico-transition)}[type=range]::-webkit-slider-thumb{-webkit-appearance:none;width:1.25rem;height:1.25rem;margin-top:-.4375rem;border:2px solid var(--pico-range-thumb-border-color);border-radius:50%;background-color:var(--pico-range-thumb-color);cursor:pointer;-webkit-transition:background-color var(--pico-transition),transform var(--pico-transition);transition:background-color var(--pico-transition),transform var(--pico-transition)}[type=range]::-moz-range-thumb{-webkit-appearance:none;width:1.25rem;height:1.25rem;margin-top:-.4375rem;border:2px solid var(--pico-range-thumb-border-color);border-radius:50%;background-color:var(--pico-range-thumb-color);cursor:pointer;-moz-transition:background-color var(--pico-transition),transform var(--pico-transition);transition:background-color var(--pico-transition),transform var(--pico-transition)}[type=range]::-ms-thumb{-webkit-appearance:none;width:1.25rem;height:1.25rem;margin-top:-.4375rem;border:2px solid var(--pico-range-thumb-border-color);border-radius:50%;background-color:var(--pico-range-thumb-color);cursor:pointer;-ms-transition:background-color var(--pico-transition),transform var(--pico-transition);transition:background-color var(--pico-transition),transform var(--pico-transition)}[type=range]:active,[type=range]:focus-within{--pico-range-border-color:var(--pico-range-active-border-color);--pico-range-thumb-color:var(--pico-range-thumb-active-color)}[type=range]:active::-webkit-slider-thumb{transform:scale(1.25)}[type=range]:active::-moz-range-thumb{transform:scale(1.25)}[type=range]:active::-ms-thumb{transform:scale(1.25)}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search]{padding-inline-start:calc(var(--pico-form-element-spacing-horizontal) + 1.75rem);background-image:var(--pico-icon-search);background-position:center left calc(var(--pico-form-element-spacing-horizontal) + .125rem);background-size:1rem auto;background-repeat:no-repeat}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid]{padding-inline-start:calc(var(--pico-form-element-spacing-horizontal) + 1.75rem)!important;background-position:center left 1.125rem,center right .75rem}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid=false]{background-image:var(--pico-icon-search),var(--pico-icon-valid)}input:not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid=true]{background-image:var(--pico-icon-search),var(--pico-icon-invalid)}[dir=rtl] :where(input):not([type=checkbox],[type=radio],[type=range],[type=file])[type=search]{background-position:center right 1.125rem}[dir=rtl] :where(input):not([type=checkbox],[type=radio],[type=range],[type=file])[type=search][aria-invalid]{background-position:center right 1.125rem,center left .75rem}details{display:block;margin-bottom:var(--pico-spacing)}details summary{line-height:1rem;list-style-type:none;cursor:pointer;transition:color var(--pico-transition)}details summary:not([role]){color:var(--pico-accordion-close-summary-color)}details summary::-webkit-details-marker{display:none}details summary::marker{display:none}details summary::-moz-list-bullet{list-style-type:none}details summary::after{display:block;width:1rem;height:1rem;margin-inline-start:calc(var(--pico-spacing,1rem) * .5);float:right;transform:rotate(-90deg);background-image:var(--pico-icon-chevron);background-position:right center;background-size:1rem auto;background-repeat:no-repeat;content:"";transition:transform var(--pico-transition)}details summary:focus{outline:0}details summary:focus:not([role]){color:var(--pico-accordion-active-summary-color)}details summary:focus-visible:not([role]){outline:var(--pico-outline-width) solid var(--pico-primary-focus);outline-offset:calc(var(--pico-spacing,1rem) * 0.5);color:var(--pico-primary)}details summary[role=button]{width:100%;text-align:left}details summary[role=button]::after{height:calc(1rem * var(--pico-line-height,1.5))}details[open]>summary{margin-bottom:var(--pico-spacing)}details[open]>summary:not([role]):not(:focus){color:var(--pico-accordion-open-summary-color)}details[open]>summary::after{transform:rotate(0)}[dir=rtl] details summary{text-align:right}[dir=rtl] details summary::after{float:left;background-position:left center}article{margin-bottom:var(--pico-block-spacing-vertical);padding:var(--pico-block-spacing-vertical) var(--pico-block-spacing-horizontal);border-radius:var(--pico-border-radius);background:var(--pico-card-background-color);box-shadow:var(--pico-card-box-shadow)}article>footer,article>header{margin-right:calc(var(--pico-block-spacing-horizontal) * -1);margin-left:calc(var(--pico-block-spacing-horizontal) * -1);padding:calc(var(--pico-block-spacing-vertical) * .66) var(--pico-block-spacing-horizontal);background-color:var(--pico-card-sectioning-background-color)}article>header{margin-top:calc(var(--pico-block-spacing-vertical) * -1);margin-bottom:var(--pico-block-spacing-vertical);border-bottom:var(--pico-border-width) solid var(--pico-card-border-color);border-top-right-radius:var(--pico-border-radius);border-top-left-radius:var(--pico-border-radius)}article>footer{margin-top:var(--pico-block-spacing-vertical);margin-bottom:calc(var(--pico-block-spacing-vertical) * -1);border-top:var(--pico-border-width) solid var(--pico-card-border-color);border-bottom-right-radius:var(--pico-border-radius);border-bottom-left-radius:var(--pico-border-radius)}[role=group],[role=search]{display:inline-flex;position:relative;width:100%;margin-bottom:var(--pico-spacing);border-radius:var(--pico-border-radius);box-shadow:var(--pico-group-box-shadow,0 0 0 transparent);vertical-align:middle;transition:box-shadow var(--pico-transition)}[role=group] input:not([type=checkbox],[type=radio]),[role=group] select,[role=group]>*,[role=search] input:not([type=checkbox],[type=radio]),[role=search] select,[role=search]>*{position:relative;flex:1 1 auto;margin-bottom:0}[role=group] input:not([type=checkbox],[type=radio]):not(:first-child),[role=group] select:not(:first-child),[role=group]>:not(:first-child),[role=search] input:not([type=checkbox],[type=radio]):not(:first-child),[role=search] select:not(:first-child),[role=search]>:not(:first-child){margin-left:0;border-top-left-radius:0;border-bottom-left-radius:0}[role=group] input:not([type=checkbox],[type=radio]):not(:last-child),[role=group] select:not(:last-child),[role=group]>:not(:last-child),[role=search] input:not([type=checkbox],[type=radio]):not(:last-child),[role=search] select:not(:last-child),[role=search]>:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}[role=group] input:not([type=checkbox],[type=radio]):focus,[role=group] select:focus,[role=group]>:focus,[role=search] input:not([type=checkbox],[type=radio]):focus,[role=search] select:focus,[role=search]>:focus{z-index:2}[role=group] [role=button]:not(:first-child),[role=group] [type=button]:not(:first-child),[role=group] [type=reset]:not(:first-child),[role=group] [type=submit]:not(:first-child),[role=group] button:not(:first-child),[role=group] input:not([type=checkbox],[type=radio]):not(:first-child),[role=group] select:not(:first-child),[role=search] [role=button]:not(:first-child),[role=search] [type=button]:not(:first-child),[role=search] [type=reset]:not(:first-child),[role=search] [type=submit]:not(:first-child),[role=search] button:not(:first-child),[role=search] input:not([type=checkbox],[type=radio]):not(:first-child),[role=search] select:not(:first-child){margin-left:calc(var(--pico-border-width) * -1)}[role=group] [role=button],[role=group] [type=button],[role=group] [type=reset],[role=group] [type=submit],[role=group] button,[role=search] [role=button],[role=search] [type=button],[role=search] [type=reset],[role=search] [type=submit],[role=search] button{width:auto}@supports selector(:has(*)){[role=group]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus),[role=search]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus){--pico-group-box-shadow:var(--pico-group-box-shadow-focus-with-button)}[role=group]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus) input:not([type=checkbox],[type=radio]),[role=group]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus) select,[role=search]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus) input:not([type=checkbox],[type=radio]),[role=search]:has(button:focus,[type=submit]:focus,[type=button]:focus,[role=button]:focus) select{border-color:transparent}[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus),[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus){--pico-group-box-shadow:var(--pico-group-box-shadow-focus-with-input)}[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus) [role=button],[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus) [type=button],[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus) [type=submit],[role=group]:has(input:not([type=submit],[type=button]):focus,select:focus) button,[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus) [role=button],[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus) [type=button],[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus) [type=submit],[role=search]:has(input:not([type=submit],[type=button]):focus,select:focus) button{--pico-button-box-shadow:0 0 0 var(--pico-border-width) var(--pico-primary-border);--pico-button-hover-box-shadow:0 0 0 var(--pico-border-width) var(--pico-primary-hover-border)}[role=group] [role=button]:focus,[role=group] [type=button]:focus,[role=group] [type=reset]:focus,[role=group] [type=submit]:focus,[role=group] button:focus,[role=search] [role=button]:focus,[role=search] [type=button]:focus,[role=search] [type=reset]:focus,[role=search] [type=submit]:focus,[role=search] button:focus{box-shadow:none}}[role=search]>:first-child{border-top-left-radius:5rem;border-bottom-left-radius:5rem}[role=search]>:last-child{border-top-right-radius:5rem;border-bottom-right-radius:5rem}[aria-busy=true]:not(input,select,textarea,html){white-space:nowrap}[aria-busy=true]:not(input,select,textarea,html)::before{display:inline-block;width:1em;height:1em;background-image:var(--pico-icon-loading);background-size:1em auto;background-repeat:no-repeat;content:"";vertical-align:-.125em}[aria-busy=true]:not(input,select,textarea,html):not(:empty)::before{margin-inline-end:calc(var(--pico-spacing) * .5)}[aria-busy=true]:not(input,select,textarea,html):empty{text-align:center}[role=button][aria-busy=true],[type=button][aria-busy=true],[type=reset][aria-busy=true],[type=submit][aria-busy=true],a[aria-busy=true],button[aria-busy=true]{pointer-events:none}:root{--pico-scrollbar-width:0px}dialog{display:flex;z-index:999;position:fixed;top:0;right:0;bottom:0;left:0;align-items:center;justify-content:center;width:inherit;min-width:100%;height:inherit;min-height:100%;padding:0;border:0;-webkit-backdrop-filter:var(--pico-modal-overlay-backdrop-filter);backdrop-filter:var(--pico-modal-overlay-backdrop-filter);background-color:var(--pico-modal-overlay-background-color);color:var(--pico-color)}dialog article{width:100%;max-height:calc(100vh - var(--pico-spacing) * 2);margin:var(--pico-spacing);overflow:auto}@media (min-width:576px){dialog article{max-width:510px}}@media (min-width:768px){dialog article{max-width:700px}}dialog article>header>*{margin-bottom:0}dialog article>header :is(a,button)[rel=prev]{margin:0;margin-left:var(--pico-spacing);padding:0;float:right}dialog article>footer{text-align:right}dialog article>footer [role=button],dialog article>footer button{margin-bottom:0}dialog article>footer [role=button]:not(:first-of-type),dialog article>footer button:not(:first-of-type){margin-left:calc(var(--pico-spacing) * .5)}dialog article :is(a,button)[rel=prev]{display:block;width:1rem;height:1rem;margin-top:calc(var(--pico-spacing) * -1);margin-bottom:var(--pico-spacing);margin-left:auto;border:none;background-image:var(--pico-icon-close);background-position:center;background-size:auto 1rem;background-repeat:no-repeat;background-color:transparent;opacity:.5;transition:opacity var(--pico-transition)}dialog article :is(a,button)[rel=prev]:is([aria-current]:not([aria-current=false]),:hover,:active,:focus){opacity:1}dialog:not([open]),dialog[open=false]{display:none}:where(nav li)::before{float:left;content:"​"}nav,nav ul{display:flex}nav{justify-content:space-between;overflow:visible}nav ol,nav ul{align-items:center;margin-bottom:0;padding:0;list-style:none}nav ol:first-of-type,nav ul:first-of-type{margin-left:calc(var(--pico-nav-element-spacing-horizontal) * -1)}nav ol:last-of-type,nav ul:last-of-type{margin-right:calc(var(--pico-nav-element-spacing-horizontal) * -1)}nav li{display:inline-block;margin:0;padding:var(--pico-nav-element-spacing-vertical) var(--pico-nav-element-spacing-horizontal)}nav li :where(a,[role=link]){display:inline-block;margin:calc(var(--pico-nav-link-spacing-vertical) * -1) calc(var(--pico-nav-link-spacing-horizontal) * -1);padding:var(--pico-nav-link-spacing-vertical) var(--pico-nav-link-spacing-horizontal);border-radius:var(--pico-border-radius)}nav li :where(a,[role=link]):not(:hover){text-decoration:none}nav li [role=button],nav li [type=button],nav li button,nav li input:not([type=checkbox],[type=radio],[type=range],[type=file]),nav li select{height:auto;margin-right:inherit;margin-bottom:0;margin-left:inherit;padding:calc(var(--pico-nav-link-spacing-vertical) - var(--pico-border-width) * 2) var(--pico-nav-link-spacing-horizontal)}nav[aria-label=breadcrumb]{align-items:center;justify-content:start}nav[aria-label=breadcrumb] ul li:not(:first-child){margin-inline-start:var(--pico-nav-link-spacing-horizontal)}nav[aria-label=breadcrumb] ul li a{margin:calc(var(--pico-nav-link-spacing-vertical) * -1) 0;margin-inline-start:calc(var(--pico-nav-link-spacing-horizontal) * -1)}nav[aria-label=breadcrumb] ul li:not(:last-child)::after{display:inline-block;position:absolute;width:calc(var(--pico-nav-link-spacing-horizontal) * 4);margin:0 calc(var(--pico-nav-link-spacing-horizontal) * -1);content:var(--pico-nav-breadcrumb-divider);color:var(--pico-muted-color);text-align:center;text-decoration:none;white-space:nowrap}nav[aria-label=breadcrumb] a[aria-current]:not([aria-current=false]){background-color:transparent;color:inherit;text-decoration:none;pointer-events:none}aside li,aside nav,aside ol,aside ul{display:block}aside li{padding:calc(var(--pico-nav-element-spacing-vertical) * .5) var(--pico-nav-element-spacing-horizontal)}aside li a{display:block}aside li [role=button]{margin:inherit}[dir=rtl] nav[aria-label=breadcrumb] ul li:not(:last-child) ::after{content:"\\"}progress{display:inline-block;vertical-align:baseline}progress{-webkit-appearance:none;-moz-appearance:none;display:inline-block;appearance:none;width:100%;height:.5rem;margin-bottom:calc(var(--pico-spacing) * .5);overflow:hidden;border:0;border-radius:var(--pico-border-radius);background-color:var(--pico-progress-background-color);color:var(--pico-progress-color)}progress::-webkit-progress-bar{border-radius:var(--pico-border-radius);background:0 0}progress[value]::-webkit-progress-value{background-color:var(--pico-progress-color);-webkit-transition:inline-size var(--pico-transition);transition:inline-size var(--pico-transition)}progress::-moz-progress-bar{background-color:var(--pico-progress-color)}@media (prefers-reduced-motion:no-preference){progress:indeterminate{background:var(--pico-progress-background-color) linear-gradient(to right,var(--pico-progress-color) 30%,var(--pico-progress-background-color) 30%) top left/150% 150% no-repeat;animation:progress-indeterminate 1s linear infinite}progress:indeterminate[value]::-webkit-progress-value{background-color:transparent}progress:indeterminate::-moz-progress-bar{background-color:transparent}}@media (prefers-reduced-motion:no-preference){[dir=rtl] progress:indeterminate{animation-direction:reverse}}@keyframes progress-indeterminate{0%{background-position:200% 0}100%{background-position:-200% 0}}[data-tooltip]{position:relative}[data-tooltip]:not(a,button,input){border-bottom:1px dotted;text-decoration:none;cursor:help}[data-tooltip]::after,[data-tooltip]::before,[data-tooltip][data-placement=top]::after,[data-tooltip][data-placement=top]::before{display:block;z-index:99;position:absolute;bottom:100%;left:50%;padding:.25rem .5rem;overflow:hidden;transform:translate(-50%,-.25rem);border-radius:var(--pico-border-radius);background:var(--pico-tooltip-background-color);content:attr(data-tooltip);color:var(--pico-tooltip-color);font-style:normal;font-weight:var(--pico-font-weight);font-size:.875rem;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;opacity:0;pointer-events:none}[data-tooltip]::after,[data-tooltip][data-placement=top]::after{padding:0;transform:translate(-50%,0);border-top:.3rem solid;border-right:.3rem solid transparent;border-left:.3rem solid transparent;border-radius:0;background-color:transparent;content:"";color:var(--pico-tooltip-background-color)}[data-tooltip][data-placement=bottom]::after,[data-tooltip][data-placement=bottom]::before{top:100%;bottom:auto;transform:translate(-50%,.25rem)}[data-tooltip][data-placement=bottom]:after{transform:translate(-50%,-.3rem);border:.3rem solid transparent;border-bottom:.3rem solid}[data-tooltip][data-placement=left]::after,[data-tooltip][data-placement=left]::before{top:50%;right:100%;bottom:auto;left:auto;transform:translate(-.25rem,-50%)}[data-tooltip][data-placement=left]:after{transform:translate(.3rem,-50%);border:.3rem solid transparent;border-left:.3rem solid}[data-tooltip][data-placement=right]::after,[data-tooltip][data-placement=right]::before{top:50%;right:auto;bottom:auto;left:100%;transform:translate(.25rem,-50%)}[data-tooltip][data-placement=right]:after{transform:translate(-.3rem,-50%);border:.3rem solid transparent;border-right:.3rem solid}[data-tooltip]:focus::after,[data-tooltip]:focus::before,[data-tooltip]:hover::after,[data-tooltip]:hover::before{opacity:1}@media (hover:hover) and (pointer:fine){[data-tooltip]:focus::after,[data-tooltip]:focus::before,[data-tooltip]:hover::after,[data-tooltip]:hover::before{--pico-tooltip-slide-to:translate(-50%, -0.25rem);transform:translate(-50%,.75rem);animation-duration:.2s;animation-fill-mode:forwards;animation-name:tooltip-slide;opacity:0}[data-tooltip]:focus::after,[data-tooltip]:hover::after{--pico-tooltip-caret-slide-to:translate(-50%, 0rem);transform:translate(-50%,-.25rem);animation-name:tooltip-caret-slide}[data-tooltip][data-placement=bottom]:focus::after,[data-tooltip][data-placement=bottom]:focus::before,[data-tooltip][data-placement=bottom]:hover::after,[data-tooltip][data-placement=bottom]:hover::before{--pico-tooltip-slide-to:translate(-50%, 0.25rem);transform:translate(-50%,-.75rem);animation-name:tooltip-slide}[data-tooltip][data-placement=bottom]:focus::after,[data-tooltip][data-placement=bottom]:hover::after{--pico-tooltip-caret-slide-to:translate(-50%, -0.3rem);transform:translate(-50%,-.5rem);animation-name:tooltip-caret-slide}[data-tooltip][data-placement=left]:focus::after,[data-tooltip][data-placement=left]:focus::before,[data-tooltip][data-placement=left]:hover::after,[data-tooltip][data-placement=left]:hover::before{--pico-tooltip-slide-to:translate(-0.25rem, -50%);transform:translate(.75rem,-50%);animation-name:tooltip-slide}[data-tooltip][data-placement=left]:focus::after,[data-tooltip][data-placement=left]:hover::after{--pico-tooltip-caret-slide-to:translate(0.3rem, -50%);transform:translate(.05rem,-50%);animation-name:tooltip-caret-slide}[data-tooltip][data-placement=right]:focus::after,[data-tooltip][data-placement=right]:focus::before,[data-tooltip][data-placement=right]:hover::after,[data-tooltip][data-placement=right]:hover::before{--pico-tooltip-slide-to:translate(0.25rem, -50%);transform:translate(-.75rem,-50%);animation-name:tooltip-slide}[data-tooltip][data-placement=right]:focus::after,[data-tooltip][data-placement=right]:hover::after{--pico-tooltip-caret-slide-to:translate(-0.3rem, -50%);transform:translate(-.05rem,-50%);animation-name:tooltip-caret-slide}}@keyframes tooltip-slide{to{transform:var(--pico-tooltip-slide-to);opacity:1}}@keyframes tooltip-caret-slide{50%{opacity:0}to{transform:var(--pico-tooltip-caret-slide-to);opacity:1}}[aria-controls]{cursor:pointer}[aria-disabled=true],[disabled]{cursor:not-allowed}[aria-hidden=false][hidden]{display:initial}[aria-hidden=false][hidden]:not(:focus){clip:rect(0,0,0,0);position:absolute}[tabindex],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation}[dir=rtl]{direction:rtl}@media (prefers-reduced-motion:reduce){:not([aria-busy=true]),:not([aria-busy=true])::after,:not([aria-busy=true])::before{background-attachment:initial!important;animation-duration:1ms!important;animation-delay:-1ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-delay:0s!important;transition-duration:0s!important}} \ No newline at end of file diff --git a/css/unturf.css b/css/unturf.css new file mode 100644 index 0000000..3ce6f99 --- /dev/null +++ b/css/unturf.css @@ -0,0 +1,332 @@ +/* ============================================================ + unturf. shared stylesheet + ============================================================ */ + +/* ---- 1. custom properties ---- */ + +:root { + /* brand */ + --primary: #43a047; + + /* step label */ + --step-bg: var(--primary); + --step-text: #fff; + + /* callout boxes */ + --honest-border: #F44336; + --honest-bg: rgba(244, 67, 54, 0.05); + --recipe-border: #4CAF50; + --recipe-bg: rgba(76, 175, 80, 0.05); + --warning-border: #FF9800; + --warning-bg: rgba(255, 152, 0, 0.05); + + /* footnotes */ + --footnote-link: var(--primary); + --footnote-highlight-bg: rgba(67, 160, 71, 0.1); + --footnote-highlight-border: var(--primary); + + /* diagrams */ + --diagram-caption: #888; + + /* eight forms of capital */ + --capital-living: #4CAF50; + --capital-material: #795548; + --capital-financial: #607D8B; + --capital-intellectual: #2196F3; + --capital-experiential: #009688; + --capital-social: #FF9800; + --capital-cultural: #9C27B0; + --capital-spiritual: #E91E63; + + /* software page */ + --unsandbox-color: #c4b550; +} + +/* ---- 2. brand & typography ---- */ + +.unturf-brand, +.site-title { + font-family: 'chunkfiveregular', sans-serif; +} + +.site-title { + margin-bottom: 0; +} + +/* ---- 3. navigation ---- */ + +.nav-links { + margin-bottom: 2em; +} + +.nav-links a[aria-current="page"] { + font-weight: bold; + text-decoration: none; + color: inherit; + opacity: 0.7; +} + +/* ---- 4. layout ---- */ + +.content-wide { + max-width: 960px; +} + +.content-narrow { + max-width: 460px; +} + +/* ---- 5. content components ---- */ + +/* diagrams */ + +.diagram { + margin: 1.5em 0; + text-align: center; +} + +.diagram img { + max-width: 100%; + height: auto; +} + +.diagram figcaption { + font-size: 0.85em; + color: var(--diagram-caption); + margin-top: 0.5em; +} + +/* step labels */ + +.step-label { + display: inline-block; + background: var(--step-bg); + color: var(--step-text); + padding: 0.3em 0.75em; + font-size: 0.75em; + font-weight: bold; + letter-spacing: 0.08em; + border-radius: 0.25rem; + margin-bottom: 0.5em; +} + +/* callout boxes (shared structure) */ + +.honest-box, +.recipe-box, +.warning-box { + border-left-width: 4px; + border-left-style: solid; + padding: 0.75em 1em; + margin: 1em 0; + border-radius: 0 0.25rem 0.25rem 0; +} + +.honest-box { border-color: var(--honest-border); background: var(--honest-bg); } +.honest-box b { color: var(--honest-border); } + +.recipe-box { border-color: var(--recipe-border); background: var(--recipe-bg); } +.recipe-box b { color: var(--recipe-border); } + +.warning-box { border-color: var(--warning-border); background: var(--warning-bg); } +.warning-box b { color: var(--warning-border); } + +/* footnotes */ + +sup a { + text-decoration: none; + color: var(--footnote-link); + font-weight: bold; +} + +sup a:hover { + text-decoration: underline; +} + +.footnotes { + font-size: 0.85em; + line-height: 1.6; +} + +.footnotes ol { + padding-left: 1.5em; +} + +.footnotes li { + margin-bottom: 0.75em; +} + +.footnotes li:target { + background: var(--footnote-highlight-bg); + padding: 0.25em; + border-left: 3px solid var(--footnote-highlight-border); +} + +/* capital cards (eight forms of capital) */ + +.capital-card { + border-left: 4px solid var(--primary); + padding: 0.5em 1em; + margin: 1em 0; +} + +.capital-card h4 { + margin-bottom: 0.25em; +} + +.capital-card--living { border-color: var(--capital-living); } +.capital-card--living h4 { color: var(--capital-living); } +.capital-card--material { border-color: var(--capital-material); } +.capital-card--material h4 { color: var(--capital-material); } +.capital-card--financial { border-color: var(--capital-financial); } +.capital-card--financial h4 { color: var(--capital-financial); } +.capital-card--intellectual { border-color: var(--capital-intellectual); } +.capital-card--intellectual h4 { color: var(--capital-intellectual); } +.capital-card--experiential { border-color: var(--capital-experiential); } +.capital-card--experiential h4 { color: var(--capital-experiential); } +.capital-card--social { border-color: var(--capital-social); } +.capital-card--social h4 { color: var(--capital-social); } +.capital-card--cultural { border-color: var(--capital-cultural); } +.capital-card--cultural h4 { color: var(--capital-cultural); } +.capital-card--spiritual { border-color: var(--capital-spiritual); } +.capital-card--spiritual h4 { color: var(--capital-spiritual); } + +/* ---- 6. software page ---- */ + +.software-page body { + overflow-x: hidden; +} + +.software-page h1, +.software-page h2 { + font-family: 'chunkfiveregular', sans-serif; +} + +.software-page h1 a, +.software-page h2 a { + color: inherit; + text-decoration: none; +} + +.unsandbox-logo { + font-family: ArialPixel, system-ui, sans-serif; + color: var(--unsandbox-color); +} + +.neopig-logo { + font-family: system-ui, sans-serif; + font-weight: 900; + background: linear-gradient(135deg, #ff6b6b, #ff8e53, #ff6b9d); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.unfirehose-logo { + font-family: system-ui, sans-serif; + font-weight: 900; + color: #ffffff !important; + -webkit-text-fill-color: #ffffff; +} + +.unfirehose-logo span { + color: #e53935 !important; + -webkit-text-fill-color: #e53935; +} + +.software-page hgroup { + margin-bottom: 1rem; +} + +.software-page hgroup p { + margin-top: 0; +} + +.logo-container a { + display: block; +} + +.logo-container { + background: rgba(255, 255, 255, 0.05); + padding: 1rem; + border-radius: 8px; + display: inline-block; + max-width: 100%; +} + +.software-page article { + margin-bottom: 1rem; +} + +.software-page article h2 { + margin-top: 0; + margin-bottom: 0.5rem; +} + +.software-page article p { + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} + +.software-page article img { + max-width: 100%; + height: auto; + display: block; +} + +.software-page article nav ul { + display: grid !important; + grid-template-columns: 1fr; + gap: 0.25rem; + padding: 0; + margin: 0.5rem 0; +} + +.software-page article nav ul li a { + font-size: 0.85rem; +} + +.projects-grid { + display: grid; + grid-template-columns: 1fr; + gap: 1rem; +} + +/* ---- 7. responsive ---- */ + +@media (prefers-color-scheme: light) { + .logo-container { + background: rgba(0, 0, 0, 0.03); + } + .unfirehose-logo { + color: #000000 !important; + -webkit-text-fill-color: #000000; + } +} + +@media (min-width: 768px) { + .projects-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 1.5rem; + margin-bottom: 1rem; + } + + .project-uncloseai { + grid-column: 1 / -1; + } + + .software-page article nav ul { + grid-template-columns: repeat(2, 1fr); + gap: 0.5rem; + } + + .project-makepostsell nav ul, + .project-remarkbox nav ul { + grid-template-columns: repeat(3, 1fr); + } + + .logo-container { + max-width: 400px; + } +} diff --git a/eight-forms-of-capital/img/community-loop.dot b/eight-forms-of-capital/img/community-loop.dot new file mode 100644 index 0000000..25bbba5 --- /dev/null +++ b/eight-forms-of-capital/img/community-loop.dot @@ -0,0 +1,96 @@ +digraph community { + bgcolor="transparent" + rankdir=TB + pad=0.5 + nodesep=0.8 + ranksep=1.0 + + node [ + fontname="Helvetica" + fontsize=13 + style="filled" + penwidth=2 + shape=box + width=2.0 + height=0.9 + ] + + edge [ + fontname="Helvetica" + fontsize=10 + penwidth=3 + ] + + social [ + label="SOCIAL\nrelationships Β· trust Β· favors" + fillcolor="#FF9800" + fontcolor="white" + color="#E65100" + ] + + spiritual [ + label="SPIRITUAL\npresence Β· awareness Β· depth" + fillcolor="#E91E63" + fontcolor="white" + color="#AD1457" + ] + + cultural [ + label="CULTURAL\nshared story Β· art Β· ceremony\n(emerges from community only)" + fillcolor="#9C27B0" + fontcolor="white" + color="#6A1B9A" + penwidth=3 + ] + + living [ + label="LIVING\nstewardship sustained\nacross generations" + fillcolor="#4CAF50" + fontcolor="white" + color="#2E7D32" + ] + + social -> cultural [ + label="relationships weave\ninto shared meaning" + color="#FF9800" + fontcolor="#E65100" + ] + + spiritual -> cultural [ + label="depth feeds\ncollective purpose" + color="#E91E63" + fontcolor="#AD1457" + ] + + cultural -> living [ + label="shared ethics sustain\necological care\nfor generations" + color="#9C27B0" + fontcolor="#6A1B9A" + ] + + living -> social [ + label="abundance creates\nspace for connection" + color="#4CAF50" + fontcolor="#2E7D32" + style=dashed + ] + + living -> spiritual [ + label="nature deepens\nawareness" + color="#4CAF50" + fontcolor="#2E7D32" + style=dashed + ] + + // Note + note [ + label="cultural capital\nis the only form that\ncan only be gathered\nby a community\nnever by individuals alone" + shape=note + fillcolor="#F3E5F5" + fontcolor="#4A148C" + color="#9C27B0" + fontsize=11 + ] + + cultural -> note [style=dotted color="#9C27B0" arrowhead=none] +} diff --git a/eight-forms-of-capital/img/community-loop.png b/eight-forms-of-capital/img/community-loop.png new file mode 100644 index 0000000..84c52ec Binary files /dev/null and b/eight-forms-of-capital/img/community-loop.png differ diff --git a/eight-forms-of-capital/img/community-loop.svg b/eight-forms-of-capital/img/community-loop.svg new file mode 100644 index 0000000..458ef76 --- /dev/null +++ b/eight-forms-of-capital/img/community-loop.svg @@ -0,0 +1,100 @@ + + + + + + +community + + +social + +SOCIAL +relationships Β· trust Β· favors + + + +cultural + +CULTURAL +shared story Β· art Β· ceremony +(emerges from community only) + + + +social->cultural + + +relationships weave +into shared meaning + + + +spiritual + +SPIRITUAL +presence Β· awareness Β· depth + + + +spiritual->cultural + + +depth feeds +collective purpose + + + +living + +LIVING +stewardship sustained +across generations + + + +cultural->living + + +shared ethics sustain +ecological care +for generations + + + +note + + + +cultural capital +is the only form that +can only be gathered +by a community +never by individuals alone + + + +cultural->note + + + + +living->social + + +abundance creates +space for connection + + + +living->spiritual + + +nature deepens +awareness + + + diff --git a/eight-forms-of-capital/img/extractive-flow.dot b/eight-forms-of-capital/img/extractive-flow.dot new file mode 100644 index 0000000..0c7f92f --- /dev/null +++ b/eight-forms-of-capital/img/extractive-flow.dot @@ -0,0 +1,75 @@ +digraph extractive { + bgcolor="transparent" + rankdir=LR + pad=0.5 + nodesep=0.8 + ranksep=1.2 + + node [ + fontname="Helvetica" + fontsize=12 + style="filled" + penwidth=2 + shape=box + width=1.6 + height=0.8 + ] + + edge [ + fontname="Helvetica" + fontsize=10 + ] + + // Title + title [ + label="THE EXTRACTIVE PATTERN\n(degenerative)" + shape=plaintext + fillcolor="transparent" + fontsize=16 + fontcolor="#C62828" + ] + + // The extraction chain + living [label="LIVING\ncapital" fillcolor="#4CAF50" fontcolor="white" color="#2E7D32"] + material [label="MATERIAL\ncapital" fillcolor="#795548" fontcolor="white" color="#4E342E"] + financial [label="FINANCIAL\ncapital" fillcolor="#607D8B" fontcolor="white" color="#37474F" penwidth=4] + + living -> material [ + label="extract\nresources" + penwidth=4 + color="#F44336" + fontcolor="#C62828" + ] + + material -> financial [ + label="sell\ngoods" + penwidth=4 + color="#F44336" + fontcolor="#C62828" + ] + + // Side extractions + social [label="SOCIAL\ncapital" fillcolor="#FF9800" fontcolor="white" color="#E65100"] + cultural [label="CULTURAL\ncapital" fillcolor="#9C27B0" fontcolor="white" color="#6A1B9A"] + spiritual [label="SPIRITUAL\ncapital" fillcolor="#E91E63" fontcolor="white" color="#AD1457"] + intellectual [label="INTELLECTUAL\ncapital" fillcolor="#2196F3" fontcolor="white" color="#0D47A1"] + experiential [label="EXPERIENTIAL\ncapital" fillcolor="#009688" fontcolor="white" color="#00695C"] + + social -> financial [label="leverage\nconnections" penwidth=2 color="#F44336" fontcolor="#C62828"] + cultural -> financial [label="commodify\nart & story" penwidth=2 color="#F44336" fontcolor="#C62828"] + spiritual -> financial [label="exploit\nfaith" penwidth=2 color="#F44336" fontcolor="#C62828"] + + intellectual -> material [label="facilitate" penwidth=1.5 color="#888888" style=dashed fontcolor="#666666"] + experiential -> material [label="facilitate" penwidth=1.5 color="#888888" style=dashed fontcolor="#666666"] + + // Financial grows exponentially + financial -> financial [ + label="exponential\ngrowth" + penwidth=4 + color="#F44336" + fontcolor="#C62828" + ] + + // Invisible edges for layout + title -> living [style=invis] +} diff --git a/eight-forms-of-capital/img/extractive-flow.png b/eight-forms-of-capital/img/extractive-flow.png new file mode 100644 index 0000000..b460fdb Binary files /dev/null and b/eight-forms-of-capital/img/extractive-flow.png differ diff --git a/eight-forms-of-capital/img/extractive-flow.svg b/eight-forms-of-capital/img/extractive-flow.svg new file mode 100644 index 0000000..aacc150 --- /dev/null +++ b/eight-forms-of-capital/img/extractive-flow.svg @@ -0,0 +1,138 @@ + + + + + + +extractive + + +title + +THE EXTRACTIVE PATTERN +(degenerative) + + + +living + +LIVING +capital + + + + +material + +MATERIAL +capital + + + +living->material + + +extract +resources + + + +financial + +FINANCIAL +capital + + + +material->financial + + +sell +goods + + + +financial->financial + + +exponential +growth + + + +social + +SOCIAL +capital + + + +social->financial + + +leverage +connections + + + +cultural + +CULTURAL +capital + + + +cultural->financial + + +commodify +art & story + + + +spiritual + +SPIRITUAL +capital + + + +spiritual->financial + + +exploit +faith + + + +intellectual + +INTELLECTUAL +capital + + + +intellectual->material + + +facilitate + + + +experiential + +EXPERIENTIAL +capital + + + +experiential->material + + +facilitate + + + diff --git a/eight-forms-of-capital/img/full-mesh.dot b/eight-forms-of-capital/img/full-mesh.dot new file mode 100644 index 0000000..3f96f07 --- /dev/null +++ b/eight-forms-of-capital/img/full-mesh.dot @@ -0,0 +1,117 @@ +graph mesh { + bgcolor="transparent" + layout=neato + pad=0.5 + overlap=false + sep="+20" + + node [ + fontname="Helvetica" + fontsize=11 + style="filled" + shape=circle + width=1.5 + fixedsize=true + penwidth=2 + ] + + edge [ + penwidth=1.2 + color="#BDBDBD" + len=2.5 + ] + + // Nurture capitals (warm colors, top) + living [ + label="LIVING\n\nsoil Β· water\nplants Β· animals" + fillcolor="#4CAF50" + fontcolor="white" + color="#2E7D32" + ] + + social [ + label="SOCIAL\n\nrelationships\ninfluence" + fillcolor="#FF9800" + fontcolor="white" + color="#E65100" + ] + + cultural [ + label="CULTURAL\n\nshared story\nart Β· myth" + fillcolor="#9C27B0" + fontcolor="white" + color="#6A1B9A" + ] + + spiritual [ + label="SPIRITUAL\n\nkarma Β· faith\npresence" + fillcolor="#E91E63" + fontcolor="white" + color="#AD1457" + ] + + // Transactional capitals (cool colors, bottom) + financial [ + label="FINANCIAL\n\nmoney\ncurrencies" + fillcolor="#607D8B" + fontcolor="white" + color="#37474F" + ] + + material [ + label="MATERIAL\n\ntools Β· buildings\ninfrastructure" + fillcolor="#795548" + fontcolor="white" + color="#4E342E" + ] + + intellectual [ + label="INTELLECTUAL\n\nideas\nknowledge" + fillcolor="#2196F3" + fontcolor="white" + color="#0D47A1" + ] + + experiential [ + label="EXPERIENTIAL\n\nknow-how\nskill" + fillcolor="#009688" + fontcolor="white" + color="#00695C" + ] + + // Full mesh β€” every node connects to every other + living -- social + living -- cultural + living -- spiritual + living -- financial + living -- material + living -- intellectual + living -- experiential + + social -- cultural + social -- spiritual + social -- financial + social -- material + social -- intellectual + social -- experiential + + cultural -- spiritual + cultural -- financial + cultural -- material + cultural -- intellectual + cultural -- experiential + + spiritual -- financial + spiritual -- material + spiritual -- intellectual + spiritual -- experiential + + financial -- material + financial -- intellectual + financial -- experiential + + material -- intellectual + material -- experiential + + intellectual -- experiential +} diff --git a/eight-forms-of-capital/img/full-mesh.png b/eight-forms-of-capital/img/full-mesh.png new file mode 100644 index 0000000..248f0ca Binary files /dev/null and b/eight-forms-of-capital/img/full-mesh.png differ diff --git a/eight-forms-of-capital/img/full-mesh.svg b/eight-forms-of-capital/img/full-mesh.svg new file mode 100644 index 0000000..c1cbf33 --- /dev/null +++ b/eight-forms-of-capital/img/full-mesh.svg @@ -0,0 +1,216 @@ + + + + + + +mesh + + +living + +LIVING +soil Β· water +plants Β· animals + + + +social + +SOCIAL +relationships +influence + + + +living--social + + + + +cultural + +CULTURAL +shared story +art Β· myth + + + +living--cultural + + + + +spiritual + +SPIRITUAL +karma Β· faith +presence + + + +living--spiritual + + + + +financial + +FINANCIAL +money +currencies + + + +living--financial + + + + +material + +MATERIAL +tools Β· buildings +infrastructure + + + +living--material + + + + +intellectual + +INTELLECTUAL +ideas +knowledge + + + +living--intellectual + + + + +experiential + +EXPERIENTIAL +know-how +skill + + + +living--experiential + + + + +social--cultural + + + + +social--spiritual + + + + +social--financial + + + + +social--material + + + + +social--intellectual + + + + +social--experiential + + + + +cultural--spiritual + + + + +cultural--financial + + + + +cultural--material + + + + +cultural--intellectual + + + + +cultural--experiential + + + + +spiritual--financial + + + + +spiritual--material + + + + +spiritual--intellectual + + + + +spiritual--experiential + + + + +financial--material + + + + +financial--intellectual + + + + +financial--experiential + + + + +material--intellectual + + + + +material--experiential + + + + +intellectual--experiential + + + + diff --git a/eight-forms-of-capital/img/individual-forms.dot b/eight-forms-of-capital/img/individual-forms.dot new file mode 100644 index 0000000..d902496 --- /dev/null +++ b/eight-forms-of-capital/img/individual-forms.dot @@ -0,0 +1,91 @@ +digraph individual { + bgcolor="transparent" + rankdir=TB + pad=0.3 + nodesep=0.3 + ranksep=0.6 + + node [ + fontname="Helvetica" + fontsize=10 + style="filled" + penwidth=2 + shape=box + width=2.4 + height=0.6 + ] + + edge [ + penwidth=1.5 + fontsize=9 + fontname="Helvetica" + color="#888888" + ] + + // Each form described + living [ + label="LIVING CAPITAL β€” the foundation\nsoil Β· water Β· plants Β· animals Β· health Β· ecosystems" + fillcolor="#4CAF50" + fontcolor="white" + color="#2E7D32" + ] + + social [ + label="SOCIAL CAPITAL β€” influence & connection\nrelationships Β· networks Β· trust Β· favors owed" + fillcolor="#FF9800" + fontcolor="white" + color="#E65100" + ] + + material [ + label="MATERIAL CAPITAL β€” physical things\ntools Β· buildings Β· infrastructure Β· raw resources" + fillcolor="#795548" + fontcolor="white" + color="#4E342E" + ] + + financial [ + label="FINANCIAL CAPITAL β€” the medium\nmoney Β· currencies Β· securities" + fillcolor="#607D8B" + fontcolor="white" + color="#37474F" + ] + + intellectual [ + label="INTELLECTUAL CAPITAL β€” ideas\nconcepts Β· knowledge Β· theory Β· truth" + fillcolor="#2196F3" + fontcolor="white" + color="#0D47A1" + ] + + experiential [ + label="EXPERIENTIAL CAPITAL β€” know-how\nembodied skill Β· practice Β· mastery" + fillcolor="#009688" + fontcolor="white" + color="#00695C" + ] + + spiritual [ + label="SPIRITUAL CAPITAL β€” inner depth\nkarma Β· faith Β· presence Β· awareness of the whole" + fillcolor="#E91E63" + fontcolor="white" + color="#AD1457" + ] + + cultural [ + label="CULTURAL CAPITAL β€” shared experience\nstory Β· myth Β· song Β· art Β· ceremony Β· shared ethics" + fillcolor="#9C27B0" + fontcolor="white" + color="#6A1B9A" + ] + + // Flow from foundation upward + living -> material [label="resources extracted" fontcolor="#666666"] + material -> financial [label="goods sold" fontcolor="#666666"] + financial -> intellectual [label="education funded" fontcolor="#666666"] + intellectual -> experiential [label="theory practiced" fontcolor="#666666"] + experiential -> social [label="skills shared" fontcolor="#666666"] + social -> cultural [label="community emerges" fontcolor="#666666"] + cultural -> spiritual [label="meaning deepens" fontcolor="#666666"] + spiritual -> living [label="reverence sustains life" fontcolor="#666666" style=dashed] +} diff --git a/eight-forms-of-capital/img/individual-forms.png b/eight-forms-of-capital/img/individual-forms.png new file mode 100644 index 0000000..1877817 Binary files /dev/null and b/eight-forms-of-capital/img/individual-forms.png differ diff --git a/eight-forms-of-capital/img/individual-forms.svg b/eight-forms-of-capital/img/individual-forms.svg new file mode 100644 index 0000000..2922740 --- /dev/null +++ b/eight-forms-of-capital/img/individual-forms.svg @@ -0,0 +1,124 @@ + + + + + + +individual + + +living + +LIVING CAPITAL β€” the foundation +soil Β· water Β· plants Β· animals Β· health Β· ecosystems + + + +material + +MATERIAL CAPITAL β€” physical things +tools Β· buildings Β· infrastructure Β· raw resources + + + +living->material + + +resources extracted + + + +social + +SOCIAL CAPITAL β€” influence & connection +relationships Β· networks Β· trust Β· favors owed + + + +cultural + +CULTURAL CAPITAL β€” shared experience +story Β· myth Β· song Β· art Β· ceremony Β· shared ethics + + + +social->cultural + + +community emerges + + + +financial + +FINANCIAL CAPITAL β€” the medium +money Β· currencies Β· securities + + + +material->financial + + +goods sold + + + +intellectual + +INTELLECTUAL CAPITAL β€” ideas +concepts Β· knowledge Β· theory Β· truth + + + +financial->intellectual + + +education funded + + + +experiential + +EXPERIENTIAL CAPITAL β€” know-how +embodied skill Β· practice Β· mastery + + + +intellectual->experiential + + +theory practiced + + + +experiential->social + + +skills shared + + + +spiritual + +SPIRITUAL CAPITAL β€” inner depth +karma Β· faith Β· presence Β· awareness of the whole + + + +spiritual->living + + +reverence sustains life + + + +cultural->spiritual + + +meaning deepens + + + diff --git a/eight-forms-of-capital/img/knowledge-loop.dot b/eight-forms-of-capital/img/knowledge-loop.dot new file mode 100644 index 0000000..f9c4bd4 --- /dev/null +++ b/eight-forms-of-capital/img/knowledge-loop.dot @@ -0,0 +1,62 @@ +digraph knowledge { + bgcolor="transparent" + rankdir=LR + pad=0.5 + nodesep=1.0 + ranksep=1.2 + + node [ + fontname="Helvetica" + fontsize=13 + style="filled" + penwidth=2 + shape=box + width=1.8 + height=1.0 + ] + + edge [ + fontname="Helvetica" + fontsize=10 + penwidth=3 + ] + + intellectual [ + label="INTELLECTUAL\n\nread Β· study\nunderstand theory" + fillcolor="#2196F3" + fontcolor="white" + color="#0D47A1" + ] + + experiential [ + label="EXPERIENTIAL\n\npractice Β· build\nfeel the dough" + fillcolor="#009688" + fontcolor="white" + color="#00695C" + ] + + living [ + label="LIVING\n\nobserve results\nharvest feedback" + fillcolor="#4CAF50" + fontcolor="white" + color="#2E7D32" + ] + + intellectual -> experiential [ + label="apply theory\nthrough practice" + color="#2196F3" + fontcolor="#0D47A1" + ] + + experiential -> living [ + label="skilled hands\ntransform the land" + color="#009688" + fontcolor="#00695C" + ] + + living -> intellectual [ + label="observation\ngenerates new\nunderstanding" + color="#4CAF50" + fontcolor="#2E7D32" + ] +} diff --git a/eight-forms-of-capital/img/knowledge-loop.png b/eight-forms-of-capital/img/knowledge-loop.png new file mode 100644 index 0000000..9bc6317 Binary files /dev/null and b/eight-forms-of-capital/img/knowledge-loop.png differ diff --git a/eight-forms-of-capital/img/knowledge-loop.svg b/eight-forms-of-capital/img/knowledge-loop.svg new file mode 100644 index 0000000..621155a --- /dev/null +++ b/eight-forms-of-capital/img/knowledge-loop.svg @@ -0,0 +1,61 @@ + + + + + + +knowledge + + +intellectual + +INTELLECTUAL +read Β· study +understand theory + + + +experiential + +EXPERIENTIAL +practice Β· build +feel the dough + + + +intellectual->experiential + + +apply theory +through practice + + + +living + +LIVING +observe results +harvest feedback + + + +experiential->living + + +skilled hands +transform the land + + + +living->intellectual + + +observation +generates new +understanding + + + diff --git a/eight-forms-of-capital/img/nurture-vs-transactional.dot b/eight-forms-of-capital/img/nurture-vs-transactional.dot new file mode 100644 index 0000000..6a70249 --- /dev/null +++ b/eight-forms-of-capital/img/nurture-vs-transactional.dot @@ -0,0 +1,86 @@ +digraph groups { + bgcolor="transparent" + rankdir=TB + pad=0.5 + nodesep=0.6 + ranksep=1.0 + + node [ + fontname="Helvetica" + fontsize=12 + style="filled" + penwidth=2 + shape=box + width=1.8 + height=0.8 + ] + + edge [ + penwidth=2 + arrowsize=0.8 + ] + + // Nurture capitals + subgraph cluster_nurture { + label="NURTURE CAPITALS\ngrow these Β· cultivate these Β· protect these" + labeljust=c + fontname="Helvetica" + fontsize=14 + fontcolor="#2E7D32" + style="rounded,filled" + color="#4CAF50" + fillcolor="#E8F5E9" + penwidth=3 + + living [label="LIVING\nsoil Β· water Β· life" fillcolor="#4CAF50" fontcolor="white" color="#2E7D32"] + social [label="SOCIAL\nrelationships Β· trust" fillcolor="#FF9800" fontcolor="white" color="#E65100"] + cultural [label="CULTURAL\nshared story Β· art" fillcolor="#9C27B0" fontcolor="white" color="#6A1B9A"] + spiritual [label="SPIRITUAL\nfaith Β· presence" fillcolor="#E91E63" fontcolor="white" color="#AD1457"] + } + + // Transactional capitals + subgraph cluster_transactional { + label="TRANSACTIONAL CAPITALS\nfacilitate exchange Β· instrumental Β· tools" + labeljust=c + fontname="Helvetica" + fontsize=14 + fontcolor="#37474F" + style="rounded,filled" + color="#607D8B" + fillcolor="#ECEFF1" + penwidth=3 + + financial [label="FINANCIAL\nmoney Β· currency" fillcolor="#607D8B" fontcolor="white" color="#37474F"] + material [label="MATERIAL\ntools Β· buildings" fillcolor="#795548" fontcolor="white" color="#4E342E"] + intellectual [label="INTELLECTUAL\nideas Β· knowledge" fillcolor="#2196F3" fontcolor="white" color="#0D47A1"] + experiential [label="EXPERIENTIAL\nskill Β· know-how" fillcolor="#009688" fontcolor="white" color="#00695C"] + } + + // The extractive arrow (current system) + living -> financial [ + label="current system\nextracts nurture\nto grow financial" + color="#F44336" + fontcolor="#C62828" + fontsize=10 + penwidth=3 + style=bold + ] + + social -> financial [color="#F44336" penwidth=3 style=bold] + cultural -> financial [color="#F44336" penwidth=3 style=bold] + spiritual -> financial [color="#F44336" penwidth=3 style=bold] + + // The regenerative arrow (the goal) + financial -> living [ + label="regenerative system\ninvests transactional\nback into nurture" + color="#4CAF50" + fontcolor="#2E7D32" + fontsize=10 + penwidth=3 + style=dashed + ] + + // Intellectual and experiential facilitate + intellectual -> living [color="#2196F3" style=dashed penwidth=1.5 label="understanding\nguides action" fontsize=9 fontcolor="#1565C0"] + experiential -> living [color="#009688" style=dashed penwidth=1.5 label="skilled hands\nheal land" fontsize=9 fontcolor="#00695C"] +} diff --git a/eight-forms-of-capital/img/nurture-vs-transactional.png b/eight-forms-of-capital/img/nurture-vs-transactional.png new file mode 100644 index 0000000..219032c Binary files /dev/null and b/eight-forms-of-capital/img/nurture-vs-transactional.png differ diff --git a/eight-forms-of-capital/img/nurture-vs-transactional.svg b/eight-forms-of-capital/img/nurture-vs-transactional.svg new file mode 100644 index 0000000..b454337 --- /dev/null +++ b/eight-forms-of-capital/img/nurture-vs-transactional.svg @@ -0,0 +1,132 @@ + + + + + + +groups + +cluster_nurture + +NURTURE CAPITALS +grow these Β· cultivate these Β· protect these + + +cluster_transactional + +TRANSACTIONAL CAPITALS +facilitate exchange Β· instrumental Β· tools + + + +living + +LIVING +soil Β· water Β· life + + + +financial + +FINANCIAL +money Β· currency + + + +living->financial + + +current system +extracts nurture +to grow financial + + + +social + +SOCIAL +relationships Β· trust + + + +social->financial + + + + + +cultural + +CULTURAL +shared story Β· art + + + +cultural->financial + + + + + +spiritual + +SPIRITUAL +faith Β· presence + + + +spiritual->financial + + + + + +financial->living + + +regenerative system +invests transactional +back into nurture + + + +material + +MATERIAL +tools Β· buildings + + + +intellectual + +INTELLECTUAL +ideas Β· knowledge + + + +intellectual->living + + +understanding +guides action + + + +experiential + +EXPERIENTIAL +skill Β· know-how + + + +experiential->living + + +skilled hands +heal land + + + diff --git a/eight-forms-of-capital/img/permacomputer-capital.dot b/eight-forms-of-capital/img/permacomputer-capital.dot new file mode 100644 index 0000000..7b436b0 --- /dev/null +++ b/eight-forms-of-capital/img/permacomputer-capital.dot @@ -0,0 +1,115 @@ +digraph permacomputer_capital { + bgcolor="transparent" + rankdir=TB + pad=0.5 + nodesep=0.5 + ranksep=0.9 + + node [ + fontname="Helvetica" + fontsize=11 + style="filled" + penwidth=2 + ] + + edge [ + fontname="Helvetica" + fontsize=9 + penwidth=2 + ] + + // The permacomputer at center + pc [ + label="PERMACOMPUTER\n\ntruth Β· freedom\nharmony Β· love" + shape=doublecircle + fillcolor="#263238" + fontcolor="#CDDC39" + color="#CDDC39" + fontsize=12 + width=2.2 + fixedsize=true + ] + + // How each form maps to permacomputer values + living [ + label="LIVING\n\nthe hardware lives\nrepair not replace\ndurable materials" + shape=box + fillcolor="#4CAF50" + fontcolor="white" + color="#2E7D32" + width=2.0 + ] + + intellectual [ + label="INTELLECTUAL\n\nopen source code\npublic domain\nseeds to sprout" + shape=box + fillcolor="#2196F3" + fontcolor="white" + color="#0D47A1" + width=2.0 + ] + + social [ + label="SOCIAL\n\nby the people\nfor the people\nvoluntary participation" + shape=box + fillcolor="#FF9800" + fontcolor="white" + color="#E65100" + width=2.0 + ] + + experiential [ + label="EXPERIENTIAL\n\nall layers accessible\nlearn by operating\nhuman operators" + shape=box + fillcolor="#009688" + fontcolor="white" + color="#00695C" + width=2.0 + ] + + cultural [ + label="CULTURAL\n\nutopia of the commons\nshared infrastructure\ncode outlasts authors" + shape=box + fillcolor="#9C27B0" + fontcolor="white" + color="#6A1B9A" + width=2.0 + ] + + financial [ + label="FINANCIAL\n\ncosts near zero\nno monopoly\nfree as water" + shape=box + fillcolor="#607D8B" + fontcolor="white" + color="#37474F" + width=2.0 + ] + + material [ + label="MATERIAL\n\nservers Β· networks\nIPv4 Β· IPv6\ncryptography" + shape=box + fillcolor="#795548" + fontcolor="white" + color="#4E342E" + width=2.0 + ] + + spiritual [ + label="SPIRITUAL\n\nlove as fuel\nwu wei Β· effortless\nhomeostasis" + shape=box + fillcolor="#E91E63" + fontcolor="white" + color="#AD1457" + width=2.0 + ] + + // Connections to permacomputer + living -> pc [label="HARMONY" color="#4CAF50" fontcolor="#2E7D32"] + intellectual -> pc [label="TRUTH" color="#2196F3" fontcolor="#0D47A1"] + social -> pc [label="FREEDOM" color="#FF9800" fontcolor="#E65100"] + experiential -> pc [label="TRUTH" color="#009688" fontcolor="#00695C"] + cultural -> pc [label="FREEDOM" color="#9C27B0" fontcolor="#6A1B9A"] + financial -> pc [label="FREEDOM" color="#607D8B" fontcolor="#37474F"] + material -> pc [label="HARMONY" color="#795548" fontcolor="#4E342E"] + spiritual -> pc [label="LOVE" color="#E91E63" fontcolor="#AD1457"] +} diff --git a/eight-forms-of-capital/img/permacomputer-capital.png b/eight-forms-of-capital/img/permacomputer-capital.png new file mode 100644 index 0000000..88cc855 Binary files /dev/null and b/eight-forms-of-capital/img/permacomputer-capital.png differ diff --git a/eight-forms-of-capital/img/permacomputer-capital.svg b/eight-forms-of-capital/img/permacomputer-capital.svg new file mode 100644 index 0000000..1cc9c19 --- /dev/null +++ b/eight-forms-of-capital/img/permacomputer-capital.svg @@ -0,0 +1,149 @@ + + + + + + +permacomputer_capital + + +pc + + +PERMACOMPUTER +truth Β· freedom +harmony Β· love + + + +living + +LIVING +the hardware lives +repair not replace +durable materials + + + +living->pc + + +HARMONY + + + +intellectual + +INTELLECTUAL +open source code +public domain +seeds to sprout + + + +intellectual->pc + + +TRUTH + + + +social + +SOCIAL +by the people +for the people +voluntary participation + + + +social->pc + + +FREEDOM + + + +experiential + +EXPERIENTIAL +all layers accessible +learn by operating +human operators + + + +experiential->pc + + +TRUTH + + + +cultural + +CULTURAL +utopia of the commons +shared infrastructure +code outlasts authors + + + +cultural->pc + + +FREEDOM + + + +financial + +FINANCIAL +costs near zero +no monopoly +free as water + + + +financial->pc + + +FREEDOM + + + +material + +MATERIAL +servers Β· networks +IPv4 Β· IPv6 +cryptography + + + +material->pc + + +HARMONY + + + +spiritual + +SPIRITUAL +love as fuel +wu wei Β· effortless +homeostasis + + + +spiritual->pc + + +LOVE + + + diff --git a/eight-forms-of-capital/img/pollution.dot b/eight-forms-of-capital/img/pollution.dot new file mode 100644 index 0000000..03f1cd8 --- /dev/null +++ b/eight-forms-of-capital/img/pollution.dot @@ -0,0 +1,116 @@ +digraph pollution { + bgcolor="transparent" + rankdir=TB + pad=0.5 + nodesep=0.4 + ranksep=0.8 + + node [ + fontname="Helvetica" + fontsize=11 + style="filled" + penwidth=2 + shape=box + width=2.0 + height=0.7 + ] + + edge [ + penwidth=2 + fontsize=9 + fontname="Helvetica" + ] + + label="WHEN CAPITAL ACCUMULATES WITHOUT FLOWING\nit becomes pollution" + labelloc=t + fontname="Helvetica" + fontsize=16 + fontcolor="#C62828" + + // Healthy flow + subgraph cluster_flow { + label="HEALTHY: capital flows" + fontsize=12 + fontcolor="#2E7D32" + style="rounded,dashed" + color="#4CAF50" + fillcolor="#E8F5E9" + + flow [ + label="pool β†’ flow β†’ pool\nexchange creates vitality" + shape=ellipse + fillcolor="#C8E6C9" + fontcolor="#1B5E20" + color="#4CAF50" + ] + } + + // Stagnation pollution for each form + subgraph cluster_pollution { + label="STAGNANT: capital hoarded" + fontsize=12 + fontcolor="#C62828" + style="rounded,dashed" + color="#F44336" + fillcolor="#FFEBEE" + + financial_p [ + label="FINANCIAL pollution\nparanoia Β· control Β· isolation" + fillcolor="#607D8B" + fontcolor="white" + color="#37474F" + ] + + material_p [ + label="MATERIAL pollution\nwaste Β· physical contamination" + fillcolor="#795548" + fontcolor="white" + color="#4E342E" + ] + + living_p [ + label="LIVING pollution\ninvasive species Β· ecosystem collapse" + fillcolor="#4CAF50" + fontcolor="white" + color="#2E7D32" + ] + + social_p [ + label="SOCIAL pollution\nparasitism Β· codependency" + fillcolor="#FF9800" + fontcolor="white" + color="#E65100" + ] + + intellectual_p [ + label="INTELLECTUAL pollution\nivory tower Β· detachment from reality" + fillcolor="#2196F3" + fontcolor="white" + color="#0D47A1" + ] + + experiential_p [ + label="EXPERIENTIAL pollution\naction addiction Β· no reflection" + fillcolor="#009688" + fontcolor="white" + color="#00695C" + ] + + cultural_p [ + label="CULTURAL pollution\ncolonization Β· disconnection" + fillcolor="#9C27B0" + fontcolor="white" + color="#6A1B9A" + ] + + spiritual_p [ + label="SPIRITUAL pollution\ncults Β· hollow institutions" + fillcolor="#E91E63" + fontcolor="white" + color="#AD1457" + ] + } + + flow -> financial_p [label="hoarding" color="#F44336" fontcolor="#C62828"] + flow -> living_p [label="imbalance" color="#F44336" fontcolor="#C62828" style=invis] +} diff --git a/eight-forms-of-capital/img/pollution.png b/eight-forms-of-capital/img/pollution.png new file mode 100644 index 0000000..4984d85 Binary files /dev/null and b/eight-forms-of-capital/img/pollution.png differ diff --git a/eight-forms-of-capital/img/pollution.svg b/eight-forms-of-capital/img/pollution.svg new file mode 100644 index 0000000..628806e --- /dev/null +++ b/eight-forms-of-capital/img/pollution.svg @@ -0,0 +1,95 @@ + + + + + + +pollution +WHEN CAPITAL ACCUMULATES WITHOUT FLOWING +it becomes pollution + +cluster_flow + +HEALTHY: capital flows + + +cluster_pollution + +STAGNANT: capital hoarded + + + +flow + +pool β†’ flow β†’ pool +exchange creates vitality + + + +financial_p + +FINANCIAL pollution +paranoia Β· control Β· isolation + + + +flow->financial_p + + +hoarding + + + +living_p + +LIVING pollution +invasive species Β· ecosystem collapse + + + + +material_p + +MATERIAL pollution +waste Β· physical contamination + + + +social_p + +SOCIAL pollution +parasitism Β· codependency + + + +intellectual_p + +INTELLECTUAL pollution +ivory tower Β· detachment from reality + + + +experiential_p + +EXPERIENTIAL pollution +action addiction Β· no reflection + + + +cultural_p + +CULTURAL pollution +colonization Β· disconnection + + + +spiritual_p + +SPIRITUAL pollution +cults Β· hollow institutions + + + diff --git a/eight-forms-of-capital/img/regenerative-flow.dot b/eight-forms-of-capital/img/regenerative-flow.dot new file mode 100644 index 0000000..b17e363 --- /dev/null +++ b/eight-forms-of-capital/img/regenerative-flow.dot @@ -0,0 +1,89 @@ +digraph regenerative { + bgcolor="transparent" + rankdir=TB + pad=0.5 + nodesep=0.7 + ranksep=1.0 + + node [ + fontname="Helvetica" + fontsize=12 + style="filled" + penwidth=2 + shape=box + width=1.6 + height=0.8 + ] + + edge [ + fontname="Helvetica" + fontsize=10 + ] + + // Title + title [ + label="THE REGENERATIVE PATTERN\n(grow what survives)" + shape=plaintext + fillcolor="transparent" + fontsize=16 + fontcolor="#2E7D32" + ] + + // Core regenerative loop + financial [label="FINANCIAL\ncapital" fillcolor="#607D8B" fontcolor="white" color="#37474F"] + living [label="LIVING\ncapital" fillcolor="#4CAF50" fontcolor="white" color="#2E7D32" penwidth=4] + material [label="MATERIAL\ncapital" fillcolor="#795548" fontcolor="white" color="#4E342E"] + + financial -> living [ + label="invest in\nregeneration" + penwidth=4 + color="#4CAF50" + fontcolor="#2E7D32" + ] + + living -> material [ + label="harvest only\nsurplus" + penwidth=3 + color="#4CAF50" + fontcolor="#2E7D32" + style=dashed + ] + + material -> financial [ + label="sustain\nthe cycle" + penwidth=2 + color="#4CAF50" + fontcolor="#2E7D32" + style=dashed + ] + + // Nurture growth + social [label="SOCIAL\ncapital" fillcolor="#FF9800" fontcolor="white" color="#E65100"] + cultural [label="CULTURAL\ncapital" fillcolor="#9C27B0" fontcolor="white" color="#6A1B9A"] + spiritual [label="SPIRITUAL\ncapital" fillcolor="#E91E63" fontcolor="white" color="#AD1457"] + intellectual [label="INTELLECTUAL\ncapital" fillcolor="#2196F3" fontcolor="white" color="#0D47A1"] + experiential [label="EXPERIENTIAL\ncapital" fillcolor="#009688" fontcolor="white" color="#00695C"] + + // Regenerative investments + financial -> social [label="fund\ncommunity" penwidth=2 color="#4CAF50" fontcolor="#2E7D32"] + financial -> intellectual [label="fund\neducation" penwidth=2 color="#4CAF50" fontcolor="#2E7D32"] + + // Knowledge cycle + intellectual -> experiential [label="learn by\ndoing" penwidth=2 color="#2196F3" fontcolor="#0D47A1"] + experiential -> living [label="skilled care\nheals land" penwidth=3 color="#009688" fontcolor="#00695C"] + + // Community cycle + social -> cultural [label="community\ncreates culture" penwidth=2 color="#FF9800" fontcolor="#E65100"] + cultural -> living [label="shared ethics\nsustain stewardship" penwidth=2 color="#9C27B0" fontcolor="#6A1B9A"] + spiritual -> cultural [label="depth feeds\nshared meaning" penwidth=2 color="#E91E63" fontcolor="#AD1457"] + + // Living capital grows + living -> living [ + label="self-renewing\nabundance" + penwidth=3 + color="#2E7D32" + fontcolor="#1B5E20" + ] + + title -> financial [style=invis] +} diff --git a/eight-forms-of-capital/img/regenerative-flow.png b/eight-forms-of-capital/img/regenerative-flow.png new file mode 100644 index 0000000..668fc2b Binary files /dev/null and b/eight-forms-of-capital/img/regenerative-flow.png differ diff --git a/eight-forms-of-capital/img/regenerative-flow.svg b/eight-forms-of-capital/img/regenerative-flow.svg new file mode 100644 index 0000000..b243108 --- /dev/null +++ b/eight-forms-of-capital/img/regenerative-flow.svg @@ -0,0 +1,164 @@ + + + + + + +regenerative + + +title + +THE REGENERATIVE PATTERN +(grow what survives) + + + +financial + +FINANCIAL +capital + + + + +living + +LIVING +capital + + + +financial->living + + +invest in +regeneration + + + +social + +SOCIAL +capital + + + +financial->social + + +fund +community + + + +intellectual + +INTELLECTUAL +capital + + + +financial->intellectual + + +fund +education + + + +living->living + + +self-renewing +abundance + + + +material + +MATERIAL +capital + + + +living->material + + +harvest only +surplus + + + +material->financial + + +sustain +the cycle + + + +cultural + +CULTURAL +capital + + + +social->cultural + + +community +creates culture + + + +cultural->living + + +shared ethics +sustain stewardship + + + +spiritual + +SPIRITUAL +capital + + + +spiritual->cultural + + +depth feeds +shared meaning + + + +experiential + +EXPERIENTIAL +capital + + + +intellectual->experiential + + +learn by +doing + + + +experiential->living + + +skilled care +heals land + + + diff --git a/eight-forms-of-capital/index.html b/eight-forms-of-capital/index.html new file mode 100644 index 0000000..f4f4106 --- /dev/null +++ b/eight-forms-of-capital/index.html @@ -0,0 +1,303 @@ + + + + eight forms of capital — unturf. + + + + + + + + + +
+ +

unturf.

+

grow food not lawn

+ + +

Eight Forms of Capital

+ +

+We measure wealth in dollars. That measurement captures one form of capital out of eight. Seven others flow through every community, every ecosystem, every permacomputer. When we see all eight, we see a full mesh of abundance already present, waiting to circulate. +

+ +

+This framework comes from Ethan Roland & Gregory Landua, who noticed that permaculture courses exchanged far more than money.[1] Knowledge, food, relationships, stories, spiritual growth, & physical labor all flowed between participants. They named what they observed: eight distinct forms of capital, each transformable into the others. Roland built on Bill Mollison’s earlier categorization of assets in Permaculture: A Designers’ Manual.[2] +

+ + + + + +STEP 1 +

Eight Forms

+ +

Each form of capital exists as a pool (stored amount) & participates in flows (exchanges with other pools). Here they stand, from foundation to emergence:

+ +
+ The eight forms of capital from foundation to emergence +
from living capital at the foundation to cultural capital as emergent community property
+
+ +
+

Living Capital

+

Soil, water, plants, animals, human health, genetic diversity, ecosystems. A foundation upon which all other forms depend. We cannot eat money. Measure wealth in ounces, acres, & hooves.

+
+ +
+

Material Capital

+

Non-living physical objects, both raw & processed. Stone, metal, timber complexed into buildings, bridges, tools, servers, networks. Essential for work & survival, derived ultimately from living capital.

+
+ +
+

Financial Capital

+

Money, currencies, securities. A dominant medium of exchange. A powerful tool for both oppression & liberation. Current global systems grow financial capital exponentially at expense of all other forms.

+
+ +
+

Intellectual Capital

+

Ideas, concepts, knowledge, truth. Held in human neocortex. Going to university exchanges financial capital for intellectual capital. Open source code releases intellectual capital into commons.

+
+ +
+

Experiential Capital

+

Embodied know-how built from lived experience. A gap between a novice & a master. Grandma's biscuit recipe, for which no recipe exists, only feel of dough in hands.

+
+ + + +
+

Cultural Capital

+

Shared internal & external experience of a group. Story, myth, song, art, ceremony, shared ethics. Only a form that can gather through community, never by individuals alone. An emergent property of exchange.

+
+ +
+

Spiritual Capital

+

Karma, faith, presence, inner connection to & awareness of a greater whole. In some Mayan cultures, humans carry a spiritual debt to the beauty of existence, spending their lives creating beauty to service that debt.

+
+ + + + + +STEP 2 +

Full Mesh

+ +

+Every form of capital can transform into every other form. Twenty-eight connections between eight nodes. This mesh already exists in every community, every marketplace, every ecosystem. Most people only see one connection: a financial one. +

+ +
+ Full mesh showing all 28 connections between eight forms of capital +
28 connections between 8 forms, every node reaches every other node
+
+ +

+This mesh resembles a network topology, & that resemblance carries meaning. Redundancy creates resilience. When one connection breaks, capital still flows through alternative paths. A community rich in all eight forms recovers from shocks that destroy communities dependent on one. +

+ + + + + +STEP 3 +

Two Groups: Nurture & Transactional

+ +

+Eight forms divide into two groups of four. This division reveals how current systems operate & how a regenerative system would differ. +

+ +
+ Nurture capitals versus transactional capitals +
the red arrows show extraction, the green arrows show regeneration
+
+ +

+Nurture capitals must grow & get cultivated proactively: living, social, cultural, spiritual. These form a foundation of abundance. They cannot get manufactured or purchased outright. They require time, attention, & relationship. +

+ +

+Transactional capitals facilitate exchange: financial, material, intellectual, experiential. These serve as tools & media. They carry value but do not generate lasting wealth on their own. +

+ +

+Current systems extract four nurture capitals (social, cultural, spiritual, living) to create ever-growing amounts of financial & material capital, using intellectual & experiential capital to facilitate transfer. +

+ + + + + +STEP 4 +

An Extractive Pattern

+ +

+A dominant pattern in current systems flows in one direction: extract living capital, process into material capital, sell for financial capital, grow financial capital exponentially. Everything else feeds a machine. +

+ +
+ The extractive degenerative flow pattern +
one-way extraction, every form feeds financial, financial feeds itself
+
+ +

+Social capital gets leveraged for business connections. Cultural capital gets commodified into content. Spiritual capital gets exploited through faith-based marketing. Intellectual & experiential capital facilitate extraction. Financial capital compounds. Nurture capitals deplete. +

+ + + + + +STEP 5 +

A Regenerative Pattern

+ +

+A regenerative system reverses dominant flow. Financial capital gets invested back into living capital. Surplus, not base, gets harvested. Cycles sustain themselves. Living capital grows, & everything else grows with it. +

+ +
+ The regenerative flow pattern +
invest in living capital, harvest only surplus, grow what survives
+
+ +

+This pattern maps directly to a permacomputer's quadrivium. Truth demands that intellectual capital flow freely as open source. Freedom demands that social capital form through voluntary participation. Harmony demands that living capital self-renew with appropriate inputs for all outputs. Love demands that spiritual capital serve as fuel. +

+ + + + + +STEP 6 +

A Knowledge Loop

+ +

+Three forms of capital create a self-reinforcing cycle of learning & application. Theory meets practice meets observation. Each loop accelerates mastery. +

+ +
+ The knowledge loop: intellectual to experiential to living and back +
read, practice, observe, repeat. theory grounded in dirt.
+
+ +

+Intellectual capital (ideas, theory, open source documentation) gets applied through practice, building experiential capital (skill, know-how). Skilled hands transform living capital (land, systems, infrastructure). Observation of results generates new intellectual capital. Loops close. Each revolution deepens understanding. +

+ +

+In permacomputer terms: open source code (intellectual) gets deployed & operated (experiential) on real infrastructure (living). Results teach us what works. We write better code. Seeds improve with each planting. +

+ + + + + +STEP 7 +

A Community Loop

+ +

+Cultural capital can only emerge from community. No individual can create shared story, shared myth, shared ceremony alone. This loop shows how relationships & depth weave into something larger than any participant. +

+ +
+ The community loop: social and spiritual feeding into cultural, then into living +
relationships weave into shared meaning, shared meaning sustains the land for generations
+
+ +

+Social capital (relationships, trust) & spiritual capital (depth, presence) feed into cultural capital (shared story, art, ethics). Cultural capital sustains ecological stewardship across generations. Shared ethics of a community determine whether living capital gets extracted or regenerated. Culture carries values that outlast individual lifetimes. +

+ +

+"Code outlasts authors." A permacomputer grows cultural capital by creating shared infrastructure, shared tools, shared language. Culture of open source, voluntary participation, & mutual care becomes a vessel that carries a mission forward. +

+ + + + + +STEP 8 +

When Capital Stagnates

+ +

+Capital must flow. When any form accumulates without circulating, it becomes pollution. Hoarded financial capital breeds paranoia. Accumulated material capital becomes waste. Stagnant intellectual capital produces ivory tower detachment. Every form has a shadow. +

+ +
+ Each form of capital and its pollution shadow when hoarded +
capital that stops flowing starts rotting
+
+ +

+A system in harmony has appropriate inputs for all of its outputs. Very little waste or pollution during operation. This principle from a permacomputer manifesto applies directly. A permacomputer keeps capital flowing: open source releases intellectual capital, voluntary participation circulates social capital, distributed infrastructure prevents material capital from concentrating. +

+ + + + + +STEP 9 +

A Permacomputer as Regenerative System

+ +

+Every design decision in a permacomputer maps to one or more forms of capital & one or more quadrivium values. A permacomputer functions as a regenerative enterprise: a venture that proactively grows foundational pools of nurture capital by providing goods & services that create net positive gains for a whole system. +

+ +
+ How each form of capital maps to a permacomputer quadrivium values +
each form of capital maps to one or more quadrivium values: truth, freedom, harmony, love
+
+ + + + + + + + + + + + + + + +
CapitalPermacomputer ExpressionQuadrivium Value
LivingDurable hardware, repair not replaceHarmony
MaterialServers, networks, IPv4/IPv6, cryptographyHarmony
FinancialCosts near zero, no monopoly, free as waterFreedom
IntellectualOpen source, public domain, seeds to sproutTruth
ExperientialAll layers accessible, learn by operatingTruth
SocialBy the people, for the people, voluntaryFreedom
CulturalUtopia of the commons, code outlasts authorsFreedom
SpiritualLove as fuel, wu wei, homeostasisLove
+ +

+A permacomputer does not optimize for financial capital. It optimizes for all eight forms simultaneously, with living capital as foundation & cultural capital as emergent outcome. A quadrivium (truth, freedom, harmony, love) serves as a design constraint that ensures systems regenerate rather than extract. +

+ +

+Grow food not lawn. Grow all eight, not just one. +

+ +
+ +

Sources

+ +
+
    +
  1. Ethan C. Roland & Gregory Landua, Regenerative Enterprise: Optimizing for Multi-Capital Abundance (2013). Original article: Ethan C. Roland, “Eight Forms of Capital,” Permaculture Magazine, No. 68 (2011), AppleSeed Permaculture. PDF: appleseedpermaculture.com/…/8_Forms_of_Capital_PM68.pdf. Diagrams generated from DOT source files included in this repository.
  2. +
  3. Bill Mollison, Permaculture: A Designers’ Manual, p. 534. Tagari Publications, Tasmania, Australia, 1988.
  4. +
+
+ +

← back to the manifesto

+ +
+ + + + + + + diff --git a/google2dd95a728d9c0d9f.html b/google2dd95a728d9c0d9f.html new file mode 100644 index 0000000..def22a0 --- /dev/null +++ b/google2dd95a728d9c0d9f.html @@ -0,0 +1 @@ +google-site-verification: google2dd95a728d9c0d9f.html \ No newline at end of file diff --git a/growing-systems-of-permanence/index.html b/growing-systems-of-permanence/index.html index 58b588d..4f54bfc 100644 --- a/growing-systems-of-permanence/index.html +++ b/growing-systems-of-permanence/index.html @@ -13,8 +13,10 @@ - - + + + + @@ -58,12 +60,14 @@ var thread_uri = window.location.href; var thread_title = window.document.title; var thread_fragment = window.location.hash; - + // rb owner was here. - var rb_src = "https://my.remarkbox.com/embed" + + var mode_param = "&mode=dark"; + var rb_src = "https://my.remarkbox.com/embed" + "?rb_owner_key=" + rb_owner_key + "&thread_title=" + encodeURI(thread_title) + - "&thread_uri=" + encodeURIComponent(thread_uri) + + "&thread_uri=" + encodeURIComponent(thread_uri) + + mode_param + thread_fragment; function create_remarkbox_iframe() { @@ -95,7 +99,7 @@
- Russell Ballestrini | unturf · © 2021 + Russell Ballestrini | unturf. · © 2021
@@ -108,5 +112,6 @@ + diff --git a/hemp-bioplastic/img/acre-yields.dot b/hemp-bioplastic/img/acre-yields.dot new file mode 100644 index 0000000..c0d5f00 --- /dev/null +++ b/hemp-bioplastic/img/acre-yields.dot @@ -0,0 +1,42 @@ +digraph acre_yields { + bgcolor="#1a1a2e" + rankdir=LR + node [fontname="Helvetica" fontsize=10 style=filled shape=box] + edge [color="#888888" fontname="Helvetica" fontsize=9 fontcolor="#aaaaaa"] + + subgraph cluster_third { + label="1/3 ACRE" fontcolor="#CDDC39" fontsize=12 fontname="Helvetica Bold" + color="#CDDC39" style=dashed + + t_stalk [label="~1,333 kg\ndry stalk" fillcolor="#827717" fontcolor="white"] + t_cellulose [label="~560 kg\ncellulose" fillcolor="#9E9D24" fontcolor="white"] + t_plastic [label="~400 kg\nbioplastic" fillcolor="#AFB42B" fontcolor="white"] + t_serves [label="serves ~33 people\npackaging only\nor 1 household\nall replaceable plastic" fillcolor="#263238" fontcolor="#CDDC39" shape=note] + + t_stalk -> t_cellulose -> t_plastic -> t_serves + } + + subgraph cluster_one { + label="1 ACRE" fontcolor="#4CAF50" fontsize=12 fontname="Helvetica Bold" + color="#4CAF50" style=dashed + + o_stalk [label="~4,000 kg\ndry stalk" fillcolor="#2E7D32" fontcolor="white"] + o_cellulose [label="~1,680 kg\ncellulose" fillcolor="#388E3C" fontcolor="white"] + o_plastic [label="~1,200 kg\nbioplastic" fillcolor="#43A047" fontcolor="white"] + o_serves [label="serves ~100 people\npackaging only\nor 6 households\nall replaceable plastic" fillcolor="#263238" fontcolor="#4CAF50" shape=note] + + o_stalk -> o_cellulose -> o_plastic -> o_serves + } + + subgraph cluster_three { + label="3 ACRES" fontcolor="#2196F3" fontsize=12 fontname="Helvetica Bold" + color="#2196F3" style=dashed + + h_stalk [label="~12,000 kg\ndry stalk" fillcolor="#1565C0" fontcolor="white"] + h_cellulose [label="~5,040 kg\ncellulose" fillcolor="#1976D2" fontcolor="white"] + h_plastic [label="~3,600 kg\nbioplastic" fillcolor="#1E88E5" fontcolor="white"] + h_serves [label="serves ~300 people\npackaging only\nor 18 households\nall replaceable plastic" fillcolor="#263238" fontcolor="#2196F3" shape=note] + + h_stalk -> h_cellulose -> h_plastic -> h_serves + } +} diff --git a/hemp-bioplastic/img/acre-yields.png b/hemp-bioplastic/img/acre-yields.png new file mode 100644 index 0000000..f046886 Binary files /dev/null and b/hemp-bioplastic/img/acre-yields.png differ diff --git a/hemp-bioplastic/img/acre-yields.svg b/hemp-bioplastic/img/acre-yields.svg new file mode 100644 index 0000000..cc1d9c0 --- /dev/null +++ b/hemp-bioplastic/img/acre-yields.svg @@ -0,0 +1,178 @@ + + + + + + +acre_yields + + +cluster_third + +1/3 ACRE + + +cluster_one + +1 ACRE + + +cluster_three + +3 ACRES + + + +t_stalk + +~1,333 kg +dry stalk + + + +t_cellulose + +~560 kg +cellulose + + + +t_stalk->t_cellulose + + + + + +t_plastic + +~400 kg +bioplastic + + + +t_cellulose->t_plastic + + + + + +t_serves + + + +serves ~33 people +packaging only +or 1 household +all replaceable plastic + + + +t_plastic->t_serves + + + + + +o_stalk + +~4,000 kg +dry stalk + + + +o_cellulose + +~1,680 kg +cellulose + + + +o_stalk->o_cellulose + + + + + +o_plastic + +~1,200 kg +bioplastic + + + +o_cellulose->o_plastic + + + + + +o_serves + + + +serves ~100 people +packaging only +or 6 households +all replaceable plastic + + + +o_plastic->o_serves + + + + + +h_stalk + +~12,000 kg +dry stalk + + + +h_cellulose + +~5,040 kg +cellulose + + + +h_stalk->h_cellulose + + + + + +h_plastic + +~3,600 kg +bioplastic + + + +h_cellulose->h_plastic + + + + + +h_serves + + + +serves ~300 people +packaging only +or 18 households +all replaceable plastic + + + +h_plastic->h_serves + + + + + diff --git a/hemp-bioplastic/img/can-vs-cannot.dot b/hemp-bioplastic/img/can-vs-cannot.dot new file mode 100644 index 0000000..416dc6c --- /dev/null +++ b/hemp-bioplastic/img/can-vs-cannot.dot @@ -0,0 +1,39 @@ +digraph can_vs_cannot { + bgcolor="#1a1a2e" + rankdir=TB + node [fontname="Helvetica" fontsize=10 style=filled shape=box] + edge [style=invis] + + label=<what hemp bioplastic can & cannot replace> + labelloc=t + + subgraph cluster_can { + label="CAN REPLACE" fontcolor="#4CAF50" fontsize=12 fontname="Helvetica Bold" + color="#4CAF50" style=dashed + + c1 [label="food trays\nclamshells" fillcolor="#2E7D32" fontcolor="white"] + c2 [label="shopping bags\nproduce bags" fillcolor="#388E3C" fontcolor="white"] + c3 [label="disposable\ncutlery & plates" fillcolor="#43A047" fontcolor="white"] + c4 [label="plant pots\nseed trays" fillcolor="#4CAF50" fontcolor="white"] + c5 [label="product\npackaging" fillcolor="#66BB6A" fontcolor="white"] + c6 [label="car interior\npanels" fillcolor="#81C784" fontcolor="#1a1a2e"] + + c1 -> c2 -> c3 -> c4 -> c5 -> c6 + } + + subgraph cluster_cannot { + label="CANNOT REPLACE" fontcolor="#F44336" fontsize=12 fontname="Helvetica Bold" + color="#F44336" style=dashed + + n1 [label="pipes &\nplumbing" fillcolor="#B71C1C" fontcolor="white"] + n2 [label="electronics\nhousings" fillcolor="#C62828" fontcolor="white"] + n3 [label="medical\ndevices" fillcolor="#D32F2F" fontcolor="white"] + n4 [label="clear bottles\n& windows" fillcolor="#E53935" fontcolor="white"] + n5 [label="wire\ninsulation" fillcolor="#F44336" fontcolor="white"] + n6 [label="outdoor furniture\ndecking, siding" fillcolor="#EF5350" fontcolor="white"] + + n1 -> n2 -> n3 -> n4 -> n5 -> n6 + } + + note [label="hemp bioplastic replaces ~20-30%\nof household disposable plastic\n\npackaging & single-use items only\nnot engineering or medical plastics" fillcolor="#263238" fontcolor="#CDDC39" shape=note fontsize=10] +} diff --git a/hemp-bioplastic/img/can-vs-cannot.png b/hemp-bioplastic/img/can-vs-cannot.png new file mode 100644 index 0000000..345edb3 Binary files /dev/null and b/hemp-bioplastic/img/can-vs-cannot.png differ diff --git a/hemp-bioplastic/img/can-vs-cannot.svg b/hemp-bioplastic/img/can-vs-cannot.svg new file mode 100644 index 0000000..d13a153 --- /dev/null +++ b/hemp-bioplastic/img/can-vs-cannot.svg @@ -0,0 +1,129 @@ + + + + + + +can_vs_cannot + +what hemp bioplastic can & cannot replace + +cluster_can + +CAN REPLACE + + +cluster_cannot + +CANNOT REPLACE + + + +c1 + +food trays +clamshells + + + +c2 + +shopping bags +produce bags + + + + +c3 + +disposable +cutlery & plates + + + + +c4 + +plant pots +seed trays + + + + +c5 + +product +packaging + + + + +c6 + +car interior +panels + + + + +n1 + +pipes & +plumbing + + + +n2 + +electronics +housings + + + + +n3 + +medical +devices + + + + +n4 + +clear bottles +& windows + + + + +n5 + +wire +insulation + + + + +n6 + +outdoor furniture +decking, siding + + + + +note + + + +hemp bioplastic replaces ~20-30% +of household disposable plastic +packaging & single-use items only +not engineering or medical plastics + + + diff --git a/hemp-bioplastic/img/community-scale.dot b/hemp-bioplastic/img/community-scale.dot new file mode 100644 index 0000000..d6d48d7 --- /dev/null +++ b/hemp-bioplastic/img/community-scale.dot @@ -0,0 +1,41 @@ +digraph community_scale { + bgcolor="#1a1a2e" + rankdir=TB + node [fontname="Helvetica" fontsize=10 style=filled shape=box] + edge [style=invis] + + label=<how much land to replace disposable plastic?> + labelloc=t + + subgraph cluster_household { + label="HOUSEHOLD (2.5 people)" fontcolor="#CDDC39" fontsize=11 fontname="Helvetica Bold" + color="#CDDC39" style=dashed + + h_need [label="plastic consumed: ~200 kg/yr\nreplaceable fraction: ~30 kg/yr\n(packaging & disposables only)" fillcolor="#37474F" fontcolor="white"] + h_land [label="hemp needed: 1/40 acre\n(~1,000 sq ft garden plot)" fillcolor="#827717" fontcolor="white"] + h_note [label="one large backyard garden\ncould cover a household" fillcolor="#263238" fontcolor="#CDDC39" shape=note] + h_need -> h_land -> h_note + } + + subgraph cluster_village { + label="VILLAGE (100 people)" fontcolor="#4CAF50" fontsize=11 fontname="Helvetica Bold" + color="#4CAF50" style=dashed + + v_need [label="plastic consumed: ~13,000 kg/yr\nreplaceable fraction: ~1,200 kg/yr" fillcolor="#37474F" fontcolor="white"] + v_land [label="hemp needed: ~1 acre\nplus processing facility" fillcolor="#2E7D32" fontcolor="white"] + v_note [label="requires shared decorticator\n& chemical processing setup\n~$50,000 startup" fillcolor="#263238" fontcolor="#4CAF50" shape=note] + v_need -> v_land -> v_note + } + + subgraph cluster_town { + label="TOWN (10,000 people)" fontcolor="#2196F3" fontsize=11 fontname="Helvetica Bold" + color="#2196F3" style=dashed + + t_need [label="plastic consumed: ~1,300,000 kg/yr\nreplaceable fraction: ~120,000 kg/yr" fillcolor="#37474F" fontcolor="white"] + t_land [label="hemp needed: ~100 acres\nindustrial processing facility" fillcolor="#1565C0" fontcolor="white"] + t_note [label="requires industrial decorticator\nchemical plant, extruder\n$500,000+ investment" fillcolor="#263238" fontcolor="#2196F3" shape=note] + t_need -> t_land -> t_note + } + + honest [label="these numbers replace only disposable plastic packaging\n~20-30% of total plastic consumption\n\nengineering plastics, medical devices,\nelectronics, pipes, & wire insulation\nstill require petroleum or other solutions" fillcolor="#B71C1C" fontcolor="white" shape=note fontsize=10] +} diff --git a/hemp-bioplastic/img/community-scale.png b/hemp-bioplastic/img/community-scale.png new file mode 100644 index 0000000..4207ea9 Binary files /dev/null and b/hemp-bioplastic/img/community-scale.png differ diff --git a/hemp-bioplastic/img/community-scale.svg b/hemp-bioplastic/img/community-scale.svg new file mode 100644 index 0000000..a00a317 --- /dev/null +++ b/hemp-bioplastic/img/community-scale.svg @@ -0,0 +1,119 @@ + + + + + + +community_scale + +how much land to replace disposable plastic? + +cluster_household + +HOUSEHOLD (2.5 people) + + +cluster_village + +VILLAGE (100 people) + + +cluster_town + +TOWN (10,000 people) + + + +h_need + +plastic consumed: ~200 kg/yr +replaceable fraction: ~30 kg/yr +(packaging & disposables only) + + + +h_land + +hemp needed: 1/40 acre +(~1,000 sq ft garden plot) + + + + +h_note + + + +one large backyard garden +could cover a household + + + + +v_need + +plastic consumed: ~13,000 kg/yr +replaceable fraction: ~1,200 kg/yr + + + +v_land + +hemp needed: ~1 acre +plus processing facility + + + + +v_note + + + +requires shared decorticator +& chemical processing setup +~$50,000 startup + + + + +t_need + +plastic consumed: ~1,300,000 kg/yr +replaceable fraction: ~120,000 kg/yr + + + +t_land + +hemp needed: ~100 acres +industrial processing facility + + + + +t_note + + + +requires industrial decorticator +chemical plant, extruder +$500,000+ investment + + + + +honest + + + +these numbers replace only disposable plastic packaging +~20-30% of total plastic consumption +engineering plastics, medical devices, +electronics, pipes, & wire insulation +still require petroleum or other solutions + + + diff --git a/hemp-bioplastic/img/cooperative-model.dot b/hemp-bioplastic/img/cooperative-model.dot new file mode 100644 index 0000000..933ac9e --- /dev/null +++ b/hemp-bioplastic/img/cooperative-model.dot @@ -0,0 +1,64 @@ +digraph cooperative { + bgcolor="#1a1a2e" + rankdir=TB + node [fontname="Helvetica" fontsize=10 style=filled shape=box] + edge [color="#888888" fontname="Helvetica" fontsize=9 fontcolor="#aaaaaa"] + + subgraph cluster_growers { + label="GROWERS" fontcolor="#4CAF50" fontsize=12 fontname="Helvetica Bold" + color="#4CAF50" style=dashed + + f1 [label="farm A\n1/3 acre" fillcolor="#2E7D32" fontcolor="white"] + f2 [label="farm B\n1 acre" fillcolor="#388E3C" fontcolor="white"] + f3 [label="farm C\n1 acre" fillcolor="#43A047" fontcolor="white"] + f4 [label="garden plots\nbackyards\n& more" fillcolor="#66BB6A" fontcolor="white"] + } + + subgraph cluster_collect { + label="COLLECTION" fontcolor="#FF9800" fontsize=12 fontname="Helvetica Bold" + color="#FF9800" style=dashed + + harvest [label="harvest &\ndry stalks" fillcolor="#E65100" fontcolor="white"] + store [label="central\nstorage barn" fillcolor="#F57C00" fontcolor="white"] + } + + subgraph cluster_process { + label="SHARED PROCESSING" fontcolor="#2196F3" fontsize=12 fontname="Helvetica Bold" + color="#2196F3" style=dashed + + decorticator [label="decorticator\n$5,000-60,000\nshared asset" fillcolor="#1565C0" fontcolor="white"] + chem [label="chemical extraction\nNaOH + acid wash\nshared facility" fillcolor="#1976D2" fontcolor="white"] + press [label="hot press\n& molds\nshared tools" fillcolor="#1E88E5" fontcolor="white"] + } + + subgraph cluster_output { + label="OUTPUT" fontcolor="#9C27B0" fontsize=12 fontname="Helvetica Bold" + color="#9C27B0" style=dashed + + products [label="containers\ntrays, pots\npackaging" fillcolor="#7B1FA2" fontcolor="white"] + byproducts [label="hurd β†’ animal bedding\nlignin β†’ compost\nfiber β†’ textiles" fillcolor="#6A1B9A" fontcolor="white"] + } + + subgraph cluster_distribute { + label="DISTRIBUTE" fontcolor="#E91E63" fontsize=12 fontname="Helvetica Bold" + color="#E91E63" style=dashed + + local [label="farmers market\nfarm stands\nlocal shops" fillcolor="#AD1457" fontcolor="white"] + members [label="member households\nget allocation\nat cost" fillcolor="#C2185B" fontcolor="white"] + } + + f1 -> harvest + f2 -> harvest + f3 -> harvest + f4 -> harvest + harvest -> store + store -> decorticator + decorticator -> chem + decorticator -> byproducts [style=dashed label="hurd\n& waste fiber"] + chem -> press + press -> products + products -> local + products -> members + + cost [label="startup: $50,000-100,000\nshared across 10-20 members\n$2,500-10,000 per member" fillcolor="#263238" fontcolor="#CDDC39" shape=note] +} diff --git a/hemp-bioplastic/img/cooperative-model.png b/hemp-bioplastic/img/cooperative-model.png new file mode 100644 index 0000000..74b368f Binary files /dev/null and b/hemp-bioplastic/img/cooperative-model.png differ diff --git a/hemp-bioplastic/img/cooperative-model.svg b/hemp-bioplastic/img/cooperative-model.svg new file mode 100644 index 0000000..063d48f --- /dev/null +++ b/hemp-bioplastic/img/cooperative-model.svg @@ -0,0 +1,221 @@ + + + + + + +cooperative + + +cluster_growers + +GROWERS + + +cluster_collect + +COLLECTION + + +cluster_process + +SHARED PROCESSING + + +cluster_output + +OUTPUT + + +cluster_distribute + +DISTRIBUTE + + + +f1 + +farm A +1/3 acre + + + +harvest + +harvest & +dry stalks + + + +f1->harvest + + + + + +f2 + +farm B +1 acre + + + +f2->harvest + + + + + +f3 + +farm C +1 acre + + + +f3->harvest + + + + + +f4 + +garden plots +backyards +& more + + + +f4->harvest + + + + + +store + +central +storage barn + + + +harvest->store + + + + + +decorticator + +decorticator +$5,000-60,000 +shared asset + + + +store->decorticator + + + + + +chem + +chemical extraction +NaOH + acid wash +shared facility + + + +decorticator->chem + + + + + +byproducts + +hurd β†’ animal bedding +lignin β†’ compost +fiber β†’ textiles + + + +decorticator->byproducts + + +hurd +& waste fiber + + + +press + +hot press +& molds +shared tools + + + +chem->press + + + + + +products + +containers +trays, pots +packaging + + + +press->products + + + + + +local + +farmers market +farm stands +local shops + + + +products->local + + + + + +members + +member households +get allocation +at cost + + + +products->members + + + + + +cost + + + +startup: $50,000-100,000 +shared across 10-20 members +$2,500-10,000 per member + + + diff --git a/hemp-bioplastic/img/cost-reality.dot b/hemp-bioplastic/img/cost-reality.dot new file mode 100644 index 0000000..182ef7b --- /dev/null +++ b/hemp-bioplastic/img/cost-reality.dot @@ -0,0 +1,31 @@ +digraph cost_reality { + bgcolor="#1a1a2e" + rankdir=LR + node [fontname="Helvetica" fontsize=10 style=filled shape=box] + edge [style=invis] + + label=<cost per kg: petroleum vs hemp> + labelloc=t + + subgraph cluster_petro { + label="PETROLEUM PLASTIC" fontcolor="#F44336" fontsize=11 fontname="Helvetica Bold" + color="#F44336" style=dashed + + hdpe [label="HDPE\n$0.90-1.40/kg" fillcolor="#B71C1C" fontcolor="white"] + pp [label="polypropylene\n$2.20-2.53/kg" fillcolor="#C62828" fontcolor="white"] + pet [label="PET\n$1.00-1.50/kg" fillcolor="#D32F2F" fontcolor="white"] + hdpe -> pp -> pet + } + + subgraph cluster_bio { + label="BIOPLASTIC" fontcolor="#4CAF50" fontsize=11 fontname="Helvetica Bold" + color="#4CAF50" style=dashed + + pla [label="PLA (corn)\n$2.00-3.00/kg" fillcolor="#2E7D32" fontcolor="white"] + hemp [label="hemp bioplastic\n$5.00-5.20/kg" fillcolor="#388E3C" fontcolor="white"] + pha [label="PHA (microbial)\n$4.00-9.00/kg" fillcolor="#43A047" fontcolor="white"] + pla -> hemp -> pha + } + + gap [label="hemp bioplastic costs\n2-3x petroleum plastic today\n\nno subsidies, no scale,\nno infrastructure yet\n\nprice drops with volume\nPLA fell 50% since 2007" fillcolor="#263238" fontcolor="#CDDC39" shape=note] +} diff --git a/hemp-bioplastic/img/cost-reality.png b/hemp-bioplastic/img/cost-reality.png new file mode 100644 index 0000000..91db824 Binary files /dev/null and b/hemp-bioplastic/img/cost-reality.png differ diff --git a/hemp-bioplastic/img/cost-reality.svg b/hemp-bioplastic/img/cost-reality.svg new file mode 100644 index 0000000..bdbe80f --- /dev/null +++ b/hemp-bioplastic/img/cost-reality.svg @@ -0,0 +1,83 @@ + + + + + + +cost_reality + +cost per kg: petroleum vs hemp + +cluster_petro + +PETROLEUM PLASTIC + + +cluster_bio + +BIOPLASTIC + + + +hdpe + +HDPE +$0.90-1.40/kg + + + +pp + +polypropylene +$2.20-2.53/kg + + + + +pet + +PET +$1.00-1.50/kg + + + + +pla + +PLA (corn) +$2.00-3.00/kg + + + +hemp + +hemp bioplastic +$5.00-5.20/kg + + + + +pha + +PHA (microbial) +$4.00-9.00/kg + + + + +gap + + + +hemp bioplastic costs +2-3x petroleum plastic today +no subsidies, no scale, +no infrastructure yet +price drops with volume +PLA fell 50% since 2007 + + + diff --git a/hemp-bioplastic/img/harmony-cycle.dot b/hemp-bioplastic/img/harmony-cycle.dot new file mode 100644 index 0000000..a8625ce --- /dev/null +++ b/hemp-bioplastic/img/harmony-cycle.dot @@ -0,0 +1,29 @@ +digraph harmony_cycle { + bgcolor="#1a1a2e" + node [fontname="Helvetica" fontsize=11 style=filled shape=box] + edge [color="#4CAF50" fontname="Helvetica" fontsize=9 fontcolor="#aaaaaa" penwidth=2] + + sun [label="sunlight\nwater\nCO2" fillcolor="#FFC107" fontcolor="#1a1a2e" shape=ellipse] + hemp [label="hemp\n120 day crop\nno pesticides" fillcolor="#2E7D32" fontcolor="white"] + stalk [label="stalk\n& fiber" fillcolor="#388E3C" fontcolor="white"] + cellulose [label="cellulose\nextraction" fillcolor="#43A047" fontcolor="white"] + bioplastic [label="bioplastic\ncontainer" fillcolor="#7B1FA2" fontcolor="white"] + use [label="use &\ndiscard" fillcolor="#FF9800" fontcolor="white"] + compost [label="compost\n3-6 months" fillcolor="#795548" fontcolor="white"] + soil [label="soil\nnutrients" fillcolor="#4E342E" fontcolor="white"] + + sun -> hemp [label="grow"] + hemp -> stalk [label="harvest"] + stalk -> cellulose [label="process"] + cellulose -> bioplastic [label="press"] + bioplastic -> use [label="serve"] + use -> compost [label="return"] + compost -> soil [label="decompose"] + soil -> hemp [label="feed"] + + // contrast + petro [label="petroleum plastic\ncycle breaks here\nβ†’ landfill forever" fillcolor="#B71C1C" fontcolor="white" shape=octagon] + use -> petro [color="#F44336" style=dashed label="vs" penwidth=1] + + note [label="hemp bioplastic closes a cycle\npetroleum plastic breaks it\n\nboth require energy to process\nbut only one returns to earth" fillcolor="#263238" fontcolor="#CDDC39" shape=note fontsize=9] +} diff --git a/hemp-bioplastic/img/harmony-cycle.png b/hemp-bioplastic/img/harmony-cycle.png new file mode 100644 index 0000000..f51608b Binary files /dev/null and b/hemp-bioplastic/img/harmony-cycle.png differ diff --git a/hemp-bioplastic/img/harmony-cycle.svg b/hemp-bioplastic/img/harmony-cycle.svg new file mode 100644 index 0000000..2f1a1a9 --- /dev/null +++ b/hemp-bioplastic/img/harmony-cycle.svg @@ -0,0 +1,153 @@ + + + + + + +harmony_cycle + + + +sun + +sunlight +water +CO2 + + + +hemp + +hemp +120 day crop +no pesticides + + + +sun->hemp + + +grow + + + +stalk + +stalk +& fiber + + + +hemp->stalk + + +harvest + + + +cellulose + +cellulose +extraction + + + +stalk->cellulose + + +process + + + +bioplastic + +bioplastic +container + + + +cellulose->bioplastic + + +press + + + +use + +use & +discard + + + +bioplastic->use + + +serve + + + +compost + +compost +3-6 months + + + +use->compost + + +return + + + +petro + +petroleum plastic +cycle breaks here +β†’ landfill forever + + + +use->petro + + +vs + + + +soil + +soil +nutrients + + + +compost->soil + + +decompose + + + +soil->hemp + + +feed + + + +note + + + +hemp bioplastic closes a cycle +petroleum plastic breaks it +both require energy to process +but only one returns to earth + + + diff --git a/hemp-bioplastic/img/stalk-to-plastic.dot b/hemp-bioplastic/img/stalk-to-plastic.dot new file mode 100644 index 0000000..34539d2 --- /dev/null +++ b/hemp-bioplastic/img/stalk-to-plastic.dot @@ -0,0 +1,54 @@ +digraph stalk_to_plastic { + bgcolor="#1a1a2e" + rankdir=TB + node [fontname="Helvetica" fontsize=11 style=filled shape=box] + edge [color="#888888" fontname="Helvetica" fontsize=9 fontcolor="#aaaaaa"] + + subgraph cluster_grow { + label="GROW" fontcolor="#4CAF50" fontsize=12 fontname="Helvetica Bold" + color="#4CAF50" style=dashed + seed [label="hemp seed" fillcolor="#2E7D32" fontcolor="white"] + field [label="1 acre\n120 days" fillcolor="#388E3C" fontcolor="white"] + stalk [label="4 tons\ndry stalk" fillcolor="#43A047" fontcolor="white"] + } + + subgraph cluster_strip { + label="STRIP" fontcolor="#FF9800" fontsize=12 fontname="Helvetica Bold" + color="#FF9800" style=dashed + dec [label="decorticate\nseparate bast & hurd" fillcolor="#E65100" fontcolor="white"] + bast [label="bast fiber\n~30% of stalk\n77% cellulose" fillcolor="#F57C00" fontcolor="white"] + hurd [label="hurd (core)\n~70% of stalk\n44% cellulose" fillcolor="#795548" fontcolor="white"] + } + + subgraph cluster_extract { + label="EXTRACT" fontcolor="#2196F3" fontsize=12 fontname="Helvetica Bold" + color="#2196F3" style=dashed + naoh [label="NaOH bath\n80-90Β°C\n2-5 hours" fillcolor="#1565C0" fontcolor="white"] + wash [label="acid wash\nbleach\nfilter" fillcolor="#1976D2" fontcolor="white"] + cellulose [label="~420 kg\nclean cellulose" fillcolor="#1E88E5" fontcolor="white"] + } + + subgraph cluster_form { + label="FORM" fontcolor="#9C27B0" fontsize=12 fontname="Helvetica Bold" + color="#9C27B0" style=dashed + mix [label="mix with\nglycerol (15%)" fillcolor="#6A1B9A" fontcolor="white"] + press [label="hot press\n150-240Β°C" fillcolor="#7B1FA2" fontcolor="white"] + plastic [label="~400 kg\nhemp bioplastic" fillcolor="#8E24AA" fontcolor="white"] + } + + seed -> field [label="plant"] + field -> stalk [label="harvest"] + stalk -> dec [label="process"] + dec -> bast + dec -> hurd + bast -> naoh + hurd -> naoh [style=dashed label="lower yield"] + naoh -> wash [label="dissolve\nlignin"] + wash -> cellulose [label="~42%\nrecovery"] + cellulose -> mix + mix -> press + press -> plastic + + loss [label="~60% lost\nlignin, hemicellulose\nwash water" fillcolor="#37474F" fontcolor="#aaaaaa" shape=ellipse] + wash -> loss [style=dashed color="#555555"] +} diff --git a/hemp-bioplastic/img/stalk-to-plastic.png b/hemp-bioplastic/img/stalk-to-plastic.png new file mode 100644 index 0000000..29ab28c Binary files /dev/null and b/hemp-bioplastic/img/stalk-to-plastic.png differ diff --git a/hemp-bioplastic/img/stalk-to-plastic.svg b/hemp-bioplastic/img/stalk-to-plastic.svg new file mode 100644 index 0000000..ec1e825 --- /dev/null +++ b/hemp-bioplastic/img/stalk-to-plastic.svg @@ -0,0 +1,214 @@ + + + + + + +stalk_to_plastic + + +cluster_grow + +GROW + + +cluster_strip + +STRIP + + +cluster_extract + +EXTRACT + + +cluster_form + +FORM + + + +seed + +hemp seed + + + +field + +1 acre +120 days + + + +seed->field + + +plant + + + +stalk + +4 tons +dry stalk + + + +field->stalk + + +harvest + + + +dec + +decorticate +separate bast & hurd + + + +stalk->dec + + +process + + + +bast + +bast fiber +~30% of stalk +77% cellulose + + + +dec->bast + + + + + +hurd + +hurd (core) +~70% of stalk +44% cellulose + + + +dec->hurd + + + + + +naoh + +NaOH bath +80-90Β°C +2-5 hours + + + +bast->naoh + + + + + +hurd->naoh + + +lower yield + + + +wash + +acid wash +bleach +filter + + + +naoh->wash + + +dissolve +lignin + + + +cellulose + +~420 kg +clean cellulose + + + +wash->cellulose + + +~42% +recovery + + + +loss + +~60% lost +lignin, hemicellulose +wash water + + + +wash->loss + + + + + +mix + +mix with +glycerol (15%) + + + +cellulose->mix + + + + + +press + +hot press +150-240Β°C + + + +mix->press + + + + + +plastic + +~400 kg +hemp bioplastic + + + +press->plastic + + + + + diff --git a/hemp-bioplastic/index.html b/hemp-bioplastic/index.html new file mode 100644 index 0000000..75f273d --- /dev/null +++ b/hemp-bioplastic/index.html @@ -0,0 +1,365 @@ + + + + hemp bioplastic — unturf. + + + + + + + + + +
+ +

unturf.

+

grow food not lawn

+ + +

Hemp Bioplastic

+ +

+unturf. rejects single-use petroleum plastic. So what fills that void? Hemp bioplastic offers one partial answer. Emphasis on partial. This page presents honest numbers β€” what hemp bioplastic can do, what it cannot, how much land it takes, & what a community would need to make it work. +

+ +
+No smoke. Hemp bioplastic will not replace all petroleum plastic. It replaces a narrow slice β€” packaging, disposables, single-use containers. Engineering plastics, medical devices, electronics, pipes, & wire insulation still require other solutions. Anyone who tells you otherwise sells something. +
+ + + + + +STEP 1 +

A Cycle That Closes

+ +

+Petroleum plastic breaks a cycle. Hemp bioplastic closes one. Sun grows hemp. Hemp yields cellulose. Cellulose gets pressed into bioplastic. Bioplastic serves its purpose. Discarded bioplastic composts in 3-6 months.[4] Compost feeds soil. Soil grows hemp. Every output becomes an input. +

+ +
+ Hemp bioplastic lifecycle: sun to hemp to cellulose to plastic to compost to soil to hemp again +
hemp bioplastic closes a cycle. petroleum plastic breaks it.
+
+ +

+This cycle passes a harmony test. Appropriate inputs for all outputs. But growing a plant & pressing it into plastic requires real work, real chemistry, & real land. How much? +

+ + + + + +STEP 2 +

Stalk to Plastic

+ +

+Hemp grows in 120 days. One acre yields roughly 4 tons of dry stalk[1] (conservative β€” research plots hit 8-12 tons, but plan for 4). That stalk contains two parts: bast fiber (outer bark, 30% of stalk, 77% cellulose) & hurd (inner woody core, 70% of stalk, 44% cellulose).[2] Both contain cellulose. Getting it out requires chemistry. +

+ +
+ Process flow from hemp seed to bioplastic: grow, strip, extract, form +
4 tons of stalk yields roughly 400 kg of bioplastic. 60% lost in processing.
+
+ +

+Stalks get decorticated (separated into bast & hurd). Fiber soaks in sodium hydroxide (NaOH / lye) at 80-90Β°C for 2-5 hours to dissolve lignin.[12] Acid wash removes hemicellulose. Bleach & filtration leave clean cellulose. Mix with glycerol as plasticizer (15% by weight). Hot press at 150-240Β°C into molds. +

+ +

+From 4,000 kg of dry stalk, expect roughly 1,680 kg of extractable cellulose,[3] yielding approximately 1,200 kg of finished bioplastic. Roughly 30% conversion efficiency from stalk to product. Rest goes to waste liquor, lignin (compostable), & hurd byproducts (animal bedding, hempcrete, garden mulch). +

+ +
+Chemical reality. This process requires NaOH (lye), hydrochloric acid, bleaching agents, & heat. Not dangerous at small scale with proper safety gear, but not a kitchen project either. A workshop with ventilation, chemical-resistant containers, & safety training stays necessary. Waste alkaline liquor must get neutralized before disposal. +
+ + + + + +STEP 3 +

What It Can & Cannot Replace

+ +

+Hemp bioplastic works for low-performance, short-lifespan applications. Packaging. Containers. Disposable items. It does not work for anything requiring long-term durability, transparency, high-temperature resistance, or precision engineering. +

+ +
+ What hemp bioplastic can replace versus what it cannot +
~20-30% of household disposable plastic. not engineering or medical plastics.
+
+ +

+Pure cellulose bioplastic stays brittle & water-sensitive. It biodegrades in 3-6 months[4] β€” a feature for disposables, a fatal flaw for anything meant to last. Most commercial "hemp plastic" products actually blend hemp fiber (30-50%) with corn-based PLA or even petroleum polypropylene. A 100% hemp-derived polymer exists at laboratory scale but has not reached commercial viability.[5] +

+ + + + + +STEP 4 +

Minimum Bioplastic to Fill a Void

+ +

+An average American household consumes roughly 200 kg of plastic per year.[6] That number includes everything β€” durable goods, synthetic textiles, electronics, plumbing, & packaging. Hemp bioplastic cannot replace most of that. So how much can it actually replace? +

+ +

+Packaging & disposable containers account for roughly 100-115 kg per household per year.[7] Of that, hemp bioplastic could realistically substitute for items where brittleness & moisture sensitivity stay acceptable β€” food trays, plant pots, dry-goods containers, bags, disposable cutlery. That narrows to roughly 30-50 kg per household per year. +

+ +

+The rest of a petroleum-free household pivots to other materials that already exist: glass jars, steel containers, wooden utensils, cotton & hemp cloth bags, beeswax wraps, paper packaging, bamboo products. Hemp bioplastic fills one gap among many. It does not fill every gap alone. +

+ + + + + + + + + + + + + + + + + +
Categorykg/yr per householdReplacement
Food packaging trays~15hemp bioplastic
Disposable cutlery & plates~5hemp bioplastic or bamboo
Shopping & produce bags~5hemp bioplastic or cloth
Plant pots & garden~5hemp bioplastic
Bottles & jars~25glass & steel
Cling wrap & barrier films~10beeswax wrap & paper
Cleaning product bottles~10glass, refill stations
Synthetic textiles~25cotton, hemp, wool
Durable goods & electronics~80no direct substitute yet
Plumbing & infrastructure~20copper, steel, clay
+ +

+Minimum hemp bioplastic per household: ~30 kg/year. That represents the fraction where hemp bioplastic serves as the best available substitute. For a household of 2.5 people, that works out to 12 kg per person per year. +

+ + + + + +STEP 5 +

Land: 1/3 Acre, 1 Acre, 3 Acres

+ +

+Conservative baseline: 4 tons of dry stalk per acre, 30% conversion to bioplastic = 1,200 kg bioplastic per acre. +

+ +
+ Bioplastic yield from 1/3 acre, 1 acre, and 3 acres of hemp +
conservative estimates. optimized growing could double these numbers.
+
+ + + + + + + + + + +
LandDry StalkBioplasticServes (packaging)Serves (all replaceable)
1/3 acre~1,333 kg~400 kg~33 people~2 households
1 acre~4,000 kg~1,200 kg~100 people~6 households
3 acres~12,000 kg~3,600 kg~300 people~18 households
+ +

+A single acre of hemp, processed through a community facility, could provide packaging-replacement bioplastic for 100 people. Three acres covers a small village. For context, hemp requires no pesticides, improves soil quality, & grows in 120 days β€” making it compatible with crop rotation. Plant hemp, harvest, plant winter rye, harvest, plant hemp again. +

+ + + + + +STEP 6 +

Household, Village, Town

+ +

+How much hemp land does a community need to refuse petroleum-based disposable plastic entirely? +

+ +
+ Hemp land needed for a household, village, and town +
these numbers cover disposable plastic packaging only. ~20-30% of total plastic consumption.
+
+ + + + + + + + + + + +
ScalePeopleReplaceable PlasticHemp Land NeededInfrastructure
Household2.5~30 kg/yr~1,000 sq ft gardenworkshop tools
Village100~1,200 kg/yr~1 acreshared decorticator & press ($42k)
Small town1,000~12,000 kg/yr~10 acrescooperative facility ($420k)
Town10,000~120,000 kg/yr~100 acresindustrial facility ($4.20M)
+ +

+A household could grow enough hemp in a large backyard garden plot (~1,000 sq ft) to cover its own replaceable plastic needs. But processing at household scale stays extremely labor-intensive β€” measured in grams per hour with basic tools. A community model changes everything. +

+ + + + + +STEP 7 +

A Cooperative Model

+ +

+No single household can justify a $6,900 decorticator or a chemical extraction setup. But 10-20 households splitting costs, pooling harvests, & sharing equipment? That math works. Models already exist. +

+ +
+ Community cooperative model: growers, collection, shared processing, distribution +
growers pool harvest, shared facility processes, members get bioplastic at cost.
+
+ +

+Heartland Hemp Cooperative (Indiana/Ohio/Kentucky) β€” farmer-owned co-op, $500/share, pooling resources to purchase a shared decorticator. 20-40 member-farmers within 150-mile radius.[9] +

+ +

+Western Fiber (California) β€” converted a cooperative cotton gin to process hemp in off-season. Existing infrastructure, shared costs. Achieved ~8 tons/acre from irrigated fields.[10] +

+ +

+Winona's Hemp (White Earth, Minnesota) β€” Indigenous-led initiative building decortication on tribal land across northern plains. Partners with tribes across multiple reservations.[11] +

+ +
+Infrastructure gap. Most cooperatives focus on fiber & textiles, not bioplastic. No end-to-end community-scale hemp-to-bioplastic facility operates in North America yet. A co-op that grows hemp & decorticate fiber exists. A co-op that also extracts cellulose & presses bioplastic does not exist yet. That second step remains the gap. Someone builds it or nobody has it. +
+ + + + + +STEP 8 +

Cost Reality

+ +

+Hemp bioplastic costs 2-3x more than petroleum plastic today.[8] No subsidies, no infrastructure, no scale. +

+ +
+ Cost comparison: petroleum plastic vs hemp bioplastic per kg +
hemp bioplastic pellets: ~$5.18/kg. polypropylene: ~$2.20-2.53/kg.
+
+ +

+Corn-based PLA (another bioplastic) costs $2-3/kg & fell 50% in price since 2007 as infrastructure scaled.[13] Hemp bioplastic could follow that trajectory. But today it sits at $5/kg β€” roughly double PLA & triple petroleum plastic. At community cooperative scale, labor costs drop. At household scale, labor costs dominate & make each kg more expensive in time than in dollars. +

+ +

+Cost comparison matters less when you stop buying petroleum plastic entirely. If a community grows hemp, processes it cooperatively, & distributes bioplastic to members at cost, the dollar comparison with petroleum plastic becomes irrelevant. You pay in labor, land, & shared equipment β€” not in dollars to petroleum companies. +

+ + + + + +STEP 9 +

What a Household Actually Does

+ +

+Refuse petroleum plastic. Do not replace it 1:1 with bioplastic. Reduce first. Most plastic in a household exists because someone chose convenience over durability. Reverse that. +

+ +

+Step 1: Eliminate. Glass jars for storage. Steel water bottles. Cotton bags. Beeswax wraps instead of cling film. Wooden cutting boards. Bar soap instead of bottled. Refill stations for cleaning products. This removes 60-70% of household plastic without growing a single hemp plant. +

+ +

+Step 2: Grow. Plant a 1,000 sq ft hemp plot. Harvest in 120 days. Dry stalks. This part stays easy β€” hemp grows almost anywhere with minimal inputs. +

+ +

+Step 3: Process cooperatively. Bring dried stalks to a community processing day or a shared facility. Decorticate. Extract cellulose. Press into molds for the items that still need replacing β€” seed trays, food containers, disposable serving ware for events. +

+ +

+Step 4: Compost. When a hemp bioplastic container reaches end of life, compost it. 3-6 months back to soil. Soil grows next year's hemp. Cycle closes. +

+ +

+Minimum bioplastic needed per household after eliminating everything else: ~30 kg/year. Roughly one large backyard garden's worth of hemp. +

+ + + + + +
+ +

Honest Summary

+ +

+Hemp bioplastic works for disposable packaging & containers. It does not work for pipes, electronics, medical devices, transparent bottles, wire insulation, or anything requiring long-term durability. It replaces roughly 20-30% of household disposable plastic. +

+ +

+One acre of hemp yields roughly 1,200 kg of bioplastic β€” enough to cover disposable packaging for 100 people. A community cooperative with 10-20 members, ~$42,000 in shared equipment, & a few acres of hemp could produce meaningful quantities. +

+ +

+The infrastructure does not exist yet. Cooperatives that grow & decorticate hemp exist. Cooperatives that also extract cellulose & press bioplastic do not. That gap represents both a problem & an opportunity. +

+ +

+Hemp bioplastic stays one tool among many. Glass, steel, wood, cotton, bamboo, beeswax, & paper fill other gaps. Refusing petroleum plastic requires all of these β€” not one silver bullet. +

+ +

+Grow food not lawn. Grow hemp not petroleum. Grow what cycles. +

+ +
+ +

Sources

+ +
+
    +
  1. SARE Project ONE22-410, University of Vermont fiber variety trials: 4.9-12.1 tons dry matter/acre. UC Davis field trials: 1.2-3.4 tons/acre. Biomass Connect: 12-15 tonnes/hectare in Europe. Conservative U.S. baseline of 3-5 tons/acre from Portland State University review (2022) & University of Wisconsin market analysis.
  2. + +
  3. Bast fiber: 70-77% cellulose. Hurd: 40-48% cellulose. Whole stem: 47-55%. PMC 8819531, "Hemp as a potential raw material toward a sustainable world."
  4. + +
  5. Liao (2022), McGill University thesis: 49.6% yield from bast, 23.9% from hurd. ITJFS (2024): 38.4% from whole hemp. PMC 12073554 (2025): 47% after sequential NaOH & HCl treatments.
  6. + +
  7. Cellulose-based bioplastics decompose in 3-6 months under composting conditions. European Bioplastics certification standards (EN 13432).
  8. + +
  9. Lampoon Magazine / Western University: "100% hemp-derived polymer has been successfully developed at laboratory level but has yet to become commercially viable."
  10. + +
  11. U.S. EPA, Advancing Sustainable Materials Management: 35.7 million tons plastic in MSW (2018). OECD: 221 kg/capita/year (2019). Law et al.: 130 kg/capita/year (2016).
  12. + +
  13. EPA packaging fraction: 14.5 million tons nationally (~113 kg/household/year). EPA Facts & Figures, 2018 data.
  14. + +
  15. CannaTech Today (2018): ~$2.35/lb ($5.18/kg) for hemp plastic pellets vs. $1.00-1.15/lb for polypropylene. Plastics Engineering (2025): bioplastics general range $2.50-15.00/kg.
  16. + +
  17. Heartland Hemp Cooperative. Farm Progress (Dec 2020), Cannabis Business Times (Nov 2020). Farmer-owned co-op, $500/share, 20-40 member-farmers within 150-mile radius of Louisville, KY.
  18. + +
  19. Western Fiber, Riverdale, California. Converted cooperative cotton gin to process hemp. NCAT/ATTRA video documentation (2021). ~8 tons/acre from irrigated San Joaquin Valley fields.
  20. + +
  21. Winona's Hemp / Anishinaabe Agriculture Institute, White Earth, Minnesota. One Earth (2022). Indigenous-led decortication facility across northern plains tribal land.
  22. + +
  23. PMC 7356019, PMC 7362229: 2-17.5% NaOH solutions, 50-90Β°C, 2-5 hours. Above 10% concentration risks fiber damage.
  24. + +
  25. European Bioplastics: PLA at $2-3/kg, PHA at $4-9/kg. PLA price fell ~50% since 2007 (9% annual decrease) as production infrastructure scaled.
  26. +
+
+ +
+ +

← single-use plastics Β· manifesto

+ +
+ + + + + + + diff --git a/hemp-bioplastic/process/factory/img/distributed-hub.dot b/hemp-bioplastic/process/factory/img/distributed-hub.dot new file mode 100644 index 0000000..33f30a0 --- /dev/null +++ b/hemp-bioplastic/process/factory/img/distributed-hub.dot @@ -0,0 +1,60 @@ +digraph distributed_hub { + bgcolor="#1a1a2e" + rankdir=TB + node [fontname="Helvetica" fontsize=10 style=filled shape=box] + edge [color="#888888" fontname="Helvetica" fontsize=9 fontcolor="#aaaaaa"] + + label=<distributed hub replication model> + labelloc=t + + subgraph cluster_model { + label="LOCAL FIBER, STANDARDIZED PROCESS, LOCAL PRODUCTS" fontcolor="#cccccc" fontsize=11 fontname="Helvetica Bold" + color="#555555" style=dashed + + subgraph cluster_local_in { + label="LOCAL INPUTS" fontcolor="#4CAF50" fontsize=10 fontname="Helvetica Bold" + color="#4CAF50" style=dashed + + farm1 [label="local hemp farm" fillcolor="#2E7D32" fontcolor="white"] + farm2 [label="nettle foraging\ncommunity land" fillcolor="#388E3C" fontcolor="white"] + farm3 [label="sawmill refuse\nlocal timber" fillcolor="#4E342E" fontcolor="white"] + } + + subgraph cluster_standard { + label="STANDARDIZED PROCESSING" fontcolor="#2196F3" fontsize=10 fontname="Helvetica Bold" + color="#2196F3" style=dashed + + process [label="7-station factory\nstandard equipment\nstandard recipes\nstandard quality checks" fillcolor="#1565C0" fontcolor="white"] + } + + subgraph cluster_local_out { + label="LOCAL PRODUCTS" fontcolor="#FF9800" fontsize=10 fontname="Helvetica Bold" + color="#FF9800" style=dashed + + market [label="local farm market\ndirect to consumer" fillcolor="#E65100" fontcolor="white"] + coop [label="food co-ops\nzero waste shops" fillcolor="#F57C00" fontcolor="white"] + school [label="schools & community\neducation programs" fillcolor="#FF9800" fontcolor="white"] + } + } + + farm1 -> process + farm2 -> process + farm3 -> process + process -> market + process -> coop + process -> school + + subgraph cluster_hubs { + label="HUB NETWORK" fontcolor="#8E24AA" fontsize=11 fontname="Helvetica Bold" + color="#8E24AA" style=dashed + + hub1 [label="Hub A\nrural village\nhemp focus" fillcolor="#6A1B9A" fontcolor="white"] + hub2 [label="Hub B\ncoastal town\nnettle focus" fillcolor="#7B1FA2" fontcolor="white"] + hub3 [label="Hub C\nforest region\nwood refuse focus" fillcolor="#8E24AA" fontcolor="white"] + hub4 [label="Hub D\nyour community\n?" fillcolor="#9C27B0" fontcolor="white"] + } + + hub1 -> hub2 -> hub3 -> hub4 [style=dashed color="#8E24AA" label="shared\nknowledge"] + + replicate [label="each hub adapts\nfiber sources to local ecology\nproducts to local demand\npricing to local economy" fillcolor="#263238" fontcolor="#CDDC39" shape=note fontsize=9] +} diff --git a/hemp-bioplastic/process/factory/img/distributed-hub.png b/hemp-bioplastic/process/factory/img/distributed-hub.png new file mode 100644 index 0000000..83695ab Binary files /dev/null and b/hemp-bioplastic/process/factory/img/distributed-hub.png differ diff --git a/hemp-bioplastic/process/factory/img/distributed-hub.svg b/hemp-bioplastic/process/factory/img/distributed-hub.svg new file mode 100644 index 0000000..dd6547f --- /dev/null +++ b/hemp-bioplastic/process/factory/img/distributed-hub.svg @@ -0,0 +1,192 @@ + + + + + + +distributed_hub + +distributed hub replication model + +cluster_model + +LOCAL FIBER, STANDARDIZED PROCESS, LOCAL PRODUCTS + + +cluster_local_in + +LOCAL INPUTS + + +cluster_standard + +STANDARDIZED PROCESSING + + +cluster_local_out + +LOCAL PRODUCTS + + +cluster_hubs + +HUB NETWORK + + + +farm1 + +local hemp farm + + + +process + +7-station factory +standard equipment +standard recipes +standard quality checks + + + +farm1->process + + + + + +farm2 + +nettle foraging +community land + + + +farm2->process + + + + + +farm3 + +sawmill refuse +local timber + + + +farm3->process + + + + + +market + +local farm market +direct to consumer + + + +process->market + + + + + +coop + +food co-ops +zero waste shops + + + +process->coop + + + + + +school + +schools & community +education programs + + + +process->school + + + + + +hub1 + +Hub A +rural village +hemp focus + + + +hub2 + +Hub B +coastal town +nettle focus + + + +hub1->hub2 + + +shared +knowledge + + + +hub3 + +Hub C +forest region +wood refuse focus + + + +hub2->hub3 + + +shared +knowledge + + + +hub4 + +Hub D +your community +? + + + +hub3->hub4 + + +shared +knowledge + + + +replicate + + + +each hub adapts +fiber sources to local ecology +products to local demand +pricing to local economy + + + diff --git a/hemp-bioplastic/process/factory/img/extraction-station.dot b/hemp-bioplastic/process/factory/img/extraction-station.dot new file mode 100644 index 0000000..603fb95 --- /dev/null +++ b/hemp-bioplastic/process/factory/img/extraction-station.dot @@ -0,0 +1,45 @@ +digraph extraction_station { + bgcolor="#1a1a2e" + rankdir=TB + node [fontname="Helvetica" fontsize=10 style=filled shape=box] + edge [color="#888888" fontname="Helvetica" fontsize=9 fontcolor="#aaaaaa"] + + label=<station 2: extraction (two paths)> + labelloc=t + + fiber_in [label="PREPARED FIBER\nfrom Station 1" fillcolor="#66BB6A" fontcolor="white"] + + subgraph cluster_naoh { + label="PATH A: NaOH EXTRACTION" fontcolor="#2196F3" fontsize=11 fontname="Helvetica Bold" + color="#2196F3" style=dashed + + naoh_dissolve [label="dissolve NaOH\n5-12% solution" fillcolor="#1565C0" fontcolor="white"] + naoh_soak [label="soak fiber\n80C for 2-3 hours\nor room temp 4 hours" fillcolor="#1976D2" fontcolor="white"] + naoh_filter [label="filter & wash\nuntil pH neutral" fillcolor="#1E88E5" fontcolor="white"] + naoh_dissolve -> naoh_soak -> naoh_filter + } + + subgraph cluster_citric { + label="PATH B: CITRIC ACID CROSSLINK" fontcolor="#FF9800" fontsize=11 fontname="Helvetica Bold" + color="#FF9800" style=dashed + + citric_paper [label="spread fiber\npress into sheets" fillcolor="#E65100" fontcolor="white"] + citric_soak [label="soak in\ncitric acid + glycerol" fillcolor="#F57C00" fontcolor="white"] + citric_cure [label="cure at 140C\nunder pressure" fillcolor="#FF9800" fontcolor="white"] + citric_paper -> citric_soak -> citric_cure + } + + fiber_in -> naoh_dissolve [label="higher purity\nmore waste"] + fiber_in -> citric_paper [label="less waste\nsimpler setup"] + + cellulose_out [label="RAW CELLULOSE\nto Station 3" fillcolor="#64B5F6" fontcolor="#1a1a2e" shape=doubleoctagon] + naoh_filter -> cellulose_out + citric_cure -> cellulose_out + + waste_a [label="NaOH waste liquor\nneutralize before disposal" fillcolor="#37474F" fontcolor="#aaaaaa" shape=ellipse] + naoh_soak -> waste_a [style=dashed color="#555555"] + + note_citric [label="citric acid path\nproduces less waste\n& avoids NaOH hazards" fillcolor="#263238" fontcolor="#CDDC39" shape=note fontsize=9] + + rotation [label="continuous operation:\n3-4 reaction vessels\nrotating through stages" fillcolor="#263238" fontcolor="#CDDC39" shape=note fontsize=9] +} diff --git a/hemp-bioplastic/process/factory/img/extraction-station.png b/hemp-bioplastic/process/factory/img/extraction-station.png new file mode 100644 index 0000000..5383f56 Binary files /dev/null and b/hemp-bioplastic/process/factory/img/extraction-station.png differ diff --git a/hemp-bioplastic/process/factory/img/extraction-station.svg b/hemp-bioplastic/process/factory/img/extraction-station.svg new file mode 100644 index 0000000..b24dfe4 --- /dev/null +++ b/hemp-bioplastic/process/factory/img/extraction-station.svg @@ -0,0 +1,167 @@ + + + + + + +extraction_station + +station 2: extraction (two paths) + +cluster_naoh + +PATH A: NaOH EXTRACTION + + +cluster_citric + +PATH B: CITRIC ACID CROSSLINK + + + +fiber_in + +PREPARED FIBER +from Station 1 + + + +naoh_dissolve + +dissolve NaOH +5-12% solution + + + +fiber_in->naoh_dissolve + + +higher purity +more waste + + + +citric_paper + +spread fiber +press into sheets + + + +fiber_in->citric_paper + + +less waste +simpler setup + + + +naoh_soak + +soak fiber +80C for 2-3 hours +or room temp 4 hours + + + +naoh_dissolve->naoh_soak + + + + + +naoh_filter + +filter & wash +until pH neutral + + + +naoh_soak->naoh_filter + + + + + +waste_a + +NaOH waste liquor +neutralize before disposal + + + +naoh_soak->waste_a + + + + + +cellulose_out + + +RAW CELLULOSE +to Station 3 + + + +naoh_filter->cellulose_out + + + + + +citric_soak + +soak in +citric acid + glycerol + + + +citric_paper->citric_soak + + + + + +citric_cure + +cure at 140C +under pressure + + + +citric_soak->citric_cure + + + + + +citric_cure->cellulose_out + + + + + +note_citric + + + +citric acid path +produces less waste +& avoids NaOH hazards + + + +rotation + + + +continuous operation: +3-4 reaction vessels +rotating through stages + + + diff --git a/hemp-bioplastic/process/factory/img/factory-flow.dot b/hemp-bioplastic/process/factory/img/factory-flow.dot new file mode 100644 index 0000000..6671a3a --- /dev/null +++ b/hemp-bioplastic/process/factory/img/factory-flow.dot @@ -0,0 +1,33 @@ +digraph factory_flow { + bgcolor="#1a1a2e" + rankdir=TB + node [fontname="Helvetica" fontsize=10 style=filled shape=box] + edge [color="#888888" fontname="Helvetica" fontsize=9 fontcolor="#aaaaaa"] + + label=<continuous-flow bioplastic factory: 7 stations> + labelloc=t + + s1 [label="STATION 1\nFiber Intake & Prep\nhemp, nettle, wood refuse" fillcolor="#2E7D32" fontcolor="white"] + s2 [label="STATION 2\nExtraction\nNaOH or citric acid" fillcolor="#1565C0" fontcolor="white"] + s3 [label="STATION 3\nWashing & Drying\ncounter-current wash" fillcolor="#1976D2" fontcolor="white"] + s4 [label="STATION 4\nMixing\ncellulose + glycerol + pigment" fillcolor="#7B1FA2" fontcolor="white"] + s5 [label="STATION 5\nPressing & Molding\nhot press 150-240C" fillcolor="#E65100" fontcolor="white"] + s6 [label="STATION 6\nFinishing\ntrim, inspect, stamp" fillcolor="#FF9800" fontcolor="white"] + s7 [label="COMPOST DEMO\ndisplay only\nhot aerobic 60-70C" fillcolor="#795548" fontcolor="white"] + + s1 -> s2 [label="prepared\nfiber"] + s2 -> s3 [label="raw\ncellulose"] + s3 -> s4 [label="dry\ncellulose"] + s4 -> s5 [label="mixed\ncompound"] + s5 -> s6 [label="pressed\nproducts"] + s6 -> s7 [label="demo\nsamples"] + + fiber [label="local fiber sources\nhemp, nettle, wood refuse" fillcolor="#263238" fontcolor="#CDDC39" shape=note fontsize=9] + fiber -> s1 [style=dashed color="#66BB6A"] + + products [label="durable products\nkitchen, garden, storage\nyears of daily use" fillcolor="#263238" fontcolor="#CDDC39" shape=note fontsize=9] + s6 -> products [style=dashed color="#FFC107"] + + compost [label="end of life\nhot aerobic compost only\n60-70C, 12-24 weeks" fillcolor="#263238" fontcolor="#CDDC39" shape=note fontsize=9] + s7 -> compost [style=dashed color="#795548"] +} diff --git a/hemp-bioplastic/process/factory/img/factory-flow.png b/hemp-bioplastic/process/factory/img/factory-flow.png new file mode 100644 index 0000000..6791ef6 Binary files /dev/null and b/hemp-bioplastic/process/factory/img/factory-flow.png differ diff --git a/hemp-bioplastic/process/factory/img/factory-flow.svg b/hemp-bioplastic/process/factory/img/factory-flow.svg new file mode 100644 index 0000000..759cac8 --- /dev/null +++ b/hemp-bioplastic/process/factory/img/factory-flow.svg @@ -0,0 +1,165 @@ + + + + + + +factory_flow + +continuous-flow bioplastic factory: 7 stations + + +s1 + +STATION 1 +Fiber Intake & Prep +hemp, nettle, wood refuse + + + +s2 + +STATION 2 +Extraction +NaOH or citric acid + + + +s1->s2 + + +prepared +fiber + + + +s3 + +STATION 3 +Washing & Drying +counter-current wash + + + +s2->s3 + + +raw +cellulose + + + +s4 + +STATION 4 +Mixing +cellulose + glycerol + pigment + + + +s3->s4 + + +dry +cellulose + + + +s5 + +STATION 5 +Pressing & Molding +hot press 150-240C + + + +s4->s5 + + +mixed +compound + + + +s6 + +STATION 6 +Finishing +trim, inspect, stamp + + + +s5->s6 + + +pressed +products + + + +s7 + +COMPOST DEMO +display only +hot aerobic 60-70C + + + +s6->s7 + + +demo +samples + + + +products + + + +durable products +kitchen, garden, storage +years of daily use + + + +s6->products + + + + + +compost + + + +end of life +hot aerobic compost only +60-70C, 12-24 weeks + + + +s7->compost + + + + + +fiber + + + +local fiber sources +hemp, nettle, wood refuse + + + +fiber->s1 + + + + + diff --git a/hemp-bioplastic/process/factory/img/fiber-intake.dot b/hemp-bioplastic/process/factory/img/fiber-intake.dot new file mode 100644 index 0000000..45a50f4 --- /dev/null +++ b/hemp-bioplastic/process/factory/img/fiber-intake.dot @@ -0,0 +1,50 @@ +digraph fiber_intake { + bgcolor="#1a1a2e" + rankdir=TB + node [fontname="Helvetica" fontsize=10 style=filled shape=box] + edge [color="#888888" fontname="Helvetica" fontsize=9 fontcolor="#aaaaaa"] + + label=<station 1: fiber intake & prep> + labelloc=t + + subgraph cluster_hemp { + label="HEMP" fontcolor="#4CAF50" fontsize=11 fontname="Helvetica Bold" + color="#4CAF50" style=dashed + + hemp_in [label="hemp stalks\nbast fiber, 77% cellulose" fillcolor="#2E7D32" fontcolor="white"] + hemp_ret [label="ret 3-45 days\nor water ret 10 days" fillcolor="#388E3C" fontcolor="white"] + hemp_dec [label="decorticate\nseparate bast from hurd" fillcolor="#43A047" fontcolor="white"] + hemp_in -> hemp_ret -> hemp_dec + } + + subgraph cluster_nettle { + label="NETTLE" fontcolor="#66BB6A" fontsize=11 fontname="Helvetica Bold" + color="#66BB6A" style=dashed + + nettle_in [label="nettle stalks\nbast fiber, 65% cellulose" fillcolor="#2E7D32" fontcolor="white"] + nettle_ret [label="water ret 7-14 days\nfaster than hemp" fillcolor="#388E3C" fontcolor="white"] + nettle_dec [label="strip bast fiber\nby hand or machine" fillcolor="#43A047" fontcolor="white"] + nettle_in -> nettle_ret -> nettle_dec + } + + subgraph cluster_wood { + label="WOOD REFUSE" fontcolor="#8D6E63" fontsize=11 fontname="Helvetica Bold" + color="#8D6E63" style=dashed + + wood_in [label="sawmill offcuts\nchips, shavings, dust" fillcolor="#4E342E" fontcolor="white"] + wood_chip [label="chip to uniform size\n2-5 mm pieces" fillcolor="#5D4037" fontcolor="white"] + wood_sort [label="remove bark, knots\nsort by species" fillcolor="#6D4C41" fontcolor="white"] + wood_in -> wood_chip -> wood_sort + } + + chop [label="chop to 2-3 cm\nuniform fiber length" fillcolor="#66BB6A" fontcolor="white"] + weigh [label="weigh & batch\nrecord fiber source ratio" fillcolor="#81C784" fontcolor="#1a1a2e"] + prepared [label="PREPARED FIBER\nready for extraction" fillcolor="#A5D6A7" fontcolor="#1a1a2e" shape=doubleoctagon] + + hemp_dec -> chop + nettle_dec -> chop + wood_sort -> chop + chop -> weigh -> prepared + + equip [label="equipment:\ndecorticator, chopper\nretting tanks, sorting table\nscale" fillcolor="#263238" fontcolor="#CDDC39" shape=note fontsize=9] +} diff --git a/hemp-bioplastic/process/factory/img/fiber-intake.png b/hemp-bioplastic/process/factory/img/fiber-intake.png new file mode 100644 index 0000000..e59ada6 Binary files /dev/null and b/hemp-bioplastic/process/factory/img/fiber-intake.png differ diff --git a/hemp-bioplastic/process/factory/img/fiber-intake.svg b/hemp-bioplastic/process/factory/img/fiber-intake.svg new file mode 100644 index 0000000..c0cdaf2 --- /dev/null +++ b/hemp-bioplastic/process/factory/img/fiber-intake.svg @@ -0,0 +1,191 @@ + + + + + + +fiber_intake + +station 1: fiber intake & prep + +cluster_hemp + +HEMP + + +cluster_nettle + +NETTLE + + +cluster_wood + +WOOD REFUSE + + + +hemp_in + +hemp stalks +bast fiber, 77% cellulose + + + +hemp_ret + +ret 3-45 days +or water ret 10 days + + + +hemp_in->hemp_ret + + + + + +hemp_dec + +decorticate +separate bast from hurd + + + +hemp_ret->hemp_dec + + + + + +chop + +chop to 2-3 cm +uniform fiber length + + + +hemp_dec->chop + + + + + +nettle_in + +nettle stalks +bast fiber, 65% cellulose + + + +nettle_ret + +water ret 7-14 days +faster than hemp + + + +nettle_in->nettle_ret + + + + + +nettle_dec + +strip bast fiber +by hand or machine + + + +nettle_ret->nettle_dec + + + + + +nettle_dec->chop + + + + + +wood_in + +sawmill offcuts +chips, shavings, dust + + + +wood_chip + +chip to uniform size +2-5 mm pieces + + + +wood_in->wood_chip + + + + + +wood_sort + +remove bark, knots +sort by species + + + +wood_chip->wood_sort + + + + + +wood_sort->chop + + + + + +weigh + +weigh & batch +record fiber source ratio + + + +chop->weigh + + + + + +prepared + + +PREPARED FIBER +ready for extraction + + + +weigh->prepared + + + + + +equip + + + +equipment: +decorticator, chopper +retting tanks, sorting table +scale + + + diff --git a/hemp-bioplastic/process/factory/img/pressing-station.dot b/hemp-bioplastic/process/factory/img/pressing-station.dot new file mode 100644 index 0000000..d5eaf4b --- /dev/null +++ b/hemp-bioplastic/process/factory/img/pressing-station.dot @@ -0,0 +1,40 @@ +digraph pressing_station { + bgcolor="#1a1a2e" + rankdir=LR + node [fontname="Helvetica" fontsize=10 style=filled shape=box] + edge [color="#888888" fontname="Helvetica" fontsize=9 fontcolor="#aaaaaa"] + + label=<station 5: pressing & mold rotation> + labelloc=t + + compound [label="MIXED COMPOUND\nfrom Station 4" fillcolor="#7B1FA2" fontcolor="white"] + + subgraph cluster_rotation { + label="MOLD ROTATION CYCLE" fontcolor="#FF9800" fontsize=11 fontname="Helvetica Bold" + color="#FF9800" style=dashed + + load [label="LOAD\nfill mold with compound\ncompress, add lid" fillcolor="#E65100" fontcolor="white"] + cure [label="CURE\nhot press 150-240C\n10-30 min under pressure" fillcolor="#FF6F00" fontcolor="white"] + cool [label="COOL\nslow cool in mold\nprevent cracking" fillcolor="#FF9800" fontcolor="white"] + demold [label="DEMOLD\nrelease product\nclean mold for reuse" fillcolor="#FFC107" fontcolor="#1a1a2e"] + + load -> cure -> cool -> demold + demold -> load [label="mold returns\nto loading" style=dashed color="#FFC107"] + } + + compound -> load + + products [label="PRESSED PRODUCTS\nto Station 6" fillcolor="#FFC107" fontcolor="#1a1a2e" shape=doubleoctagon] + demold -> products + + subgraph cluster_molds { + label="PRODUCT MOLDS" fontcolor="#aaaaaa" fontsize=11 fontname="Helvetica Bold" + color="#555555" style=dashed + + bowls [label="bowls & plates\n150-180C, 20 min" fillcolor="#E65100" fontcolor="white"] + pots [label="garden pots\n160-200C, 25 min" fillcolor="#F57C00" fontcolor="white"] + boxes [label="storage boxes\n180-240C, 30 min" fillcolor="#FF9800" fontcolor="white"] + } + + note [label="multiple mold sets\nrotate through cycle\n4-6 presses per day\nper mold" fillcolor="#263238" fontcolor="#CDDC39" shape=note fontsize=9] +} diff --git a/hemp-bioplastic/process/factory/img/pressing-station.png b/hemp-bioplastic/process/factory/img/pressing-station.png new file mode 100644 index 0000000..829c086 Binary files /dev/null and b/hemp-bioplastic/process/factory/img/pressing-station.png differ diff --git a/hemp-bioplastic/process/factory/img/pressing-station.svg b/hemp-bioplastic/process/factory/img/pressing-station.svg new file mode 100644 index 0000000..072bae1 --- /dev/null +++ b/hemp-bioplastic/process/factory/img/pressing-station.svg @@ -0,0 +1,141 @@ + + + + + + +pressing_station + +station 5: pressing & mold rotation + +cluster_rotation + +MOLD ROTATION CYCLE + + +cluster_molds + +PRODUCT MOLDS + + + +compound + +MIXED COMPOUND +from Station 4 + + + +load + +LOAD +fill mold with compound +compress, add lid + + + +compound->load + + + + + +cure + +CURE +hot press 150-240C +10-30 min under pressure + + + +load->cure + + + + + +cool + +COOL +slow cool in mold +prevent cracking + + + +cure->cool + + + + + +demold + +DEMOLD +release product +clean mold for reuse + + + +cool->demold + + + + + +demold->load + + +mold returns +to loading + + + +products + + +PRESSED PRODUCTS +to Station 6 + + + +demold->products + + + + + +bowls + +bowls & plates +150-180C, 20 min + + + +pots + +garden pots +160-200C, 25 min + + + +boxes + +storage boxes +180-240C, 30 min + + + +note + + + +multiple mold sets +rotate through cycle +4-6 presses per day +per mold + + + diff --git a/hemp-bioplastic/process/factory/img/product-catalog.dot b/hemp-bioplastic/process/factory/img/product-catalog.dot new file mode 100644 index 0000000..2fe3bc7 --- /dev/null +++ b/hemp-bioplastic/process/factory/img/product-catalog.dot @@ -0,0 +1,43 @@ +digraph product_catalog { + bgcolor="#1a1a2e" + rankdir=TB + node [fontname="Helvetica" fontsize=10 style=filled shape=box] + edge [style=invis] + + label=<product catalog: three categories> + labelloc=t + + subgraph cluster_kitchen { + label="KITCHEN & DINING" fontcolor="#FF9800" fontsize=11 fontname="Helvetica Bold" + color="#FF9800" style=dashed + + bowls [label="bowls\n15 cm, 80g\n20% glycerol" fillcolor="#E65100" fontcolor="white"] + plates [label="plates\n22 cm, 120g\n15% glycerol" fillcolor="#F57C00" fontcolor="white"] + cups [label="cups\n250 mL, 60g\n20% glycerol" fillcolor="#FF9800" fontcolor="white"] + trivets [label="trivets\n18 cm, 150g\n15% glycerol" fillcolor="#FFA726" fontcolor="white"] + bowls -> plates -> cups -> trivets + } + + subgraph cluster_garden { + label="GARDEN & GROWING" fontcolor="#4CAF50" fontsize=11 fontname="Helvetica Bold" + color="#4CAF50" style=dashed + + pots [label="plant pots\n10-15 cm, 90g\n15% glycerol" fillcolor="#2E7D32" fontcolor="white"] + trays [label="seed trays\n30x20 cm, 200g\n15% glycerol" fillcolor="#388E3C" fontcolor="white"] + labels [label="plant labels\n12x3 cm, 10g\n15% glycerol" fillcolor="#43A047" fontcolor="white"] + pots -> trays -> labels + } + + subgraph cluster_storage { + label="STORAGE & ORGANIZATION" fontcolor="#8E24AA" fontsize=11 fontname="Helvetica Bold" + color="#8E24AA" style=dashed + + lidbox [label="lidded boxes\n15x15x8 cm, 180g\n20% glycerol" fillcolor="#6A1B9A" fontcolor="white"] + organizer [label="desk organizers\n25x10x8 cm, 160g\n15% glycerol" fillcolor="#7B1FA2" fontcolor="white"] + lidbox -> organizer + } + + lifespan [label="all products:\n3-5 years daily use\nbiodegrade in hot compost\n60-70C, 12-24 weeks" fillcolor="#263238" fontcolor="#CDDC39" shape=note fontsize=9] + + care [label="care: hand wash\ndo NOT dishwasher >60C\ndo NOT microwave\ndo NOT soak overnight" fillcolor="#263238" fontcolor="#CDDC39" shape=note fontsize=9] +} diff --git a/hemp-bioplastic/process/factory/img/product-catalog.png b/hemp-bioplastic/process/factory/img/product-catalog.png new file mode 100644 index 0000000..98442ad Binary files /dev/null and b/hemp-bioplastic/process/factory/img/product-catalog.png differ diff --git a/hemp-bioplastic/process/factory/img/product-catalog.svg b/hemp-bioplastic/process/factory/img/product-catalog.svg new file mode 100644 index 0000000..acfb3df --- /dev/null +++ b/hemp-bioplastic/process/factory/img/product-catalog.svg @@ -0,0 +1,129 @@ + + + + + + +product_catalog + +product catalog: three categories + +cluster_kitchen + +KITCHEN & DINING + + +cluster_garden + +GARDEN & GROWING + + +cluster_storage + +STORAGE & ORGANIZATION + + + +bowls + +bowls +15 cm, 80g +20% glycerol + + + +plates + +plates +22 cm, 120g +15% glycerol + + + + +cups + +cups +250 mL, 60g +20% glycerol + + + + +trivets + +trivets +18 cm, 150g +15% glycerol + + + + +pots + +plant pots +10-15 cm, 90g +15% glycerol + + + +trays + +seed trays +30x20 cm, 200g +15% glycerol + + + + +labels + +plant labels +12x3 cm, 10g +15% glycerol + + + + +lidbox + +lidded boxes +15x15x8 cm, 180g +20% glycerol + + + +organizer + +desk organizers +25x10x8 cm, 160g +15% glycerol + + + + +lifespan + + + +all products: +3-5 years daily use +biodegrade in hot compost +60-70C, 12-24 weeks + + + +care + + + +care: hand wash +do NOT dishwasher >60C +do NOT microwave +do NOT soak overnight + + + diff --git a/hemp-bioplastic/process/factory/index.html b/hemp-bioplastic/process/factory/index.html new file mode 100644 index 0000000..8169603 --- /dev/null +++ b/hemp-bioplastic/process/factory/index.html @@ -0,0 +1,554 @@ + + + + bioplastic factory — unturf. + + + + + + + + + +
+ +

unturf.

+

grow food not lawn

+ + +

Bioplastic Factory

+ +

+A continuous-flow factory producing durable everyday products from plant fiber. Not batch processing. Not single-use packaging. Products survive years of daily use but biodegrade fully in hot aerobic compost (60-70C). Three fiber sources feed the same standardized process: hemp, nettle, & wood refuse. Designed for replication as distributed hubs worldwide. +

+ +

+This page describes a complete 7-station production line. Batch recipes live on a process page. A 4-day homeschool curriculum lives on a homeschool page. This factory page covers continuous production at community scale. +

+ + + + + +OVERVIEW +

7-Station Flow

+ +
+ 7-station continuous-flow bioplastic factory overview +
fiber enters at station 1, finished products leave at station 6, compost demo runs at station 7.
+
+ + + + + + + + + + + + + + +
StationNameInputOutputEquipmentCycle Time
1Fiber Intake & PrepRaw stalks & wood refusePrepared fiber (chopped, sorted)Decorticator, chopper, retting tanks, scaleContinuous intake
2ExtractionPrepared fiberRaw celluloseReaction vessels (3-4), filtration, pH meter2-4 hours per vessel
3Washing & DryingRaw celluloseDry celluloseCounter-current wash line, convection dryer4-8 hours
4MixingDry celluloseMixed compoundHeated mixer, scale, pigment dispensers60-90 minutes
5Pressing & MoldingMixed compoundPressed productsHot press, mold sets, temperature controller30-60 min per press
6FinishingPressed productsFinished goodsTrim station, inspection table, stamp press5-10 min per product
7Compost DemoDemo samplesDisplay & educationHot compost bin (60-70C), timeline displayOngoing display
+ + + + + +STATION 1 +

Fiber Intake & Prep

+ +

+Three fiber sources converge into a single "prepared fiber" stream. Each source follows a parallel prep path adapted to its characteristics, then all merge at chopping & weighing. +

+ +
+ Three fiber sources converging: hemp, nettle, wood refuse +
hemp, nettle, & wood refuse follow parallel prep paths before merging.
+
+ +

Hemp (primary source)

+
    +
  • Bast fiber from stalks, 77% cellulose content
  • +
  • Ret 3-45 days (depending on temperature) or water ret 10 days
  • +
  • Decorticate: separate bast from hurd using decorticator or by hand
  • +
+ +

Nettle (secondary source)

+
    +
  • Bast fiber from stalks, ~65% cellulose content[1]
  • +
  • Water ret 7-14 days, faster breakdown than hemp
  • +
  • Strip bast fiber by hand or small decorticator
  • +
  • Grows wild on marginal land, requires no cultivation
  • +
+ +

Wood Refuse (supplementary source)

+
    +
  • Sawmill offcuts, chips, shavings from local timber operations
  • +
  • Chip to uniform 2-5 mm pieces
  • +
  • Sort: remove bark, knots, & resinous species (pine, cedar)
  • +
  • Hardwoods preferred: beech, birch, poplar offer 40-50% cellulose[2]
  • +
+ +

Convergence

+
    +
  1. Chop all prepared fiber to uniform 2-3 cm lengths
  2. +
  3. Weigh & record source ratio per batch (enables quality tracking)
  4. +
  5. Output: prepared fiber, ready for extraction
  6. +
+ +
+Equipment list: decorticator (hand-crank or motorized), fiber chopper, retting tanks (3-4 for rotation), sorting table, digital scale (1g precision), labeled storage bins per fiber source. +
+ + + + + +STATION 2 +

Extraction

+ +

+Two extraction paths run as factory alternatives. A hub selects one path based on local chemistry comfort, waste handling capacity, & product goals. Both paths accept the same prepared fiber from Station 1 & output raw cellulose to Station 3. +

+ +
+ NaOH extraction path versus citric acid crosslinking path +
each hub chooses one path. both produce usable cellulose for pressing.
+
+ +

Path A: NaOH Extraction

+
+Process:
+1. Dissolve NaOH in water (5-12% solution depending on fiber source)
+2. Add prepared fiber. Heat to 80C with stirring for 2-3 hours (or soak at room temperature for 4 hours using 5% NaOH)[3]
+3. Filter. Wash 4-6 times until pH neutral
+4. Output: purified cellulose (removes lignin, hemicellulose, pectin)

+Continuous operation: rotate 3-4 reaction vessels through stages. While vessel A soaks, vessel B gets filtered, vessel C gets loaded. No downtime. +
+ +

Path B: Citric Acid Crosslinking

+
+Process:
+1. Spread prepared fiber onto screens, press into sheets
+2. Soak sheets in citric acid + glycerol solution
+3. Cure at 140C under pressure[4]
+4. Output: crosslinked cellulose material (up to 70 MPa tensile strength)

+Continuous operation: stagger sheet production. While batch A cures, batch B soaks, batch C gets pressed into sheets. +
+ +
+Honest comparison: citric acid path produces less chemical waste, avoids NaOH safety hazards, & requires simpler equipment. NaOH path achieves purer cellulose isolation & works better with mixed or lower-quality fiber sources. Neither path stays universally superior. +
+ + + + + +STATION 3 +

Washing & Drying

+ +

+Buffer station between extraction & pressing. Removes residual chemicals, reduces moisture to pressing readiness. +

+ +

Counter-Current Washing

+

+Fresh water enters at the cleanest stage (final rinse). Used water from each stage flows backward to the dirtiest stage (first rinse). This approach reduces water consumption 3-4x compared to batch rinsing.[5] +

+ +
+Wash stages:
+1. First rinse (receives used water from stage 2, removes bulk chemicals)
+2. Second rinse (receives used water from stage 3)
+3. Third rinse (receives used water from stage 4)
+4. Final rinse (receives fresh water only, output at pH 7)

+pH check: test wash water after each stage. Final output must read pH 7 (neutral). Residual NaOH weakens finished products. +
+ +

Drying

+
    +
  • Convection dryer: forced hot air at 60-80C, 4-6 hours to bone dry
  • +
  • Solar tunnel (warm climates): passive solar heat, 8-12 hours, zero energy cost
  • +
  • Critical check: weigh before & after drying. Weight must stabilize. Wet cellulose produces spongy, voided products when pressed.[6]
  • +
+ +
+Moisture kills quality. Steam from trapped water creates internal voids during hot pressing. Every batch must reach stable dry weight before advancing to Station 4. This check represents the single most important quality gate in the entire factory. +
+ + + + + +STATION 4 +

Mixing

+ +

+Dried cellulose gets combined with glycerol (plasticizer), optional citric acid (water resistance), & optional natural pigments. Glycerol ratio determines product flexibility. +

+ +

Glycerol Ratios

+ + + + + + + + + +
Glycerol %ResultProducts
15%RigidPlates, trivets, plant labels, seed trays
20%Semi-flexibleBowls, cups, plant pots, lidded boxes
30%FlexibleLids, gaskets, protective wraps
+ +

Optional Additives

+
    +
  • Citric acid (5% by weight): improves water resistance 7-fold[4]
  • +
  • Natural pigments: turmeric (yellow), spirulina (green), charcoal (black), beetroot powder (red)
  • +
+ +
+Mixing process:
+1. Weigh dried cellulose
+2. Calculate glycerol by target ratio (e.g., 100g cellulose + 20g glycerol for 20% semi-flex)
+3. Add water to form a workable slurry
+4. Heat to 80C & stir for 60 minutes until homogeneous[7]
+5. Add citric acid & pigments during last 10 minutes
+6. Spread on trays, dry at 60C until weight stabilizes
+7. Grind to breadcrumb consistency
+8. Output: mixed compound, ready for pressing +
+ + + + + +STATION 5 +

Pressing & Molding

+ +

+Hot press transforms mixed compound into finished shapes. Mold rotation keeps the press running continuously: while one mold cures, another gets loaded, a third cools, a fourth gets demolded. +

+ +
+ Mold rotation cycle: load, cure, cool, demold +
mold rotation enables 4-6 press cycles per day per mold set.
+
+ +

Product Mold Catalog

+ + + + + + + + + + + + + + +
ProductMold TypeTemp (C)PressureTimeWeight
Bowl (15 cm)Two-part concave160Medium20 min80g
Plate (22 cm)Flat with rim150High15 min120g
Cup (250 mL)Two-part cylinder170Medium20 min60g
Trivet (18 cm)Flat solid180High25 min150g
Plant pot (12 cm)Two-part tapered160Medium20 min90g
Seed tray (30x20 cm)Multi-cavity170High25 min200g
Lidded box (15 cm)Three-part (base+lid+walls)180High30 min180g
Desk organizerMulti-compartment180High30 min160g
+ +
+Press cycle:
+1. Coat mold interior with thin vegetable oil layer
+2. Fill with dry compound, compress lightly by hand, add lid
+3. Load into hot press at target temperature
+4. Apply full pressure & hold for target time
+5. Release pressure
+6. Remove mold, set on cooling rack
+7. Slow cool (minimum 30 minutes, longer for thick products)
+8. Demold when cool to touch
+9. Clean mold & return to loading station +
+ + + + + +STATION 6 +

Finishing

+ +

+Final quality gate before products leave the factory. Three substations run in sequence. +

+ +

Trimming

+
    +
  • Remove flash (excess material squeezed from mold edges)
  • +
  • Sand any rough surfaces or mold lines
  • +
  • File edges smooth
  • +
+ +

Inspection

+ + + + + + + + + + + +
CheckPassFail (regrind)
SurfaceSmooth, uniform colorBubbled, porous, discolored
Sound (tap test)Solid "click"Hollow "thud" (internal voids)
FlexAppropriate for glycerol ratioBrittle cracks or too soft
WeightWithin 10% of targetUnder (voids) or over (wet)
Water dropBeads or absorbs slowlyAbsorbs instantly (needs more citric acid)
+ +

+Failed products get reground & returned to Station 4 for remixing. Nothing gets wasted. +

+ +

Stamping

+
    +
  • Production date (month/year)
  • +
  • Fiber source (H = hemp, N = nettle, W = wood, or combo)
  • +
  • Compost instructions: "HOT COMPOST 60C+ ONLY"
  • +
  • Hub identifier code
  • +
+ + + + + +STATION 7 +

Compost Demo Station

+ +

+Display, not production. Shows customers & visitors exactly what happens to these products at end of life. A maintained hot compost bin (60-70C) contains products at various stages of decomposition. +

+ +
+Composting requires specific conditions. These products biodegrade ONLY in hot aerobic compost reaching 60-70C for sustained periods. They do NOT break down in cold compost piles, landfills, waterways, or soil burial at ambient temperature. "Compostable" means compostable under controlled thermophilic conditions, not "throw anywhere & it vanishes." +
+ +

Decomposition Timeline (Hot Aerobic Compost, 60-70C)

+ + + + + + + + + + + + +
WeekObservation
0-2No visible change. Product retains shape & strength.
2-4Surface softening begins. Color shifts darker.
4-8Product deforms under compost weight. Surface texture becomes rough.
8-12Fragmentation begins. Product breaks into large pieces when handled.
12-16Pieces fragment further. Material becomes indistinguishable from surrounding compost.
16-24Full decomposition. Only cellulose fibers remain, fully integrated into compost.
+ +
+NOT cold pile. NOT landfill. NOT water. A cold backyard compost pile rarely exceeds 40C. These products survive cold piles indefinitely (which counts as a feature during their useful life, not a composting failure). Direct customers to municipal hot compost facilities or dedicated thermophilic composting setups. +
+ + + + + +PRODUCTS +

Product Catalog

+ +
+ Three product categories: kitchen, garden, storage +
all products share the same base material. glycerol ratio & mold shape create variety.
+
+ +

Kitchen & Dining

+ + + + + + + + + + +
ProductDimensionsWeightGlycerolLifespanCare
Bowl15 cm diameter, 7 cm deep80g20%3-5 yearsHand wash, dry promptly
Plate22 cm diameter120g15%3-5 yearsHand wash, dry promptly
Cup250 mL, 9 cm tall60g20%2-3 yearsHand wash, no hot liquids above 80C
Trivet18 cm diameter, 1 cm thick150g15%5+ yearsWipe clean
+ +

Garden & Growing

+ + + + + + + + + +
ProductDimensionsWeightGlycerolLifespanCare
Plant pot10-15 cm diameter90g15%2-3 seasons outdoorsNone needed (degrades slowly in soil contact)
Seed tray30x20 cm, 6 cells200g15%3-5 seasonsRinse between uses, dry before storing
Plant label12x3 cm10g15%1-2 seasonsWrite with pencil (survives weathering)
+ +

Storage & Organization

+ + + + + + + + +
ProductDimensionsWeightGlycerolLifespanCare
Lidded box15x15x8 cm180g20%5+ yearsWipe clean, keep dry
Desk organizer25x10x8 cm160g15%5+ yearsWipe clean
+ +
+Dishwasher temperatures above 60C soften products. Hand wash only. Products tolerate brief water contact (washing, rain) but should not soak overnight. Prolonged hot water exposure reverses the crosslinking that provides rigidity. +
+ + + + + +ECONOMICS +

Factory Economics

+ +

Throughput

+ + + + + + + + + +
MetricDailyWeekly (5 days)Annual (250 days)
Fiber processed20-30 kg100-150 kg5,000-7,500 kg
Products pressed40-80 pieces200-400 pieces10,000-20,000 pieces
Revenue (at $5-15 avg)$200-1,200$1,000-6,000$50,000-300,000
+ +

Equipment Startup Costs

+ + + + + + + + + + + + + + + + + + + +
ItemMinimum (used/DIY)Mid-rangeProfessional
Decorticator (hand-crank)$500$2,000$8,000
Fiber chopper$200$800$3,000
Retting tanks (3-4)$300$1,000$4,000
Reaction vessels (3-4)$600$2,500$10,000
Filtration & wash line$400$1,500$6,000
Convection dryer$800$3,000$12,000
Heated mixer$300$1,200$5,000
Hot press (hydraulic)$2,000$8,000$25,000
Mold sets (8 products)$1,500$4,000$12,000
Finishing station$200$500$2,000
Safety equipment$300$500$1,000
Workspace setup$5,000$10,000$25,000
Total$12,100$35,000$113,000
+ +

Labor

+
    +
  • Minimum crew: 2 people run all 6 production stations
  • +
  • Comfortable crew: 3 people (fiber prep, chemistry, pressing)
  • +
  • Training time: 2-4 weeks from novice to independent operation
  • +
+ + + + + +HUBS +

Distributed Hub Model

+ +

+One factory proves the concept. Many factories change material culture. Each hub adapts fiber sources to local ecology & product mix to local demand while following a standardized process for quality consistency. +

+ +
+ Hub replication model: local fiber, standardized process, local products +
each hub sources locally, processes consistently, sells locally.
+
+ +

Hub Specification

+ + + + + + + + + + + + + + +
ComponentStandardizedLocalized
EquipmentSame specs, same layoutSourced from local suppliers where possible
RecipesSame ratios, temps, timesAdjusted for local fiber cellulose content
Quality checksSame inspection criteriaSame pass/fail thresholds
Fiber sourcesSame prep standardsWhatever grows locally (hemp, nettle, kenaf, jute, wood)
ProductsSame mold designs availableHub selects product mix based on local demand
PricingCost-plus formulaAdjusted to local purchasing power
TrainingSame curriculum & certificationDelivered in local language by local trainers
BrandingShared quality markHub name & local identity
+ +
+Replication Checklist

+☐ Identify local fiber sources (minimum 2 for supply resilience)
+☐ Secure workspace: 80-150 m2, ventilated, water access, 3-phase power
+☐ Source or build equipment (see startup cost table)
+☐ Recruit & train crew of 2-3 people (2-4 week training program)
+☐ Run 50 test batches before selling (refine recipes for local fiber)
+☐ Establish local fiber supply agreements with farmers or foragers
+☐ Set up composting partnership (municipal or dedicated facility)
+☐ Launch with 3-4 products, expand based on demand
+☐ Document local adaptations & share with hub network +
+ + + + + +
+ +

Honest Summary

+ +

+A bioplastic factory at community scale requires real investment ($12k-113k), real labor (2-3 full-time people), & real fiber supply chains. Products compete on durability & compostability, not on price. A bowl that lasts 5 years & composts afterward occupies a different market than a $1 petroleum plastic bowl that persists for centuries. +

+ +

+The distributed hub model works only if each hub achieves consistent quality. Standardized recipes & inspection criteria make that possible. Local fiber sourcing makes each hub resilient to supply disruption. The goal: dozens of hubs producing everyday objects from local plant fiber, each adapted to its ecology & economy. +

+ +

+None of this replaces reducing consumption. Using fewer things remains better than producing more compostable things. But for everyday objects that communities need regardless, growing the material locally & composting it locally closes a cycle that petroleum never can. +

+ + + + + +
+ +

Sources

+ +
+
    +
  1. Bodros & Baley (2008), "Study of the tensile properties of stinging nettle fibres (Urtica dioica)," Materials Letters. Nettle bast fiber composition & mechanical properties.
  2. + +
  3. Rowell et al. (2005), "Cell Wall Chemistry," in Handbook of Wood Chemistry and Wood Composites. Hardwood cellulose content ranges 40-50%.
  4. + +
  5. Dhakal et al. (2022), PMC 9182753. 5% NaOH treatment of hemp at room temperature for 1-4 hours. Gentlest effective protocol.
  6. + +
  7. Beluns et al. (2023), "Sustainable hemp-based bioplastics with tunable properties via reversible thermal crosslinking of cellulose," Int J Biol Macromol. Citric acid crosslinking at 140C, up to 70 MPa tensile strength, 7-fold water uptake reduction.
  8. + +
  9. Geankoplis (2003), Transport Processes and Separation Process Principles. Counter-current washing principles & water reduction factors.
  10. + +
  11. Robert Murray-Smith, "Hot Press Molding Hemp Casein Plastic" (2020). On moisture & pressing: "if it's wet and you heat it and press it, you'll press off a lot of steam and it won't form properly."
  12. + +
  13. Bio-protocol (2025). Hemp cellulose + glycerol + NaOH, stirred 60 min at 80C, hot pressed at 240C for 10 min.
  14. +
+
+ +
+ +

← recipe (full process) Β· homeschool recipe Β· hemp bioplastic overview Β· single-use plastics Β· change password

+ +
+ + + + + + + diff --git a/hemp-bioplastic/process/homeschool/index.html b/hemp-bioplastic/process/homeschool/index.html new file mode 100644 index 0000000..ffc731e --- /dev/null +++ b/hemp-bioplastic/process/homeschool/index.html @@ -0,0 +1,522 @@ + + + + homeschool hemp bioplastic — unturf. + + + + + + + + + +
+ +

unturf.

+

grow food not lawn

+ + +

Homeschool Hemp Bioplastic

+ +

+Three age-appropriate recipes for turning hemp fiber into a physical object you take home. Each recipe uses a different approach from a full process guide, broken into daily sessions like a crafting progression. Each day has clear inputs, a process, & an output. One day's output becomes the next day's input. +

+ +
+All three tiers run on the same 4-day schedule. Mixed-age groups work side by side, each at their own level.

+Sprouts (ages 3-7): explore, measure, mix & mold, demold & decorate. Adult handles stove & oven only.
+Shoots (ages 8-12): gather & chop, make hemp paper, crosslink & cure, wash & cut. Adult handles oven only.
+Stalks (ages 13-18): safety & gather, extract cellulose, dry & mix, press & demold. Students handle all chemistry. Adult supervises & handles oven. +
+ +

4-Day Overview

+ + + + + + + + + + + +
DayThemeSprouts (3-7)Shoots (8-12)Stalks (13-18)
1Explore & GatherTouch, smell, explore hemp fiber. Collect ingredients.Examine fiber. Chop & measure crosslinking solution.Safety briefing. Chop fiber & weigh chemicals.
2PrepareWeigh & bag dry ingredients. Tear fiber. Pick molds.Soak fiber. Spread & press into hemp paper.Dissolve NaOH, soak 2 hours, wash to pH 7.
3TransformCook bioresin (adult), mix fiber, press into molds, oven dry.Apply crosslinking solution. Press. Oven cure at 140C.Oven dry cellulose. Weigh. Mix with glycerol.
4FinishDemold. Decorate. Compare raw fiber to finished coaster.Wash cured sheet. Cut shapes. Compare all samples.Pack mold. Hot press. Demold. Compare all samples.
+ + + + + +MATERIALS +

What You Need

+ +

+Quantities listed per student. Multiply by group size. All ingredients stay food-safe or classroom-safe for their respective age group. +

+ +

Sprouts (ages 3-7)

+
    +
  • 10g hemp bast fiber (chopped short, ~1 cm pieces)
  • +
  • 25g corn starch
  • +
  • 5g dried seaweed (agar powder or carrageenan)
  • +
  • 200 mL water
  • +
  • Small silicone mold or cookie cutter on parchment paper
  • +
  • Mixing bowl & spoon
  • +
  • Oven access (adult only)
  • +
+ +

Shoots (ages 8-12)

+
    +
  • 25g hemp bast fiber (chopped to 2-3 cm lengths)
  • +
  • 15 mL lemon juice concentrate (citric acid source)
  • +
  • 5g glycerol (available at pharmacies)
  • +
  • 500 mL water
  • +
  • Flat screen or mesh (window screen works)
  • +
  • Two flat boards or heavy books for pressing
  • +
  • Baking sheet & parchment paper
  • +
  • Oven access (adult only at 140C)
  • +
+ +

Stalks (ages 13-18)

+
    +
  • 50g hemp bast fiber (chopped to 2-3 cm lengths)
  • +
  • 50g NaOH pellets (sodium hydroxide / lye)
  • +
  • 1 liter water
  • +
  • 10 mL glycerol
  • +
  • Stainless steel pot (NOT aluminum)
  • +
  • pH strips
  • +
  • Metal mold or soap mold
  • +
  • Oven or heat press access
  • +
  • Chemical splash goggles (not safety glasses)
  • +
  • Nitrile gloves, elbow length
  • +
  • 2% vinegar solution for spill neutralization
  • +
+ + + + + +SPROUTS +

Ages 3-7: Hemp Fiber Coaster (4 days)

+ +

+Based on Approach B (fiber + bioresin composite). Kids mix hemp fiber into a seaweed & corn starch bioresin, pour into molds, & take home a decorated coaster or ornament. Adult handles stove & oven only. Short daily sessions match young attention spans. +

+ +
+ Three approaches to hemp bioplastic: this recipe uses Approach B, fiber + bioresin +
Sprouts use Approach B: fiber + bioresin composite. no chemicals beyond kitchen ingredients.
+
+ +

Day 1: Explore & Gather (~30 minutes)

+ +
+Inputs: raw hemp fiber, corn starch, agar powder, pictures or diagram of hemp plant

+ +Process:
+1. Pass around raw hemp fiber. Touch it, pull strands apart, smell it. Compare thick bundles to thin single threads. (~10 min, kids active)
+2. Talk about where hemp comes from: a plant stalk taller than most adults. Show plant anatomy diagram. Point to the stalk bark where fiber lives.
+3. Touch & smell each ingredient: agar powder (from seaweed in the ocean), corn starch (from corn). Taste a tiny pinch of corn starch. (~5 min, kids active)
+4. Collect all ingredients into a basket or tray. Label them together. (~5 min, kids active)
+5. Preview: "Over 4 days, we turn this scratchy fiber into a smooth, hard coaster. Tomorrow we measure everything." (~5 min, everyone)

+ +Output: ingredient basket gathered & labeled. Kids familiar with raw materials.

+ +Hands-on: ~25 minutes. All sensory exploration. No measuring yet. +
+ +

Day 2: Measure & Tear (~30 minutes)

+ +
+Inputs: ingredient basket from Day 1, kitchen scale, bags or bowls, jar with lid, molds

+ +Process:
+1. Kids weigh 5g agar powder on kitchen scale & pour into a labeled bag or bowl. (~5 min, kids active, adult helps youngest read scale)
+2. Kids weigh 25g corn starch & pour into same bag. (~5 min, kids active)
+3. Kids measure 200 mL water into a jar with a lid. (~3 min, kids active)
+4. Kids tear 10g hemp fiber into small pieces (~1 cm). Tearing by hand works fine & keeps little fingers busy. Bag it. (~10 min, kids active)
+5. Set out molds. Kids pick which shape they want. (~5 min, kids active)

+ +Output: labeled bag of dry mix (agar + starch), bag of torn fiber, jar of measured water, molds chosen. Everything staged for Day 3.

+ +Hands-on: ~25 minutes. All kid labor. +
+ +

Day 3: Mix & Mold (~1 hour)

+ +
+Inputs: dry mix bag, fiber bag, & water jar from Day 2, saucepan, stove, oven, parchment paper, molds

+ +Process:
+1. Kids pour dry mix (agar + starch) from Day 2 bag into saucepan. Kids pour in measured water. Kids stir until no clumps remain. (~5 min, kids active)
+2. Adult moves saucepan to stove. Heat on medium, stirring continuously. Kids observe from safe distance as mixture thickens into smooth, viscous liquid (like thick gravy). ~8 minutes. Adult removes from heat. Cool ~5 minutes until warm but safe to touch. (~13 min, adult handles stove, kids observe)
+3. Kids add torn fiber from Day 2 bag into warm bioresin. Every kid gets a turn stirring until fiber spreads evenly. Mixture should feel like thick oatmeal. (~10 min, kids active)
+4. Kids press mixture into molds on parchment paper. Pack firmly with fingers or back of a spoon. Fill to ~5mm for coasters, ~3mm for ornaments. For ornaments, kids poke a hole with a toothpick (for hanging string later). (~15 min, kids active)
+5. Adult places molds in oven at 150C for 20 minutes. BREAK: snack, wash hands, clean workspace. (~20 min, oven runs unattended)
+6. Adult removes molds. Set aside to cool completely. Do NOT demold today. Cooling overnight gives a harder result. (~2 min, adult handles oven)

+ +Output: coasters/ornaments in molds, cooling overnight. Demolding happens on Day 4.

+ +Hands-on: ~30 minutes kid labor out of 1 hour. Adult touches stove (~8 min) & oven (~5 min) only.
+Attention span note: longest continuous stretch runs ~15 minutes (molding). For ages 3-5, split molding into two rounds with a wiggle break between. +
+ +

Day 4: Demold & Decorate (~30 minutes)

+ +
+Inputs: cooled molds from Day 3, raw fiber sample from Day 1, acrylic paint or markers (optional), string for ornaments (optional)

+ +Process:
+1. Kids demold coasters & ornaments. Gently flex silicone mold edges & push from bottom. (~5 min, kids active)
+2. Compare: pass around a piece of raw fiber from Day 1 & the finished coaster side by side. Feel the difference. Discuss: scratchy & floppy turned into smooth & hard. What happened? The starch & seaweed glued the fibers together, & heat locked everything in place. (~5 min, everyone)
+3. Optional: kids decorate with acrylic paint, markers, or stamps. Thread string through ornament holes. (~15 min, kids active)
+4. Pack take-home bag: finished coaster or ornaments + a piece of raw hemp fiber to keep for comparison. (~5 min, kids active)

+ +Output: 1 coaster (~8 cm diameter) or 2-3 small ornaments per student, decorated & ready to take home.

+ +Hands-on: ~25 minutes. All kid labor. No adult needed. +
+ +

+What happens inside: Agar (from seaweed) forms a gel that traps starch & fiber together. Heat drives off water & sets the starch, locking everything into a rigid shape. Hemp fiber adds strength, like rebar in concrete. +

+ + + + + +SHOOTS +

Ages 8-12: Citric Acid Tiles (4 days)

+ +

+Based on Approach C (citric acid crosslinking). Students soak hemp fiber in a citric acid solution, press flat, & cure in an oven. Citric acid comes from lemon juice concentrate, keeping everything food-safe. Result: rigid tiles, bookmarks, or plant labels. +

+ +
+ Three approaches to hemp bioplastic: this recipe uses Approach C, citric acid crosslinking +
Shoots use Approach C: citric acid crosslinking. strongest result, safest chemistry.
+
+ +

Day 1: Gather & Chop (~45 minutes)

+ +
+Inputs: raw hemp fiber, lemon juice concentrate, glycerol, scissors, kitchen scale

+ +Process:
+1. Examine raw hemp fiber. Pull apart a strand. Notice how fibers separate into thin threads. Discuss where it comes from (stalk bark, not leaves or seeds). (~5 min, everyone)
+2. Students chop 25g hemp fiber to 2-3 cm lengths with scissors. Bag it. (~15 min, students active)
+3. Students measure 15 mL lemon juice concentrate into a small jar. Weigh 5g glycerol, add to same jar. Stir. Cap it. Label "crosslinking solution." (~10 min, students active)
+4. Set aside a small sample of raw unchopped fiber for comparison on Day 4.
+5. Review the 4-day plan: chop β†’ paper β†’ crosslink β†’ finish. Each day's output feeds the next day. (~5 min, everyone)

+ +Output: bag of chopped fiber + jar of crosslinking solution + raw fiber sample. Stored until Day 2.

+ +Hands-on: ~35 minutes. All student labor. No adult needed (all ingredients food-safe). +
+ +

Day 2: Make Hemp Paper (~45 minutes)

+ +
+Inputs: chopped fiber from Day 1, 500 mL water, flat screen or mesh, two flat boards, bowl

+ +Process:
+1. Students pour chopped fiber into a bowl. Measure & add 500 mL water. Stir. Start a 30-minute soak. (~5 min, students active)
+2. BREAK (25 min). Fiber soaks unattended. Snack, sketch the process so far, or discuss hemp plant anatomy.
+3. Students spread soaked fiber evenly onto a flat screen or mesh. Spread thin & even, like making a pancake from fiber. (~10 min, students active)
+4. Students press flat with a board. Drain for 5 minutes. Set aside a small piece of this untreated hemp paper as a comparison sample for Day 4. (~5 min, students active)

+ +Output: rough sheet of hemp paper + untreated paper sample. Store paper flat between sheets of parchment until Day 3.

+ +Hands-on: ~20 minutes. All student labor. No adult needed. +
+ +

Day 3: Crosslink & Cure (~1 hour 30 minutes)

+ +
+Inputs: hemp paper from Day 2, crosslinking solution from Day 1, parchment paper, baking sheet, boards/books, brick or cast iron pan, oven

+ +Process:
+1. Students pour crosslinking solution from Day 1 jar over hemp paper sheet. Let soak 15 minutes. Flip & soak another 15 minutes. Solution should saturate through entire sheet. (~5 min active + 25 min soak, students active then wait)
+2. Optional BREAK during soak. Good time for science notebook entry: what do you predict will happen when we heat it?
+3. Students place soaked sheet between two pieces of parchment paper. Press between two flat boards. Stack heavy books on top or clamp with binder clips. Press 20 minutes. (~5 min active + 15 min wait, students active then wait)
+4. Adult transfers pressed sheet (still between parchment) onto baking sheet. Places brick or cast iron pan on top. Oven at 140C for 45 minutes. Heat activates citric acid crosslinking, bonding cellulose chains together. (~2 min, adult handles oven)
+5. BREAK (45 min). Oven cures unattended. Outdoor free time, journaling, or related lesson on bioplastic vs. petroleum.
+6. Adult removes from oven. Cool 10 minutes. Students place cured sheet in a bowl of water to soak overnight. This removes unreacted citric acid & glycerol. (~10 min, students active)

+ +Output: cured crosslinked sheet soaking in water overnight. Washing completes before Day 4.

+ +Hands-on: ~25 minutes student labor out of 1.5 hours. Adult touches oven only (~5 min). +
+ +

Day 4: Wash, Cut & Compare (~45 minutes)

+ +
+Inputs: soaked cured sheet from Day 3, raw fiber sample from Day 1, untreated paper sample from Day 2, scissors, towel

+ +Process:
+1. Students remove cured sheet from water. Pat dry with towel. Feel the difference: stiffer, smoother, more plastic than the untreated paper from Day 2. (~5 min, students active)
+2. Students cut tiles, bookmarks, or plant labels from cured sheet using scissors. Adult supervises if using a craft knife. (~15 min, students active)
+3. Compare all three samples side by side: raw fiber (Day 1), untreated hemp paper (Day 2), cured crosslinked tile (today). Pass them around. Bend each one. Feel the difference in stiffness. Drop water on each to compare absorption. (~10 min, everyone)
+4. Discussion: what changed at each step? Why did lemon juice & heat turn floppy paper into rigid tile? Pack take-home bag. (~10 min, everyone)

+ +Output: 2-3 tiles (~5x8 cm), or 3-4 bookmarks, or 4-5 plant labels per student.

+ +Hands-on: ~30 minutes. All student labor. No adult needed (unless craft knife). +
+ +

+What happens inside: Citric acid (from lemon juice) forms chemical bridges between cellulose chains in hemp fiber when heated.[1] These crosslinks make the material rigid, water-resistant, & strong. Glycerol acts as a plasticizer, preventing the result from becoming too brittle. Same chemistry works at industrial scale to produce material reaching 70 MPa tensile strength. +

+ + + + + +STALKS +

Ages 13-18: Cellulose Extraction & Pressed Disc (4 days)

+ +

+Based on Protocol 2 (gentle cellulose extraction). Students perform a real alkaline treatment at room temperature using 5% NaOH, extract cellulose, mix with plasticizer, & press a bioplastic disc. Proper safety training required before handling chemicals. +

+ +
+ Cellulose extraction process: prepare, alkali treat, wash, dry, press +
Stalks use Protocol 2: gentle 5% NaOH extraction at room temperature. no heating needed for extraction step.
+
+ +

Day 1: Safety Training & Gather (~1 hour)

+ +
+Safety briefing (mandatory before touching any chemical). Every student must:
+1. Wear chemical splash goggles (not safety glasses) for entire session on chemical days
+2. Wear elbow-length nitrile gloves whenever handling NaOH solution
+3. Know location of running water (within arm's reach)
+4. Know location of 2% vinegar neutralization bottle
+5. Understand: ALWAYS add NaOH pellets to water, NEVER water to NaOH
+6. Understand: if NaOH contacts skin, flush with running water for 15+ minutes, then notify adult immediately
+7. Work in a ventilated area (outdoors or near open windows) +
+ +
+Inputs: hemp fiber, NaOH pellets, glycerol, pH strips, safety gear, scissors or grinder, kitchen scale, stainless steel pot

+ +Process:
+1. Safety briefing: cover all 7 points above. Practice putting on goggles & gloves. Locate water source & vinegar bottle. Quiz each student before proceeding. (~20 min, everyone)
+2. Students chop 50g hemp bast fiber into 2-3 cm lengths. If a blender or coffee grinder stands available, grind to a coarse powder. Bag it. Set aside a small sample of raw fiber for Day 4 comparison. (~20 min, students active)
+3. Students weigh 50g NaOH pellets into a sealed, labeled container. Goggles & gloves on for this step. Discuss: NaOH absorbs moisture from air, so container stays sealed until Day 2. (~10 min, students active, adult supervises)
+4. Students measure 10 mL glycerol into a labeled jar. Review the 4-day plan: gather β†’ extract β†’ dry & mix β†’ press. Each day's output feeds the next. (~10 min, students active)

+ +Output: bag of chopped fiber + sealed container of weighed NaOH + jar of glycerol + raw fiber sample + safety-trained students.

+ +Hands-on: ~40 minutes student labor. All students handle materials (goggles & gloves for NaOH weighing). Adult supervises NaOH step. +
+ +

Day 2: Extract Cellulose (~3 hours with long soak break)

+ +
+Inputs: chopped fiber from Day 1, NaOH from Day 1, 1 liter water, stainless steel pot (NOT aluminum), pH strips, fine mesh strainer, goggles & gloves

+ +Process:
+1. Goggles & gloves on. Students pour 1 liter of water into stainless steel pot. Students slowly add NaOH pellets from Day 1 container while stirring. Add in small amounts (10g at a time). Solution will warm as NaOH dissolves. This gives 5% NaOH by weight.[2] (~10 min, students active, adult supervises)
+2. Students add chopped fiber from Day 1 to NaOH solution. Stir to submerge all fiber. Start a 2-hour soak at room temperature. No heating needed. (~5 min, students active)
+3. BREAK (2 hours). Fiber soaks. Students stir every 30 minutes (gloves on, ~2 min each time). Use for lunch, chemistry lesson on pH & cellulose structure, or independent study. Observe: solution turns brown as lignin dissolves out of fiber.
+4. Students pour solution through fine mesh strainer (gloves on). Rinse fiber under running water. Rinse 4-6 times. Test wash water with pH strip after each rinse. Keep washing until pH reads 7 (neutral). This step matters: residual NaOH weakens the final product. Most satisfying hands-on stretch: students watch fiber change color rinse by rinse & track pH dropping toward neutral. (~30 min, students active, adult supervises)
+5. Squeeze excess water from fiber. Spread washed fiber on a tray or plate. Store in fridge overnight. (~5 min, students active)
+6. Clean chemical equipment. Students neutralize all NaOH waste with vinegar (pour slowly, stir, test pH). Verify pH 7 with strips before pouring down drain. (~15 min, students active, adult supervises)

+ +Output: washed cellulose fiber (wet, stored in fridge). NaOH waste neutralized & disposed.

+ +Hands-on: ~1 hour student labor out of 3 hours. Students handle all chemistry with goggles & gloves. Adult stays present during all NaOH steps but students perform every action. +
+ +

Day 3: Dry & Mix (~1 hour 30 minutes)

+ +
+Inputs: wet cellulose from Day 2, glycerol from Day 1, baking sheet, oven, kitchen scale

+ +Process:
+1. Students weigh wet cellulose on kitchen scale. Record weight. Spread fiber evenly on a baking sheet. (~5 min, students active)
+2. Adult loads oven at 80C. Dry for 1 hour, or until fiber feels completely dry. (~2 min, adult handles oven)
+3. BREAK (55 min). Fiber dries in oven. Good time for science notebook: draw the process so far, write observations about color change from Day 2, predict how much weight the fiber lost.
+4. Adult removes baking sheet. Students weigh dried fiber. Compare to wet weight from step 1 & original 50g from Day 1. Expect roughly 50-60% of starting weight (lost lignin & hemicellulose). Discuss: where did the missing weight go? (~10 min, students active)
+5. Students add 10 mL glycerol from Day 1 jar to dried cellulose. Add just enough water to form a thick paste. Stir thoroughly for 5 minutes. (~10 min, students active)
+6. Store cellulose paste in a sealed container overnight. Glycerol continues to absorb into fiber. (~2 min, students active)

+ +Output: cellulose paste (fiber + glycerol), sealed & ready for pressing on Day 4.

+ +Hands-on: ~30 minutes student labor out of 1.5 hours. Adult handles oven only (~5 min). +
+ +

Day 4: Press & Demold (~1 hour + slow cool)

+ +
+Inputs: cellulose paste from Day 3, metal mold or soap mold, vegetable oil, baking sheet, oven, raw fiber sample from Day 1

+ +Process:
+1. Students coat mold interior with thin layer of vegetable oil. Pack cellulose paste into mold firmly, pressing out air pockets. Place mold on baking sheet. (~10 min, students active)
+2. Adult loads oven at 150C. If a bench vise or C-clamps exist, students clamp mold for added pressure during heating. 30 minutes at temperature. (~2 min, adult handles oven)
+3. BREAK (30 min). Oven runs. Write lab report: document each day's inputs, process, & outputs. Compare raw fiber sample from Day 1 with a small bit of leftover cellulose paste. Predict what the pressed result will look & feel like.
+4. Adult turns oven off. Leave mold inside. Let cool slowly (1 hour minimum). Rapid cooling causes cracking. Session can end here; demold tomorrow or take mold home. (~2 min, adult handles oven)
+5. Once fully cool, students demold. If material sticks, place in freezer for 10 minutes, then try again. (~5 min, students active)
+6. Compare all samples side by side: raw fiber (Day 1), dried cellulose (Day 3), finished pressed disc (today). Discussion: what changed at each step? What role did NaOH play? What role did heat & pressure play? Pack take-home bag. (~10 min, everyone)

+ +Output: 1 pressed bioplastic disc (~7 cm diameter, ~5mm thick) or 1 small container per student.

+ +Hands-on: ~25 minutes student labor out of 1 hour (plus slow cool). Adult handles oven only (~5 min). +
+ +

+What happens inside: NaOH (lye) on Day 2 breaks hydrogen bonds in lignin & hemicellulose, dissolving them into solution while leaving cellulose chains intact.[3] Washing removes dissolved material. Glycerol molecules on Day 3 insert between cellulose chains, acting as a plasticizer that prevents brittleness. Heat & pressure on Day 4 force cellulose chains close together, forming new hydrogen bonds that lock shape. +

+ + + + + +SAFETY +

Safety Notes by Age Group

+ +

Sprouts (ages 3-7)

+
+Adult handles: stove & oven on Day 3 only. Nothing else requires adult hands across all 4 days.
+Kids handle: exploring (Day 1), all measuring & tearing (Day 2), stirring & molding (Day 3), demolding & decorating (Day 4).
+Watch for: kids putting fiber or starch mixture in mouths. All ingredients stay food-safe but taste terrible.
+Allergens: check for corn & seaweed allergies before Day 1. +
+ +

Shoots (ages 8-12)

+
+Adult handles: oven on Day 3 only. Craft knife supervision on Day 4 if needed.
+Students handle: all chopping & measuring (Day 1), all soaking & paper-making (Day 2), all crosslinking & soaking (Day 3), all washing & cutting (Day 4). All solutions stay food-safe (lemon juice & glycerol).
+Watch for: lemon juice in eyes on Day 3 (stings but not dangerous). Keep a damp cloth nearby.
+Allergens: citrus sensitivity. Glycerol stays hypoallergenic. +
+ +

Stalks (ages 13-18)

+
+Adult supervises all steps involving NaOH (Days 1-2). Students perform every action; adult stays present & ready to intervene.
+Students handle: all chopping & weighing (Day 1), all chemistry & washing (Day 2), all mixing (Day 3), all molding (Day 4). Goggles & gloves on during chemical steps (Days 1-2).
+NaOH at 5% concentration: causes chemical burns on prolonged skin contact. Not immediately dangerous at brief contact but requires immediate washing. Much safer than 12-17.5% concentrations used in full extraction protocols.
+Spill protocol: pour 2% vinegar over spill to neutralize, then wipe with paper towels. For skin contact: flush with running water for 15+ minutes.
+Waste disposal (end of Day 2): neutralize all NaOH waste to pH 7 with vinegar before pouring down drain. Verify with pH strips. +
+ + + + + +TROUBLESHOOTING +

What Went Wrong?

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProblemCauseFix
Coaster crumbles apart (Sprouts)Not enough bioresin, or oven too hotAdd more starch/agar mixture next time. Keep oven at 150C, not higher.
Coaster stays soft & bendy (Sprouts)Too much water, not dried long enoughReturn to oven for 10 more minutes. Pack molds more firmly next time.
Tile feels like paper, not plastic (Shoots)Citric acid solution too dilute, or curing time too shortUse full-strength lemon juice concentrate, not diluted. Cure for full 45 minutes at 140C.
Tile warps during curing (Shoots)Uneven thickness or uneven pressurePress more evenly before curing. Use a flat weight that covers the entire sheet.
Disc has bubbles or spongy texture (Stalks)Material not dry enough before pressingDry longer on Day 3. Weigh before & after: weight should stop changing. Steam from trapped water creates voids.[4]
Disc cracks when cooling (Stalks)Cooled too fast, or not enough glycerolLet cool slowly inside oven on Day 4 (1 hour minimum). Increase glycerol to 15 mL on Day 3 next time.
Fiber still brown after washing (Stalks)Lignin not fully dissolvedSoak longer in NaOH on Day 2 (up to 4 hours). Or accept the color: brown means some lignin remains, but the material still works.
pH won't reach 7 after washing (Stalks)Need more rinse cyclesKeep washing on Day 2. Can take 6-8 rinses. Residual NaOH weakens the final product, so this step matters.
+ + + + + +TAKE HOME +

Take Home Checklist

+ +
+Sprouts take home (Day 4):
+☐ 1 decorated hemp fiber coaster or 2-3 ornaments
+☐ A piece of raw hemp fiber to compare with finished product

+ +Shoots take home (Day 4):
+☐ 2-3 citric acid tiles, bookmarks, or plant labels
+☐ Raw hemp fiber sample (saved Day 1)
+☐ Untreated hemp paper sample (saved Day 2)

+ +Stalks take home (Day 4, plus slow cool):
+☐ 1 pressed bioplastic disc or container
+☐ Raw hemp fiber sample (saved Day 1)
+☐ Dried cellulose sample (saved Day 3)
+☐ pH strip showing final wash reached neutral (Day 2) +
+ + + + + +
+ +

Sources

+ +
+
    +
  1. Beluns et al. (2023), "Sustainable hemp-based bioplastics with tunable properties via reversible thermal crosslinking of cellulose," Int J Biol Macromol. Citric acid crosslinking at 140C achieves up to 70 MPa tensile strength.
  2. + +
  3. Dhakal et al. (2022), PMC 9182753. 5% NaOH treatment of hemp at room temperature for 1-4 hours. Gentlest effective protocol for cellulose extraction.
  4. + +
  5. Chalannavar et al. (2025), "Industrial Cannabis sativa: Hemp Cellulose Based Bioplastic Production," Magna Scientia. Comprehensive review of NaOH cellulose extraction protocols.
  6. + +
  7. Robert Murray-Smith, "Hot Press Molding Hemp Casein Plastic" (2020). On moisture & pressing: "if it's wet and you heat it and press it, you'll press off a lot of steam and it won't form properly."
  8. +
+
+ +

+Full chemistry, equipment lists, & scaling details: hemp bioplastic process (recipe). +

+ +
+ +

← recipe (full process) Β· factory Β· hemp bioplastic overview Β· single-use plastics

+ +
+ + + + + + + diff --git a/hemp-bioplastic/process/img/cellulose-extraction.dot b/hemp-bioplastic/process/img/cellulose-extraction.dot new file mode 100644 index 0000000..69bff5a --- /dev/null +++ b/hemp-bioplastic/process/img/cellulose-extraction.dot @@ -0,0 +1,56 @@ +digraph cellulose_extraction { + bgcolor="#1a1a2e" + rankdir=TB + node [fontname="Helvetica" fontsize=10 style=filled shape=box] + edge [color="#888888" fontname="Helvetica" fontsize=9 fontcolor="#aaaaaa"] + + subgraph cluster_prep { + label="PREPARE" fontcolor="#4CAF50" fontsize=11 fontname="Helvetica Bold" + color="#4CAF50" style=dashed + + dry [label="dry bast fiber\n50Β°C until constant weight" fillcolor="#2E7D32" fontcolor="white"] + cut [label="cut to 2-3 cm lengths" fillcolor="#388E3C" fontcolor="white"] + grind [label="grind & sieve\nthrough 1.5mm mesh" fillcolor="#43A047" fontcolor="white"] + weigh [label="weigh 50g powder\n(test batch)" fillcolor="#66BB6A" fontcolor="white"] + } + + subgraph cluster_alkali { + label="ALKALI TREATMENT" fontcolor="#2196F3" fontsize=11 fontname="Helvetica Bold" + color="#2196F3" style=dashed + + naoh [label="dissolve 90g NaOH\nin 750 mL water\n= 12% solution" fillcolor="#1565C0" fontcolor="white"] + bath [label="add hemp powder\n80Β°C, stir at 500 rpm\n3 hours" fillcolor="#1976D2" fontcolor="white"] + filter1 [label="vacuum filter\nwash 4-5 times\nuntil pH neutral" fillcolor="#1E88E5" fontcolor="white"] + } + + subgraph cluster_bleach { + label="BLEACH (optional)" fontcolor="#9C27B0" fontsize=11 fontname="Helvetica Bold" + color="#9C27B0" style=dashed + + h2o2 [label="8% hydrogen peroxide\nadjust pH to 12 with NaOH\n40Β°C for 1 hour\nrepeat 4 cycles" fillcolor="#7B1FA2" fontcolor="white"] + filter2 [label="wash until neutral\nvacuum filter" fillcolor="#8E24AA" fontcolor="white"] + } + + subgraph cluster_purify { + label="PURIFY" fontcolor="#FF9800" fontsize=11 fontname="Helvetica Bold" + color="#FF9800" style=dashed + + hemi [label="17.5% NaOH solution\nroom temperature\n5 hours, stir at 500 rpm\nremoves hemicellulose" fillcolor="#E65100" fontcolor="white"] + filter3 [label="vacuum filter\nwash 3 times\ndry at 60Β°C overnight" fillcolor="#F57C00" fontcolor="white"] + result [label="~25g pure cellulose\nwhite fibrous material\n~50% yield from bast" fillcolor="#FF9800" fontcolor="white"] + } + + dry -> cut -> grind -> weigh + weigh -> naoh [label="add to"] + naoh -> bath + bath -> filter1 [label="lignin\ndissolved"] + filter1 -> h2o2 + h2o2 -> filter2 + filter2 -> hemi + hemi -> filter3 [label="hemicellulose\nremoved"] + filter3 -> result + + waste [label="waste liquor\nneutralize to pH 7\nbefore disposal\nlignin is compostable" fillcolor="#37474F" fontcolor="#aaaaaa" shape=ellipse] + bath -> waste [style=dashed color="#555555"] + hemi -> waste [style=dashed color="#555555"] +} diff --git a/hemp-bioplastic/process/img/cellulose-extraction.png b/hemp-bioplastic/process/img/cellulose-extraction.png new file mode 100644 index 0000000..b152f0e Binary files /dev/null and b/hemp-bioplastic/process/img/cellulose-extraction.png differ diff --git a/hemp-bioplastic/process/img/cellulose-extraction.svg b/hemp-bioplastic/process/img/cellulose-extraction.svg new file mode 100644 index 0000000..05f2d22 --- /dev/null +++ b/hemp-bioplastic/process/img/cellulose-extraction.svg @@ -0,0 +1,217 @@ + + + + + + +cellulose_extraction + + +cluster_prep + +PREPARE + + +cluster_alkali + +ALKALI TREATMENT + + +cluster_bleach + +BLEACH (optional) + + +cluster_purify + +PURIFY + + + +dry + +dry bast fiber +50Β°C until constant weight + + + +cut + +cut to 2-3 cm lengths + + + +dry->cut + + + + + +grind + +grind & sieve +through 1.5mm mesh + + + +cut->grind + + + + + +weigh + +weigh 50g powder +(test batch) + + + +grind->weigh + + + + + +naoh + +dissolve 90g NaOH +in 750 mL water += 12% solution + + + +weigh->naoh + + +add to + + + +bath + +add hemp powder +80Β°C, stir at 500 rpm +3 hours + + + +naoh->bath + + + + + +filter1 + +vacuum filter +wash 4-5 times +until pH neutral + + + +bath->filter1 + + +lignin +dissolved + + + +waste + +waste liquor +neutralize to pH 7 +before disposal +lignin is compostable + + + +bath->waste + + + + + +h2o2 + +8% hydrogen peroxide +adjust pH to 12 with NaOH +40Β°C for 1 hour +repeat 4 cycles + + + +filter1->h2o2 + + + + + +filter2 + +wash until neutral +vacuum filter + + + +h2o2->filter2 + + + + + +hemi + +17.5% NaOH solution +room temperature +5 hours, stir at 500 rpm +removes hemicellulose + + + +filter2->hemi + + + + + +filter3 + +vacuum filter +wash 3 times +dry at 60Β°C overnight + + + +hemi->filter3 + + +hemicellulose +removed + + + +hemi->waste + + + + + +result + +~25g pure cellulose +white fibrous material +~50% yield from bast + + + +filter3->result + + + + + diff --git a/hemp-bioplastic/process/img/equipment.dot b/hemp-bioplastic/process/img/equipment.dot new file mode 100644 index 0000000..e090413 --- /dev/null +++ b/hemp-bioplastic/process/img/equipment.dot @@ -0,0 +1,45 @@ +digraph equipment { + bgcolor="#1a1a2e" + rankdir=TB + node [fontname="Helvetica" fontsize=10 style=filled shape=box] + edge [style=invis] + + label=<equipment for a 50g test batch> + labelloc=t + + subgraph cluster_chem { + label="CHEMISTRY" fontcolor="#2196F3" fontsize=11 fontname="Helvetica Bold" + color="#2196F3" style=dashed + + e1 [label="stainless steel pot\n2-5 liter\nNOT aluminum" fillcolor="#1565C0" fontcolor="white"] + e2 [label="hot plate\n80-100Β°C capable" fillcolor="#1976D2" fontcolor="white"] + e3 [label="digital thermometer\n0-200Β°C" fillcolor="#1E88E5" fontcolor="white"] + e4 [label="pH strips\nrange 1-14" fillcolor="#42A5F5" fontcolor="white"] + e5 [label="vacuum filter setup\nBuchner funnel + flask" fillcolor="#64B5F6" fontcolor="#1a1a2e"] + e1 -> e2 -> e3 -> e4 -> e5 + } + + subgraph cluster_press { + label="PRESSING" fontcolor="#FF9800" fontsize=11 fontname="Helvetica Bold" + color="#FF9800" style=dashed + + p1 [label="metal mold\naluminum soap mold works" fillcolor="#E65100" fontcolor="white"] + p2 [label="oven (140-200Β°C)\nor rosin press ($200-500)" fillcolor="#F57C00" fontcolor="white"] + p3 [label="bench vise or\nhydraulic press\nfor clamping force" fillcolor="#FF9800" fontcolor="white"] + p4 [label="heat-resistant gloves\nrated 200Β°C+" fillcolor="#FFC107" fontcolor="#1a1a2e"] + p1 -> p2 -> p3 -> p4 + } + + subgraph cluster_safety { + label="SAFETY" fontcolor="#F44336" fontsize=11 fontname="Helvetica Bold" + color="#F44336" style=dashed + + s1 [label="chemical splash goggles\nnot just safety glasses" fillcolor="#B71C1C" fontcolor="white"] + s2 [label="nitrile gloves\nelbow length" fillcolor="#C62828" fontcolor="white"] + s3 [label="ventilated workspace\nfume hood or outdoors" fillcolor="#D32F2F" fontcolor="white"] + s4 [label="2% vinegar nearby\nfor NaOH spill neutralization" fillcolor="#E53935" fontcolor="white"] + s1 -> s2 -> s3 -> s4 + } + + cost [label="total equipment cost\n$500-2,000\nfor basic workshop setup" fillcolor="#263238" fontcolor="#CDDC39" shape=note] +} diff --git a/hemp-bioplastic/process/img/equipment.png b/hemp-bioplastic/process/img/equipment.png new file mode 100644 index 0000000..d9d3e83 Binary files /dev/null and b/hemp-bioplastic/process/img/equipment.png differ diff --git a/hemp-bioplastic/process/img/equipment.svg b/hemp-bioplastic/process/img/equipment.svg new file mode 100644 index 0000000..cce6499 --- /dev/null +++ b/hemp-bioplastic/process/img/equipment.svg @@ -0,0 +1,142 @@ + + + + + + +equipment + +equipment for a 50g test batch + +cluster_chem + +CHEMISTRY + + +cluster_press + +PRESSING + + +cluster_safety + +SAFETY + + + +e1 + +stainless steel pot +2-5 liter +NOT aluminum + + + +e2 + +hot plate +80-100Β°C capable + + + + +e3 + +digital thermometer +0-200Β°C + + + + +e4 + +pH strips +range 1-14 + + + + +e5 + +vacuum filter setup +Buchner funnel + flask + + + + +p1 + +metal mold +aluminum soap mold works + + + +p2 + +oven (140-200Β°C) +or rosin press ($200-500) + + + + +p3 + +bench vise or +hydraulic press +for clamping force + + + + +p4 + +heat-resistant gloves +rated 200Β°C+ + + + + +s1 + +chemical splash goggles +not just safety glasses + + + +s2 + +nitrile gloves +elbow length + + + + +s3 + +ventilated workspace +fume hood or outdoors + + + + +s4 + +2% vinegar nearby +for NaOH spill neutralization + + + + +cost + + + +total equipment cost +$500-2,000 +for basic workshop setup + + + diff --git a/hemp-bioplastic/process/img/plant-anatomy.dot b/hemp-bioplastic/process/img/plant-anatomy.dot new file mode 100644 index 0000000..3a64d32 --- /dev/null +++ b/hemp-bioplastic/process/img/plant-anatomy.dot @@ -0,0 +1,42 @@ +digraph plant_anatomy { + bgcolor="#1a1a2e" + rankdir=TB + node [fontname="Helvetica" fontsize=10 style=filled shape=box] + edge [color="#888888" fontname="Helvetica" fontsize=9 fontcolor="#aaaaaa"] + + label=<which parts of hemp we harvest> + labelloc=t + + plant [label="hemp plant\n120 day crop" fillcolor="#2E7D32" fontcolor="white" shape=ellipse] + + subgraph cluster_use { + label="WE USE" fontcolor="#4CAF50" fontsize=12 fontname="Helvetica Bold" + color="#4CAF50" style=dashed + + stalk [label="STALK\n(main stem)\n80-90% of harvest" fillcolor="#388E3C" fontcolor="white"] + + subgraph cluster_stalk { + label="" color=transparent + bast [label="BAST FIBER\nouter bark layer\n~30% of stalk\n77% cellulose\nthis makes bioplastic" fillcolor="#43A047" fontcolor="white"] + hurd [label="HURD (core)\ninner woody pith\n~70% of stalk\n44% cellulose\nlower grade, still usable" fillcolor="#795548" fontcolor="white"] + } + } + + subgraph cluster_byproduct { + label="BYPRODUCTS" fontcolor="#FF9800" fontsize=12 fontname="Helvetica Bold" + color="#FF9800" style=dashed + + leaves [label="LEAVES\nnot used for bioplastic\ncompost or mulch" fillcolor="#827717" fontcolor="white"] + seeds [label="SEEDS\nnot used for bioplastic\nfood, oil, or next crop" fillcolor="#F57C00" fontcolor="white"] + roots [label="ROOTS\nstay in ground\nimprove soil structure\nbreak up compaction" fillcolor="#4E342E" fontcolor="white"] + } + + plant -> stalk [label="harvest stems"] + plant -> leaves [label="strip"] + plant -> seeds [label="collect"] + plant -> roots [label="leave in soil"] + stalk -> bast [label="outer layer"] + stalk -> hurd [label="inner core"] + + note [label="bioplastic comes from stalk only\nspecifically bast fiber (outer bark)\nhurd works but yields less cellulose\nleaves, seeds, & roots serve other purposes" fillcolor="#263238" fontcolor="#CDDC39" shape=note fontsize=9] +} diff --git a/hemp-bioplastic/process/img/plant-anatomy.png b/hemp-bioplastic/process/img/plant-anatomy.png new file mode 100644 index 0000000..1527b27 Binary files /dev/null and b/hemp-bioplastic/process/img/plant-anatomy.png differ diff --git a/hemp-bioplastic/process/img/plant-anatomy.svg b/hemp-bioplastic/process/img/plant-anatomy.svg new file mode 100644 index 0000000..1913744 --- /dev/null +++ b/hemp-bioplastic/process/img/plant-anatomy.svg @@ -0,0 +1,141 @@ + + + + + + +plant_anatomy + +which parts of hemp we harvest + +cluster_use + +WE USE + + +cluster_stalk + + + +cluster_byproduct + +BYPRODUCTS + + + +plant + +hemp plant +120 day crop + + + +stalk + +STALK +(main stem) +80-90% of harvest + + + +plant->stalk + + +harvest stems + + + +leaves + +LEAVES +not used for bioplastic +compost or mulch + + + +plant->leaves + + +strip + + + +seeds + +SEEDS +not used for bioplastic +food, oil, or next crop + + + +plant->seeds + + +collect + + + +roots + +ROOTS +stay in ground +improve soil structure +break up compaction + + + +plant->roots + + +leave in soil + + + +bast + +BAST FIBER +outer bark layer +~30% of stalk +77% cellulose +this makes bioplastic + + + +stalk->bast + + +outer layer + + + +hurd + +HURD (core) +inner woody pith +~70% of stalk +44% cellulose +lower grade, still usable + + + +stalk->hurd + + +inner core + + + +note + + + +bioplastic comes from stalk only +specifically bast fiber (outer bark) +hurd works but yields less cellulose +leaves, seeds, & roots serve other purposes + + + diff --git a/hemp-bioplastic/process/img/pressing.dot b/hemp-bioplastic/process/img/pressing.dot new file mode 100644 index 0000000..773ab54 --- /dev/null +++ b/hemp-bioplastic/process/img/pressing.dot @@ -0,0 +1,26 @@ +digraph pressing { + bgcolor="#1a1a2e" + rankdir=TB + node [fontname="Helvetica" fontsize=10 style=filled shape=box] + edge [color="#888888" fontname="Helvetica" fontsize=9 fontcolor="#aaaaaa"] + + label=<mixing & hot pressing> + labelloc=t + + cellulose [label="dried cellulose\nweighed" fillcolor="#1E88E5" fontcolor="white"] + glycerol [label="add glycerol\n15% = rigid\n30% = flexible" fillcolor="#7B1FA2" fontcolor="white"] + mix [label="stir at 80Β°C\nfor 60 minutes\nuntil homogeneous" fillcolor="#9C27B0" fontcolor="white"] + dry2 [label="DRY COMPLETELY\nthis step is critical\n60Β°C overnight\ngrind to breadcrumb texture" fillcolor="#F44336" fontcolor="white"] + mold [label="fill metal mold\ncompress lightly\nadd lid" fillcolor="#E65100" fontcolor="white"] + heat [label="heat to 150Β°C\nin oven or heat press" fillcolor="#FF9800" fontcolor="white"] + press [label="apply maximum pressure\nbench vise, hydraulic press,\nor C-clamps\nhold 10-30 minutes" fillcolor="#FFC107" fontcolor="#1a1a2e"] + cool [label="release pressure\ncool slowly in mold\ndo not rush" fillcolor="#795548" fontcolor="white"] + demold [label="remove bioplastic\nfrom mold" fillcolor="#4E342E" fontcolor="white"] + + cellulose -> glycerol -> mix -> dry2 -> mold -> heat -> press -> cool -> demold + + fail1 [label="WET = FAIL\nsteam creates voids\nspongy, porous result\nmust be bone dry" fillcolor="#B71C1C" fontcolor="white" shape=octagon] + dry2 -> fail1 [style=dashed color="#F44336" label="if skipped"] + + tip [label="coat mold interior\nwith vegetable oil\nto prevent sticking" fillcolor="#263238" fontcolor="#CDDC39" shape=note fontsize=9] +} diff --git a/hemp-bioplastic/process/img/pressing.png b/hemp-bioplastic/process/img/pressing.png new file mode 100644 index 0000000..581f609 Binary files /dev/null and b/hemp-bioplastic/process/img/pressing.png differ diff --git a/hemp-bioplastic/process/img/pressing.svg b/hemp-bioplastic/process/img/pressing.svg new file mode 100644 index 0000000..50e6657 --- /dev/null +++ b/hemp-bioplastic/process/img/pressing.svg @@ -0,0 +1,159 @@ + + + + + + +pressing + +mixing & hot pressing + + +cellulose + +dried cellulose +weighed + + + +glycerol + +add glycerol +15% = rigid +30% = flexible + + + +cellulose->glycerol + + + + + +mix + +stir at 80Β°C +for 60 minutes +until homogeneous + + + +glycerol->mix + + + + + +dry2 + +DRY COMPLETELY +this step is critical +60Β°C overnight +grind to breadcrumb texture + + + +mix->dry2 + + + + + +mold + +fill metal mold +compress lightly +add lid + + + +dry2->mold + + + + + +fail1 + +WET = FAIL +steam creates voids +spongy, porous result +must be bone dry + + + +dry2->fail1 + + +if skipped + + + +heat + +heat to 150Β°C +in oven or heat press + + + +mold->heat + + + + + +press + +apply maximum pressure +bench vise, hydraulic press, +or C-clamps +hold 10-30 minutes + + + +heat->press + + + + + +cool + +release pressure +cool slowly in mold +do not rush + + + +press->cool + + + + + +demold + +remove bioplastic +from mold + + + +cool->demold + + + + + +tip + + + +coat mold interior +with vegetable oil +to prevent sticking + + + diff --git a/hemp-bioplastic/process/img/retting-test.dot b/hemp-bioplastic/process/img/retting-test.dot new file mode 100644 index 0000000..bd6b872 --- /dev/null +++ b/hemp-bioplastic/process/img/retting-test.dot @@ -0,0 +1,34 @@ +digraph retting_test { + bgcolor="#1a1a2e" + rankdir=LR + node [fontname="Helvetica" fontsize=10 style=filled shape=box] + edge [color="#888888" fontname="Helvetica" fontsize=9 fontcolor="#aaaaaa"] + + label=<retting: how to tell when stalks are ready> + labelloc=t + + subgraph cluster_method { + label="DEW RETTING" fontcolor="#4CAF50" fontsize=11 fontname="Helvetica Bold" + color="#4CAF50" style=dashed + + lay [label="lay stalks on grass\nexpose to rain & dew\nturn every few days" fillcolor="#2E7D32" fontcolor="white"] + temp [label="duration by temperature\n37Β°C β†’ 3 days\n20Β°C β†’ 7-8 days\n12Β°C β†’ 15-17 days\n7Β°C β†’ 30-45 days" fillcolor="#388E3C" fontcolor="white"] + lay -> temp + } + + subgraph cluster_tests { + label="THREE TESTS" fontcolor="#CDDC39" fontsize=11 fontname="Helvetica Bold" + color="#CDDC39" style=dashed + + t1 [label="BEND TEST\nbend stalk back & forth\nhurd should crack & fall\nfiber should NOT break" fillcolor="#827717" fontcolor="white"] + t2 [label="PEEL TEST\npeel fiber at base\nshould separate easily\nfor several inches" fillcolor="#9E9D24" fontcolor="white"] + t3 [label="COLOR TEST\nfiber bundles\nturning white\nmeans ready" fillcolor="#AFB42B" fontcolor="white"] + } + + temp -> t1 [label="test"] + t1 -> t2 [style=invis] + t2 -> t3 [style=invis] + + under [label="UNDER-RETTED\nfiber sticks to hurd\nhard to separate\nβ†’ keep retting" fillcolor="#B71C1C" fontcolor="white" shape=octagon] + over [label="OVER-RETTED\nfiber breaks easily\nweak & mushy\nβ†’ start over" fillcolor="#B71C1C" fontcolor="white" shape=octagon] +} diff --git a/hemp-bioplastic/process/img/retting-test.png b/hemp-bioplastic/process/img/retting-test.png new file mode 100644 index 0000000..b27f97e Binary files /dev/null and b/hemp-bioplastic/process/img/retting-test.png differ diff --git a/hemp-bioplastic/process/img/retting-test.svg b/hemp-bioplastic/process/img/retting-test.svg new file mode 100644 index 0000000..47372ed --- /dev/null +++ b/hemp-bioplastic/process/img/retting-test.svg @@ -0,0 +1,102 @@ + + + + + + +retting_test + +retting: how to tell when stalks are ready + +cluster_method + +DEW RETTING + + +cluster_tests + +THREE TESTS + + + +lay + +lay stalks on grass +expose to rain & dew +turn every few days + + + +temp + +duration by temperature +37Β°C β†’ 3 days +20Β°C β†’ 7-8 days +12Β°C β†’ 15-17 days +7Β°C β†’ 30-45 days + + + +lay->temp + + + + + +t1 + +BEND TEST +bend stalk back & forth +hurd should crack & fall +fiber should NOT break + + + +temp->t1 + + +test + + + +t2 + +PEEL TEST +peel fiber at base +should separate easily +for several inches + + + + +t3 + +COLOR TEST +fiber bundles +turning white +means ready + + + + +under + +UNDER-RETTED +fiber sticks to hurd +hard to separate +β†’ keep retting + + + +over + +OVER-RETTED +fiber breaks easily +weak & mushy +β†’ start over + + + diff --git a/hemp-bioplastic/process/img/three-approaches.dot b/hemp-bioplastic/process/img/three-approaches.dot new file mode 100644 index 0000000..8a907fc --- /dev/null +++ b/hemp-bioplastic/process/img/three-approaches.dot @@ -0,0 +1,45 @@ +digraph three_approaches { + bgcolor="#1a1a2e" + rankdir=TB + node [fontname="Helvetica" fontsize=10 style=filled shape=box] + edge [style=invis] + + label=<three approaches to hemp bioplastic> + labelloc=t + + subgraph cluster_a { + label="A: CELLULOSE EXTRACTION\n(most documented)" fontcolor="#2196F3" fontsize=11 fontname="Helvetica Bold" + color="#2196F3" style=dashed + + a1 [label="ret & decorticate stalks" fillcolor="#1565C0" fontcolor="white"] + a2 [label="NaOH bath to dissolve lignin" fillcolor="#1976D2" fontcolor="white"] + a3 [label="bleach & purify cellulose" fillcolor="#1E88E5" fontcolor="white"] + a4 [label="mix with glycerol" fillcolor="#42A5F5" fontcolor="white"] + a5 [label="hot press at 150Β°C" fillcolor="#64B5F6" fontcolor="#1a1a2e"] + a_note [label="highest quality\nmost chemistry\n2-3 day process" fillcolor="#263238" fontcolor="#2196F3" shape=note] + a1 -> a2 -> a3 -> a4 -> a5 -> a_note + } + + subgraph cluster_b { + label="B: FIBER + BIORESIN COMPOSITE\n(Robert Murray-Smith)" fontcolor="#4CAF50" fontsize=11 fontname="Helvetica Bold" + color="#4CAF50" style=dashed + + b1 [label="prepare hemp fiber mat" fillcolor="#2E7D32" fontcolor="white"] + b2 [label="make bioresin:\nseaweed + corn starch" fillcolor="#388E3C" fontcolor="white"] + b3 [label="impregnate fiber with resin" fillcolor="#43A047" fontcolor="white"] + b4 [label="dry at 150-200Β°C" fillcolor="#66BB6A" fontcolor="white"] + b_note [label="simpler chemistry\ncomposite (not pure)\n1 day process" fillcolor="#263238" fontcolor="#4CAF50" shape=note] + b1 -> b2 -> b3 -> b4 -> b_note + } + + subgraph cluster_c { + label="C: CITRIC ACID CROSSLINKING\n(Beluns et al. 2023)" fontcolor="#FF9800" fontsize=11 fontname="Helvetica Bold" + color="#FF9800" style=dashed + + c1 [label="make hemp paper\nfrom chopped fiber" fillcolor="#E65100" fontcolor="white"] + c2 [label="soak in glycerol +\ncitric acid solution" fillcolor="#F57C00" fontcolor="white"] + c3 [label="cure at 140Β°C\nunder weight" fillcolor="#FF9800" fontcolor="white"] + c_note [label="no NaOH needed\nsafest approach\nup to 70 MPa strength" fillcolor="#263238" fontcolor="#FF9800" shape=note] + c1 -> c2 -> c3 -> c_note + } +} diff --git a/hemp-bioplastic/process/img/three-approaches.png b/hemp-bioplastic/process/img/three-approaches.png new file mode 100644 index 0000000..78bc086 Binary files /dev/null and b/hemp-bioplastic/process/img/three-approaches.png differ diff --git a/hemp-bioplastic/process/img/three-approaches.svg b/hemp-bioplastic/process/img/three-approaches.svg new file mode 100644 index 0000000..afc69de --- /dev/null +++ b/hemp-bioplastic/process/img/three-approaches.svg @@ -0,0 +1,150 @@ + + + + + + +three_approaches + +three approaches to hemp bioplastic + +cluster_a + +A: CELLULOSE EXTRACTION +(most documented) + + +cluster_b + +B: FIBER + BIORESIN COMPOSITE +(Robert Murray-Smith) + + +cluster_c + +C: CITRIC ACID CROSSLINKING +(Beluns et al. 2023) + + + +a1 + +ret & decorticate stalks + + + +a2 + +NaOH bath to dissolve lignin + + + + +a3 + +bleach & purify cellulose + + + + +a4 + +mix with glycerol + + + + +a5 + +hot press at 150Β°C + + + + +a_note + + + +highest quality +most chemistry +2-3 day process + + + + +b1 + +prepare hemp fiber mat + + + +b2 + +make bioresin: +seaweed + corn starch + + + + +b3 + +impregnate fiber with resin + + + + +b4 + +dry at 150-200Β°C + + + + +b_note + + + +simpler chemistry +composite (not pure) +1 day process + + + + +c1 + +make hemp paper +from chopped fiber + + + +c2 + +soak in glycerol + +citric acid solution + + + + +c3 + +cure at 140Β°C +under weight + + + + +c_note + + + +no NaOH needed +safest approach +up to 70 MPa strength + + + + diff --git a/hemp-bioplastic/process/img/troubleshooting.dot b/hemp-bioplastic/process/img/troubleshooting.dot new file mode 100644 index 0000000..56c611b --- /dev/null +++ b/hemp-bioplastic/process/img/troubleshooting.dot @@ -0,0 +1,38 @@ +digraph troubleshooting { + bgcolor="#1a1a2e" + rankdir=TB + node [fontname="Helvetica" fontsize=10 style=filled shape=box] + edge [color="#888888" fontname="Helvetica" fontsize=9 fontcolor="#aaaaaa"] + + label=<what goes wrong & how to fix it> + labelloc=t + + subgraph cluster_problems { + label="" color=transparent + + p1 [label="CRUMBLES\nafter pressing" fillcolor="#B71C1C" fontcolor="white"] + f1 [label="too dry, low pressure,\nor temperature too low\nβ†’ add glycerol (15%+)\nβ†’ increase pressure\nβ†’ verify 140-150Β°C" fillcolor="#263238" fontcolor="#4CAF50"] + + p2 [label="SPONGY\nporous texture" fillcolor="#B71C1C" fontcolor="white"] + f2 [label="moisture remained\nsteam created voids\nβ†’ dry overnight at 60Β°C\nβ†’ verify weight is stable\nbefore pressing" fillcolor="#263238" fontcolor="#4CAF50"] + + p3 [label="BROWN\nafter extraction" fillcolor="#B71C1C" fontcolor="white"] + f3 [label="lignin remains\ninsufficient delignification\nβ†’ repeat NaOH bath\nβ†’ add bleaching step\nβ†’ check NaOH concentration" fillcolor="#263238" fontcolor="#4CAF50"] + + p4 [label="DISSOLVES\nin water" fillcolor="#B71C1C" fontcolor="white"] + f4 [label="no crosslinking\nglycerol is water-soluble\nβ†’ add citric acid (5%)\nβ†’ cure at 140Β°C\nβ†’ or reduce glycerol" fillcolor="#263238" fontcolor="#4CAF50"] + + p5 [label="BRITTLE\nshatters on impact" fillcolor="#B71C1C" fontcolor="white"] + f5 [label="too little plasticizer\nor cellulose degraded\nβ†’ increase glycerol to 25-30%\nβ†’ use gentler NaOH (<7.5%)" fillcolor="#263238" fontcolor="#4CAF50"] + + p6 [label="LOW YIELD\n(<20% cellulose)" fillcolor="#B71C1C" fontcolor="white"] + f6 [label="NaOH too concentrated\nor temperature too high\nβ†’ use 5% NaOH protocol\nβ†’ stay under 80Β°C\nβ†’ use bast fiber not hurd" fillcolor="#263238" fontcolor="#4CAF50"] + + p1 -> f1 + p2 -> f2 + p3 -> f3 + p4 -> f4 + p5 -> f5 + p6 -> f6 + } +} diff --git a/hemp-bioplastic/process/img/troubleshooting.png b/hemp-bioplastic/process/img/troubleshooting.png new file mode 100644 index 0000000..59e1a47 Binary files /dev/null and b/hemp-bioplastic/process/img/troubleshooting.png differ diff --git a/hemp-bioplastic/process/img/troubleshooting.svg b/hemp-bioplastic/process/img/troubleshooting.svg new file mode 100644 index 0000000..8224dbc --- /dev/null +++ b/hemp-bioplastic/process/img/troubleshooting.svg @@ -0,0 +1,155 @@ + + + + + + +troubleshooting + +what goes wrong & how to fix it + +cluster_problems + + + + +p1 + +CRUMBLES +after pressing + + + +f1 + +too dry, low pressure, +or temperature too low +β†’ add glycerol (15%+) +β†’ increase pressure +β†’ verify 140-150Β°C + + + +p1->f1 + + + + + +p2 + +SPONGY +porous texture + + + +f2 + +moisture remained +steam created voids +β†’ dry overnight at 60Β°C +β†’ verify weight is stable +before pressing + + + +p2->f2 + + + + + +p3 + +BROWN +after extraction + + + +f3 + +lignin remains +insufficient delignification +β†’ repeat NaOH bath +β†’ add bleaching step +β†’ check NaOH concentration + + + +p3->f3 + + + + + +p4 + +DISSOLVES +in water + + + +f4 + +no crosslinking +glycerol is water-soluble +β†’ add citric acid (5%) +β†’ cure at 140Β°C +β†’ or reduce glycerol + + + +p4->f4 + + + + + +p5 + +BRITTLE +shatters on impact + + + +f5 + +too little plasticizer +or cellulose degraded +β†’ increase glycerol to 25-30% +β†’ use gentler NaOH (<7.5%) + + + +p5->f5 + + + + + +p6 + +LOW YIELD +(<20% cellulose) + + + +f6 + +NaOH too concentrated +or temperature too high +β†’ use 5% NaOH protocol +β†’ stay under 80Β°C +β†’ use bast fiber not hurd + + + +p6->f6 + + + + + diff --git a/hemp-bioplastic/process/index.html b/hemp-bioplastic/process/index.html new file mode 100644 index 0000000..9ebcf50 --- /dev/null +++ b/hemp-bioplastic/process/index.html @@ -0,0 +1,472 @@ + + + + hemp bioplastic process — unturf. + + + + + + + + + +
+ +

unturf.

+

grow food not lawn

+ + +

Hemp Bioplastic: Process

+ +

+A step-by-step recipe for turning hemp stalks into bioplastic. Three approaches exist β€” from full cellulose extraction (most chemistry) to citric acid crosslinking (least chemistry). This page covers all three with exact quantities, temperatures, times, & safety notes. +

+ +

+Start with a 50g test batch. Expect 2-3 days from stalk to finished object. Expect to fail the first time. Expect to learn why. +

+ + + + + +STEP 1 +

Which Parts of Hemp We Harvest

+ +

+Hemp bioplastic comes from stalks only β€” specifically bast fiber, the outer bark layer of the main stem. Not leaves. Not seeds. Not roots. Each part serves a different purpose. +

+ +
+ Hemp plant anatomy: which parts we use for bioplastic +
bioplastic comes from stalk bast fiber. everything else serves other purposes.
+
+ + + + + + + + + + + + + +
Plant PartUse for Bioplastic?What It Does Instead
Stalk β€” bast fiberYes β€” primary source77% cellulose, highest quality
Stalk β€” hurd (core)Yes β€” lower grade44% cellulose, or use for hempcrete, animal bedding, garden mulch
LeavesNoCompost, mulch, animal feed
SeedsNoFood (hemp hearts), oil, or save for next crop
RootsNoStay in ground β€” improve soil structure, break compaction, add organic matter
FlowersNoFiber varieties produce minimal flower; if present, compost or dry
+ +

+Harvest stalks when they reach full height (2-4 meters, ~120 days). Cut at ground level. Leave roots in soil β€” they decompose & feed next season's crop. Strip leaves & set aside for compost. Collect seeds if needed for replanting. +

+ + + + + +STEP 2 +

Three Approaches

+ +

+No single canonical recipe exists. Research reveals three distinct paths, each with different tradeoffs between chemistry complexity & material quality.[1] +

+ +
+ Three approaches: cellulose extraction, fiber composite, citric acid crosslinking +
pick your path based on equipment, chemistry comfort, & desired result.
+
+ + + + + + + + + + +
ApproachChemistryTimeStrengthBest For
A: Cellulose extractionNaOH + acid + bleach2-3 days2-7 MPaPure bioplastic objects
B: Fiber + bioresinSeaweed + starch (no NaOH)1 dayModeratePanels, flat sheets
C: Citric acid crosslinkCitric acid + glycerol (no NaOH)1 dayUp to 70 MPaStrongest result, safest chemistry
+ +
+Recommendation for first attempt: Approach C (citric acid crosslinking) avoids all NaOH, all acid work, & all bleaching while producing material up to 70 MPa tensile strength.[5] If you want to understand full cellulose extraction, try Approach A on a second batch. +
+ + + + + +STEP 3 +

Equipment

+ +
+ Equipment needed for a 50g test batch +
total equipment cost: $500-2,000 for basic workshop setup.
+
+ +

Chemistry (Approach A only)

+
    +
  • Stainless steel pot, 2-5 liter β€” NOT aluminum (reacts with NaOH)
  • +
  • Hot plate capable of 80-100Β°C
  • +
  • Digital thermometer, 0-200Β°C range
  • +
  • pH strips, range 1-14
  • +
  • Vacuum filtration: Buchner funnel + vacuum flask + water aspirator
  • +
  • Kitchen scale, 0.1g precision
  • +
  • Mortar & pestle or coffee grinder for fiber size reduction
  • +
  • Metal sieve, 1.5mm mesh
  • +
  • Multiple large buckets for washing
  • +
+ +

Pressing (all approaches)

+
    +
  • Metal mold β€” aluminum soap mold works for test batches
  • +
  • Oven capable of 140-200Β°C, or a rosin press ($200-500)
  • +
  • Bench vise, hydraulic press, or heavy C-clamps for pressure
  • +
  • Heat-resistant gloves rated 200Β°C+
  • +
+ +

Safety (non-negotiable)

+
    +
  • Chemical splash goggles β€” not just safety glasses
  • +
  • Nitrile gloves, elbow length
  • +
  • Ventilated workspace β€” fume hood or work outdoors
  • +
  • Bottle of 2% vinegar nearby for NaOH spill neutralization
  • +
  • Running water within arm's reach
  • +
+ + + + + +STEP 4 +

Retting (Preparing Stalks)

+ +

+Before separating fiber from stalk, retting partially breaks down the pectin that binds bast fiber to hurd. Skip this & decortication becomes very difficult.[12] +

+ +
+ Retting process and three tests to check readiness +
dew retting takes 3-45 days depending on temperature. three tests confirm readiness.
+
+ +

Dew Retting (simplest)

+
    +
  1. Lay harvested stalks on grass, exposed to rain & dew
  2. +
  3. Turn stalks every few days for even breakdown
  4. +
  5. Maintain ~30% moisture β€” sprinkle with water if dry
  6. +
  7. Duration depends on temperature: +
      +
    • 37Β°C β†’ 3 days
    • +
    • 20Β°C β†’ 7-8 days
    • +
    • 12Β°C β†’ 15-17 days
    • +
    • 7Β°C β†’ 30-45 days
    • +
    • Below 5Β°C β†’ retting stops
    • +
    +
  8. +
+ +

Water Retting (faster)

+
    +
  1. Submerge stalks in warm water for ~10 days
  2. +
  3. Change water periodically β€” it will smell
  4. +
  5. Bacteria in water accelerate pectin breakdown
  6. +
+ +

Three Tests for Readiness

+ +
+Bend test: Bend dried stalks back & forth. Hurd should crack & fall free. Fiber should NOT break when shaken.

+Peel test: Peel fiber at base of stem. Should separate easily for several inches. If fiber breaks after a few inches, retting needs more time.

+Color test: Fiber bundles turning white signals readiness. +
+ +
+Over-retting weakens fiber. Under-retting makes separation very difficult. Test every 2-3 days. When in doubt, under-ret β€” you can always ret longer but cannot un-ret. +
+ + + + + +STEP 5 +

Decortication (Separating Fiber)

+ +

+After retting, separate bast fiber from hurd by hand.[9] Target: 95% clean bast fiber with 5% or less hurd contamination. +

+ +
    +
  1. Break: Bend & snap dried retted stalks repeatedly. Woody hurd should crack & fall away from flexible bast fiber.
  2. +
  3. Shake: Shake vigorously to dislodge hurd fragments.
  4. +
  5. Scutch: Beat fibers against a hard surface to remove remaining hurd.
  6. +
  7. Hackle: Pull fibers through coarse wire brushes or metal combs to remove short fibers & debris.
  8. +
+ +

+For fresh (un-retted) stalks: use a knife at the base to separate the green outer fiber layer from the woody core. Peel bast fiber upward toward the tip. Slower but works without retting. +

+ + + + + +STEP 6 +

Approach A: Cellulose Extraction

+ +

+Full chemical extraction produces the purest cellulose. Three protocols exist β€” start with Protocol 2 (gentlest) for a first attempt.[1] +

+ +
+ Cellulose extraction process: prepare, alkali treat, bleach, purify +
50g hemp powder yields ~25g pure cellulose through 4 stages.
+
+ +

Size Reduction

+
    +
  1. Dry separated bast fibers at 50Β°C until constant weight
  2. +
  3. Cut to 2-3 cm lengths
  4. +
  5. Grind using blender, coffee grinder, or mortar & pestle
  6. +
  7. Pass through 1.5mm metal sieve
  8. +
  9. Weigh 50g of powder (test batch)
  10. +
+ +

Protocol 1: Full Extraction (highest purity)

+ +
+Alkali treatment:[2]
+50g hemp powder + 750 mL of 12% NaOH solution (= 90g NaOH pellets dissolved in 750 mL water). Solid/liquid ratio 1:15. Heat to 80Β°C with continuous stirring at 500 rpm. Hold for 3 hours. Vacuum filter. Wash with deionized water 4-5 times until wash water reaches neutral pH. Dry at 60Β°C overnight.

+ +Bleaching (optional but recommended):[3]
+8% hydrogen peroxide solution, pH adjusted to 12 with NaOH. 40Β°C, solution/solid ratio 30:1. 1 hour per cycle, repeat 4 cycles. Wash until neutral. Safer than sodium chlorite for workshop use.

+ +Hemicellulose removal:
+Treat bleached product with 17.5% NaOH solution. Room temperature. 5 hours with continuous stirring at 500 rpm. Vacuum filter. Wash 3 times with deionized water. Dry at 60Β°C overnight. +
+ +

Protocol 2: Gentle Extraction (best for beginners)

+ +
+Alkali treatment:[6]
+5% NaOH solution (= 50g NaOH per liter of water). Soak hemp fibers at room temperature (23Β°C) for 4 hours. No heating required. Wash with tap water until pH ~7. Oven dry at 80Β°C until constant weight.

+This protocol found 5% NaOH for 1 hour nearly as effective as 4 hours. Start with 1 hour, check results, extend if needed. +
+ +
+NaOH safety. ALWAYS add NaOH pellets to water, NEVER water to NaOH. Dissolution generates heat & can spatter violently. At 12-17.5% concentration, NaOH solution dissolves skin on contact. Wear splash goggles & elbow-length nitrile gloves. Keep running water within arm's reach. If skin contact occurs, flush with water for 15+ minutes. Store NaOH pellets in airtight containers β€” they absorb moisture from air. +
+ + + + + +STEP 7 +

Approach B: Fiber + Bioresin Composite

+ +

+Robert Murray-Smith's method skips all chemical extraction.[4] Instead, hemp fiber acts as reinforcement inside a bioresin matrix made from seaweed & corn starch. +

+ +
+Bioresin recipe:
+25g dried seaweed (carrageenan or agar) + 50g corn starch + 1 liter water. Heat & stir until dissolved into a viscous liquid.

+ +Process:
+1. Prepare a hemp fiber mat (loose fiber spread into a flat layer)
+2. Pour bioresin over fiber mat
+3. Roll with a roller until resin penetrates fully through the mat
+4. Dry in oven at 150-200Β°C for 20 minutes
+5. Result: a rigid composite panel

+ +Variant: Replace seaweed/starch with casein (milk protein) + tannin (from strong tea or chestnut extract) for a harder result. Murray-Smith describes this as "quite hard, quite plastic." +
+ +

+This produces a composite β€” not pure bioplastic. Hemp fiber (30-50% by weight) reinforces a starch or protein matrix. Simpler chemistry, fewer hazards, one-day process. Tradeoff: less versatile shapes, works best for flat panels & sheets. +

+ + + + + +STEP 8 +

Approach C: Citric Acid Crosslinking

+ +

+Developed by Beluns et al. at Riga Technical University (2023).[5] No NaOH. No acid baths. No bleach. Produces material up to 70 MPa tensile strength β€” comparable to commodity petroleum plastics. The safest & strongest approach. +

+ +
+Process:
+1. Chop hemp stalks (bast + hurd together works) & soak in water
+2. Spread fibers on a screen, press flat, dry β€” making a rough hemp paper
+3. Prepare impregnation solution: 2g glycerol + 1g citric acid + small amount of PEG (polyethylene glycol), dissolved in minimal water
+4. Soak hemp paper in solution until saturated
+5. Place on a metal sheet, cover with another sheet
+6. Cure at 140Β°C in oven for 30-60 minutes under weight (a brick or cast iron pan on top)
+7. Wash in water for 24-48 hours to remove unreacted material
+8. Dry at room temperature +
+ +

+Tradeoff: requires xylan (hemicellulose powder) & PEG (polyethylene glycol) β€” specialty chemicals, but non-hazardous & available from lab suppliers online. The citric acid crosslinks cellulose chains, creating thermal bonds that reduce water uptake 7-fold versus untreated hemp paper. These bonds reverse at high temperature, making the material theoretically recyclable by re-heating. +

+ + + + + +STEP 9 +

Mixing & Hot Pressing (Approach A)

+ +

+After extracting cellulose via Approach A, mix with plasticizer & press into shapes. +

+ +
+ Mixing cellulose with glycerol and hot pressing into molds +
the material MUST be completely dry before pressing. this is the most common failure point.
+
+ +
+Mixing:
+1. Weigh dried cellulose
+2. Add glycerol: 15% by weight for rigid, 30% for flexible
+3. Add water to make a workable slurry
+4. Stir at 80Β°C for 60 minutes until homogeneous
+5. Optional: add 5% citric acid by weight for water resistance

+ +Drying (critical):
+6. Spread mixture on a tray
+7. Dry at 60Β°C overnight β€” or until weight stabilizes
+8. Grind to a breadcrumb/sawdust consistency

+ +Pressing:[11]
+9. Coat mold interior with thin layer of vegetable oil
+10. Fill mold with dry material, compress lightly by hand, add lid
+11. Heat to 150Β°C (oven or heat press)
+12. Once at temperature, apply maximum pressure β€” bench vise, hydraulic press, or C-clamps
+13. Hold at temperature & pressure for 10-30 minutes (30 min gave best strength in testing)
+14. Release pressure
+15. Cool slowly in mold β€” do not rush, rapid cooling causes cracking
+16. Demold +
+ +
+If material stays wet when pressed: Steam creates voids. Result becomes spongy & porous. This represents the most common failure mode. Murray-Smith emphasizes: "if it's wet and you heat it and press it, you'll press off a lot of steam and it won't form properly."[4] Dry overnight. Verify weight has stopped changing. Then press. +
+ + + + + +STEP 10 +

Troubleshooting

+ +
+ Common problems and solutions +
every failure teaches something. expect the first batch to teach more than it produces.
+
+ +

Quality Indicators

+ + + + + + + + + + + + + +
CheckGoodBad
Color after extractionWhite to off-whiteBrown/yellow (lignin remains)
Texture when dryFibrous, fluffy, crumblyStiff hard chunks (hurd contamination)
Weight loss from original40-50% for bast (normal)>70% (over-treated) or <30% (under-treated)
Surface after pressingSmooth, glossyRough, porous, bubbled (wet)
Sound when tappedSolid "click"Hollow "thud" (voids inside)
Water drop testWater beads or absorbs slowlyInstantly absorbs & softens (needs crosslinking)
+ + + + + +STEP 11 +

Scaling Up

+ + + + + + + + + + +
ScaleInputYieldTimeNotes
Test batch50g bast fiber~25g cellulose2-3 daysOne soap-mold-sized object. $5-10 in chemicals.
Useful batch2 kg bast fiber~1 kg cellulose3-5 days10-20 liter reaction vessel needed. ~100+ liters wash water.
Community batch20 kg bast fiber~10 kg cellulose5-7 daysNeeds mechanical stirring, larger press, waste handling plan.
+ +
+Scaling NaOH: Dissolution stays exothermic. At larger volumes, add pellets slowly & monitor temperature. A 20-liter NaOH batch generates significant heat. Never dump all pellets at once. +
+ +

+Approach C (citric acid crosslinking) scales most easily β€” no chemical extraction means no waste liquor management. Just make more hemp paper, apply more solution, cure in a larger oven. A community could run this with minimal training. +

+ +
+ +

Honest Summary

+ +

+Making hemp bioplastic at home stays possible but labor-intensive. A 50g test batch costs $5-10 in chemicals & takes 2-3 days. Results will vary. First batches teach more than they produce. Approach C (citric acid) offers the safest entry point with the strongest results. Approach A (full extraction) teaches the most about cellulose chemistry. Approach B (bioresin composite) produces useful panels fastest. +

+ +

+None of this replaces buying groceries in glass jars or using cloth bags β€” those remain easier. But for seed trays, plant pots, serving ware, & packaging where you want a compostable container made from your own land, this process closes a cycle. Grow it. Process it. Use it. Compost it. Grow again. +

+ +
+ +

Sources

+ +
+
    +
  1. Chalannavar et al. (2025), "Industrial Cannabis sativa: Hemp Cellulose Based Bioplastic Production," Magna Scientia. Comprehensive review reproducing Liao protocol with 50g/12% NaOH/1:15 ratio/80Β°C/3h parameters.
  2. + +
  3. Liao (2022), McGill University thesis. Hemp nanocellulose extraction: 49.6% yield from bast fiber at 97% purity. Detailed NaOH protocol with exact quantities.
  4. + +
  5. Hydrogen peroxide bleaching protocol from PMC 10611065. Safer alternative to sodium chlorite for workshop-scale cellulose bleaching.
  6. + +
  7. Robert Murray-Smith, "A Hemp And Seaweed Bioplastic" (2020) & "Hot Press Molding Hemp Casein Plastic" (2020). Workshop demonstrations with bioresin composite & casein-tannin approaches at 150Β°C.
  8. + +
  9. Beluns et al. (2023), "Sustainable hemp-based bioplastics with tunable properties via reversible thermal crosslinking of cellulose," Int J Biol Macromol. No chemical pretreatment, citric acid crosslinking at 140Β°C, achieving up to 70 MPa tensile strength & 7-fold water uptake reduction.
  10. + +
  11. Dhakal et al. (2022), PMC 9182753. 5% NaOH treatment of hemp at room temperature for 1-4 hours β€” gentlest effective protocol.
  12. + +
  13. PMC 12073554 (2025). Hemp waste cellulose extraction via alternating 2% NaOH & 1M HCl treatments. Milder protocol with 47% yield.
  14. + +
  15. PMC 5456901. Abraham et al. (2016), hemp hurd cellulose microfiber extraction via alkaline & acid hydrolysis.
  16. + +
  17. Hemp In A Pot, "Manual Decortication of Hemp Stalks By Hand" (2020). Practical video demonstration of hand decortication.
  18. + +
  19. Solis Garcia et al. (2025), "Extraction of cellulose fibers from hemp stalk by chemical treatment". Optimal at 10% NaOH / 120 min yielding 75.11% alpha-cellulose.
  20. + +
  21. Bio-protocol (2025). Hemp cellulose + glycerol + NaOH, stirred 60 min at 80Β°C, hot pressed at 240Β°C for 10 min.
  22. + +
  23. Robert A. Nelson, "Hemp Husbandry, Chapter 3: Hemp Fiber". Comprehensive retting reference with temperature/duration data.
  24. +
+
+ +
+ +

← hemp bioplastic overview Β· homeschool recipe Β· factory Β· single-use plastics Β· manifesto

+ +
+ + + + + + + diff --git a/index.html b/index.html index eb7388c..53c9dc4 100644 --- a/index.html +++ b/index.html @@ -4,5 +4,6 @@ + diff --git a/js/diagram-zoom.js b/js/diagram-zoom.js new file mode 100644 index 0000000..78242ee --- /dev/null +++ b/js/diagram-zoom.js @@ -0,0 +1,35 @@ +// Click-to-zoom for .diagram img elements +// Creates a fullscreen overlay with the diagram, click or Escape to close +(function () { + var overlay = document.createElement('div'); + overlay.id = 'diagram-overlay'; + overlay.style.cssText = + 'display:none;position:fixed;top:0;left:0;width:100%;height:100%;' + + 'background:rgba(0,0,0,0.9);z-index:9999;cursor:zoom-out;' + + 'justify-content:center;align-items:center;padding:2em;'; + + var img = document.createElement('img'); + img.style.cssText = 'max-width:95%;max-height:95%;object-fit:contain;'; + overlay.appendChild(img); + + document.body.appendChild(overlay); + + overlay.addEventListener('click', function () { + overlay.style.display = 'none'; + }); + + document.addEventListener('keydown', function (e) { + if (e.key === 'Escape' && overlay.style.display === 'flex') { + overlay.style.display = 'none'; + } + }); + + document.querySelectorAll('.diagram img').forEach(function (el) { + el.style.cursor = 'zoom-in'; + el.addEventListener('click', function () { + img.src = el.src; + img.alt = el.alt; + overlay.style.display = 'flex'; + }); + }); +})(); diff --git a/let-us-define-a-permacomputer/img/permacomputer-properties.dot b/let-us-define-a-permacomputer/img/permacomputer-properties.dot new file mode 100644 index 0000000..1a39d0f --- /dev/null +++ b/let-us-define-a-permacomputer/img/permacomputer-properties.dot @@ -0,0 +1,118 @@ +digraph properties { + bgcolor="transparent" + rankdir=TB + pad=0.5 + nodesep=0.5 + ranksep=0.7 + + node [ + fontname="Helvetica" + fontsize=11 + style="filled" + penwidth=2 + shape=box + ] + + edge [ + penwidth=1.5 + color="#888888" + arrowsize=0.7 + ] + + // Center + pc [ + label="PERMACOMPUTER\n\nalways on Β· durable\neasy to repair\nby the people\nfor the people" + shape=doublecircle + fillcolor="#263238" + fontcolor="#CDDC39" + color="#CDDC39" + fontsize=12 + width=2.4 + fixedsize=true + ] + + // Truth properties + subgraph cluster_truth { + label="TRUTH" + fontname="Helvetica" + fontsize=14 + fontcolor="#2E7D32" + style="rounded,filled" + color="#4CAF50" + fillcolor="#E8F5E9" + + t1 [label="open source" fillcolor="#C8E6C9" color="#4CAF50" fontcolor="#1B5E20"] + t2 [label="public domain" fillcolor="#C8E6C9" color="#4CAF50" fontcolor="#1B5E20"] + t3 [label="all layers\naccessible" fillcolor="#C8E6C9" color="#4CAF50" fontcolor="#1B5E20"] + t4 [label="math as\nnatural right" fillcolor="#C8E6C9" color="#4CAF50" fontcolor="#1B5E20"] + } + + // Freedom properties + subgraph cluster_freedom { + label="FREEDOM" + fontname="Helvetica" + fontsize=14 + fontcolor="#0D47A1" + style="rounded,filled" + color="#2196F3" + fillcolor="#E3F2FD" + + f1 [label="voluntary\nparticipation" fillcolor="#BBDEFB" color="#2196F3" fontcolor="#0D47A1"] + f2 [label="freedom FROM\ntyranny" fillcolor="#BBDEFB" color="#2196F3" fontcolor="#0D47A1"] + f3 [label="free to create\n& share" fillcolor="#BBDEFB" color="#2196F3" fontcolor="#0D47A1"] + f4 [label="utopia of\nthe commons" fillcolor="#BBDEFB" color="#2196F3" fontcolor="#0D47A1"] + } + + // Harmony properties + subgraph cluster_harmony { + label="HARMONY" + fontname="Helvetica" + fontsize=14 + fontcolor="#E65100" + style="rounded,filled" + color="#FF9800" + fillcolor="#FFF3E0" + + h1 [label="inputs match\noutputs" fillcolor="#FFE0B2" color="#FF9800" fontcolor="#E65100"] + h2 [label="self-renewing\nsystem" fillcolor="#FFE0B2" color="#FF9800" fontcolor="#E65100"] + h3 [label="low waste\nlow pollution" fillcolor="#FFE0B2" color="#FF9800" fontcolor="#E65100"] + h4 [label="diverse\nconnections" fillcolor="#FFE0B2" color="#FF9800" fontcolor="#E65100"] + } + + // Love properties + subgraph cluster_love { + label="LOVE" + fontname="Helvetica" + fontsize=14 + fontcolor="#880E4F" + style="rounded,filled" + color="#E91E63" + fillcolor="#FCE4EC" + + l1 [label="cooperation\nnot competition" fillcolor="#F8BBD0" color="#E91E63" fontcolor="#880E4F"] + l2 [label="wu wei\neffortless action" fillcolor="#F8BBD0" color="#E91E63" fontcolor="#880E4F"] + l3 [label="natural balance\nhomeostasis" fillcolor="#F8BBD0" color="#E91E63" fontcolor="#880E4F"] + l4 [label="be yourself\nwithout harm" fillcolor="#F8BBD0" color="#E91E63" fontcolor="#880E4F"] + } + + // Connect to center + t1 -> pc [color="#4CAF50"] + t2 -> pc [color="#4CAF50"] + t3 -> pc [color="#4CAF50"] + t4 -> pc [color="#4CAF50"] + + f1 -> pc [color="#2196F3"] + f2 -> pc [color="#2196F3"] + f3 -> pc [color="#2196F3"] + f4 -> pc [color="#2196F3"] + + h1 -> pc [color="#FF9800"] + h2 -> pc [color="#FF9800"] + h3 -> pc [color="#FF9800"] + h4 -> pc [color="#FF9800"] + + l1 -> pc [color="#E91E63"] + l2 -> pc [color="#E91E63"] + l3 -> pc [color="#E91E63"] + l4 -> pc [color="#E91E63"] +} diff --git a/let-us-define-a-permacomputer/img/permacomputer-properties.png b/let-us-define-a-permacomputer/img/permacomputer-properties.png new file mode 100644 index 0000000..8856524 Binary files /dev/null and b/let-us-define-a-permacomputer/img/permacomputer-properties.png differ diff --git a/let-us-define-a-permacomputer/img/permacomputer-properties.svg b/let-us-define-a-permacomputer/img/permacomputer-properties.svg new file mode 100644 index 0000000..e526d9e --- /dev/null +++ b/let-us-define-a-permacomputer/img/permacomputer-properties.svg @@ -0,0 +1,249 @@ + + + + + + +properties + +cluster_truth + +TRUTH + + +cluster_freedom + +FREEDOM + + +cluster_harmony + +HARMONY + + +cluster_love + +LOVE + + + +pc + + +PERMACOMPUTER +always on Β· durable +easy to repair +by the people +for the people + + + +t1 + +open source + + + +t1->pc + + + + + +t2 + +public domain + + + +t2->pc + + + + + +t3 + +all layers +accessible + + + +t3->pc + + + + + +t4 + +math as +natural right + + + +t4->pc + + + + + +f1 + +voluntary +participation + + + +f1->pc + + + + + +f2 + +freedom FROM +tyranny + + + +f2->pc + + + + + +f3 + +free to create +& share + + + +f3->pc + + + + + +f4 + +utopia of +the commons + + + +f4->pc + + + + + +h1 + +inputs match +outputs + + + +h1->pc + + + + + +h2 + +self-renewing +system + + + +h2->pc + + + + + +h3 + +low waste +low pollution + + + +h3->pc + + + + + +h4 + +diverse +connections + + + +h4->pc + + + + + +l1 + +cooperation +not competition + + + +l1->pc + + + + + +l2 + +wu wei +effortless action + + + +l2->pc + + + + + +l3 + +natural balance +homeostasis + + + +l3->pc + + + + + +l4 + +be yourself +without harm + + + +l4->pc + + + + + diff --git a/let-us-define-a-permacomputer/img/quadrivium.dot b/let-us-define-a-permacomputer/img/quadrivium.dot new file mode 100644 index 0000000..1fc0f42 --- /dev/null +++ b/let-us-define-a-permacomputer/img/quadrivium.dot @@ -0,0 +1,75 @@ +digraph quadrivium { + bgcolor="transparent" + rankdir=TB + pad=0.5 + nodesep=0.8 + ranksep=1.0 + + node [ + fontname="Helvetica" + fontsize=14 + style="filled" + shape=circle + width=1.8 + fixedsize=true + penwidth=2 + ] + + edge [ + penwidth=2 + color="#555555" + arrowsize=0.8 + ] + + // The four values + truth [ + label="TRUTH\n\nopen source\npublic domain" + fillcolor="#4CAF50" + fontcolor="white" + color="#388E3C" + ] + + freedom [ + label="FREEDOM\n\nvoluntary\naction" + fillcolor="#2196F3" + fontcolor="white" + color="#1565C0" + ] + + harmony [ + label="HARMONY\n\nself-renewing\nabundance" + fillcolor="#FF9800" + fontcolor="white" + color="#E65100" + ] + + love [ + label="LOVE\n\nwu wei\ncooperation" + fillcolor="#E91E63" + fontcolor="white" + color="#AD1457" + ] + + // Center node + permacomputer [ + label="PERMA\nCOMPUTER" + shape=doublecircle + fillcolor="#263238" + fontcolor="#CDDC39" + color="#CDDC39" + fontsize=13 + width=1.6 + ] + + // Connections β€” each value feeds the permacomputer + truth -> permacomputer [label="code as\nseeds" fontsize=10 fontcolor="#388E3C"] + freedom -> permacomputer [label="no force\nno coercion" fontsize=10 fontcolor="#1565C0"] + harmony -> permacomputer [label="inputs match\noutputs" fontsize=10 fontcolor="#E65100"] + love -> permacomputer [label="the fuel\nthat drives" fontsize=10 fontcolor="#AD1457"] + + // Inter-value relationships + truth -> freedom [style=dashed label="transparency\nenables choice" fontsize=9 fontcolor="#555555"] + freedom -> harmony [style=dashed label="voluntary action\ncreates balance" fontsize=9 fontcolor="#555555"] + harmony -> love [style=dashed label="balance nurtures\nconnection" fontsize=9 fontcolor="#555555"] + love -> truth [style=dashed label="love demands\nhonesty" fontsize=9 fontcolor="#555555"] +} diff --git a/let-us-define-a-permacomputer/img/quadrivium.png b/let-us-define-a-permacomputer/img/quadrivium.png new file mode 100644 index 0000000..27a1008 Binary files /dev/null and b/let-us-define-a-permacomputer/img/quadrivium.png differ diff --git a/let-us-define-a-permacomputer/img/quadrivium.svg b/let-us-define-a-permacomputer/img/quadrivium.svg new file mode 100644 index 0000000..5961e8f --- /dev/null +++ b/let-us-define-a-permacomputer/img/quadrivium.svg @@ -0,0 +1,116 @@ + + + + + + +quadrivium + + +truth + +TRUTH +open source +public domain + + + +freedom + +FREEDOM +voluntary +action + + + +truth->freedom + + +transparency +enables choice + + + +permacomputer + + +PERMA +COMPUTER + + + +truth->permacomputer + + +code as +seeds + + + +harmony + +HARMONY +self-renewing +abundance + + + +freedom->harmony + + +voluntary action +creates balance + + + +freedom->permacomputer + + +no force +no coercion + + + +love + +LOVE +wu wei +cooperation + + + +harmony->love + + +balance nurtures +connection + + + +harmony->permacomputer + + +inputs match +outputs + + + +love->truth + + +love demands +honesty + + + +love->permacomputer + + +the fuel +that drives + + + diff --git a/let-us-define-a-permacomputer/img/seeds-and-sprouts.dot b/let-us-define-a-permacomputer/img/seeds-and-sprouts.dot new file mode 100644 index 0000000..586de6c --- /dev/null +++ b/let-us-define-a-permacomputer/img/seeds-and-sprouts.dot @@ -0,0 +1,111 @@ +digraph seeds { + bgcolor="transparent" + rankdir=TB + pad=0.5 + nodesep=0.6 + ranksep=0.8 + + node [ + fontname="Helvetica" + fontsize=12 + style="filled" + penwidth=2 + ] + + edge [ + penwidth=2 + color="#666666" + arrowsize=0.8 + ] + + // Source code as seeds + subgraph cluster_seed { + label="CODE AS SEEDS" + labeljust=l + fontname="Helvetica" + fontsize=13 + fontcolor="#2E7D32" + style="dashed" + color="#81C784" + bgcolor="#E8F5E9" + + source [ + label="open source\ncode" + shape=folder + fillcolor="#C8E6C9" + fontcolor="#1B5E20" + color="#4CAF50" + ] + + public_domain [ + label="public domain\nno license" + shape=note + fillcolor="#C8E6C9" + fontcolor="#1B5E20" + color="#4CAF50" + ] + + reference [ + label="reference\nimplementation" + shape=component + fillcolor="#C8E6C9" + fontcolor="#1B5E20" + color="#4CAF50" + ] + } + + // Sprouting on abandoned technology + subgraph cluster_sprout { + label="SPROUT ON ANY ABANDONED TECHNOLOGY" + labeljust=l + fontname="Helvetica" + fontsize=13 + fontcolor="#E65100" + style="dashed" + color="#FFB74D" + bgcolor="#FFF3E0" + + python [label="Python" shape=box fillcolor="#FFE0B2" color="#FF9800" fontcolor="#E65100"] + go [label="Go" shape=box fillcolor="#FFE0B2" color="#FF9800" fontcolor="#E65100"] + rust [label="Rust" shape=box fillcolor="#FFE0B2" color="#FF9800" fontcolor="#E65100"] + elixir [label="Elixir" shape=box fillcolor="#FFE0B2" color="#FF9800" fontcolor="#E65100"] + js [label="JavaScript" shape=box fillcolor="#FFE0B2" color="#FF9800" fontcolor="#E65100"] + any [label="any\nlanguage" shape=box fillcolor="#FFE0B2" color="#FF9800" fontcolor="#E65100" style="filled,dashed"] + } + + // Distribution + subgraph cluster_distribute { + label="DISTRIBUTE FREELY" + labeljust=l + fontname="Helvetica" + fontsize=13 + fontcolor="#1565C0" + style="dashed" + color="#64B5F6" + bgcolor="#E3F2FD" + + bittorrent [label="BitTorrent\npeer-to-peer" shape=hexagon fillcolor="#BBDEFB" color="#2196F3" fontcolor="#0D47A1"] + cloud [label="cloud\nobject store" shape=cylinder fillcolor="#BBDEFB" color="#2196F3" fontcolor="#0D47A1"] + git [label="git\nrepositories" shape=octagon fillcolor="#BBDEFB" color="#2196F3" fontcolor="#0D47A1"] + } + + // Connections + source -> reference + public_domain -> reference + reference -> python + reference -> go + reference -> rust + reference -> elixir + reference -> js + reference -> any + + python -> bittorrent + go -> bittorrent + rust -> cloud + elixir -> cloud + js -> git + any -> git + + bittorrent -> cloud [style=dashed dir=both label="redundancy" fontsize=10 fontcolor="#666666"] + cloud -> git [style=dashed dir=both label="mirrors" fontsize=10 fontcolor="#666666"] +} diff --git a/let-us-define-a-permacomputer/img/seeds-and-sprouts.png b/let-us-define-a-permacomputer/img/seeds-and-sprouts.png new file mode 100644 index 0000000..3d77ee6 Binary files /dev/null and b/let-us-define-a-permacomputer/img/seeds-and-sprouts.png differ diff --git a/let-us-define-a-permacomputer/img/seeds-and-sprouts.svg b/let-us-define-a-permacomputer/img/seeds-and-sprouts.svg new file mode 100644 index 0000000..f4cba6a --- /dev/null +++ b/let-us-define-a-permacomputer/img/seeds-and-sprouts.svg @@ -0,0 +1,211 @@ + + + + + + +seeds + +cluster_seed + +CODE AS SEEDS + + +cluster_sprout + +SPROUT ON ANY ABANDONED TECHNOLOGY + + +cluster_distribute + +DISTRIBUTE FREELY + + + +source + +open source +code + + + +reference + + + +reference +implementation + + + +source->reference + + + + + +public_domain + + + +public domain +no license + + + +public_domain->reference + + + + + +python + +Python + + + +reference->python + + + + + +go + +Go + + + +reference->go + + + + + +rust + +Rust + + + +reference->rust + + + + + +elixir + +Elixir + + + +reference->elixir + + + + + +js + +JavaScript + + + +reference->js + + + + + +any + +any +language + + + +reference->any + + + + + +bittorrent + +BitTorrent +peer-to-peer + + + +python->bittorrent + + + + + +go->bittorrent + + + + + +cloud + + +cloud +object store + + + +rust->cloud + + + + + +elixir->cloud + + + + + +git + +git +repositories + + + +js->git + + + + + +any->git + + + + + +bittorrent->cloud + + + +redundancy + + + +cloud->git + + + +mirrors + + + diff --git a/let-us-define-a-permacomputer/img/trivium.dot b/let-us-define-a-permacomputer/img/trivium.dot new file mode 100644 index 0000000..d70cd91 --- /dev/null +++ b/let-us-define-a-permacomputer/img/trivium.dot @@ -0,0 +1,60 @@ +digraph trivium { + bgcolor="transparent" + rankdir=LR + pad=0.4 + nodesep=1.0 + + node [ + fontname="Helvetica" + fontsize=14 + style="filled" + shape=box + penwidth=2 + ] + + edge [ + penwidth=3 + fontsize=11 + ] + + // The universal logic + input [ + label="INPUTS\n\n0 Β· false Β· off\nraw Β· seed Β· question" + fillcolor="#37474F" + fontcolor="white" + color="#263238" + shape=box + width=2.2 + height=1.2 + ] + + process [ + label="PROCESS\n\nlogic Β· math\ntransformation" + fillcolor="#5C6BC0" + fontcolor="white" + color="#303F9F" + shape=diamond + width=2.4 + height=1.6 + ] + + output [ + label="OUTPUTS\n\n1 Β· true Β· on\nproduct Β· fruit Β· answer" + fillcolor="#43A047" + fontcolor="white" + color="#2E7D32" + shape=box + width=2.2 + height=1.2 + ] + + input -> process [label=" feed " color="#5C6BC0" fontcolor="#303F9F"] + process -> output [label=" yield " color="#43A047" fontcolor="#2E7D32"] + output -> input [ + label="feedback loop\noutput becomes input" + style=dashed + color="#FF9800" + fontcolor="#E65100" + constraint=false + ] +} diff --git a/let-us-define-a-permacomputer/img/trivium.png b/let-us-define-a-permacomputer/img/trivium.png new file mode 100644 index 0000000..7fab87d Binary files /dev/null and b/let-us-define-a-permacomputer/img/trivium.png differ diff --git a/let-us-define-a-permacomputer/img/trivium.svg b/let-us-define-a-permacomputer/img/trivium.svg new file mode 100644 index 0000000..4041e0e --- /dev/null +++ b/let-us-define-a-permacomputer/img/trivium.svg @@ -0,0 +1,58 @@ + + + + + + +trivium + + +input + +INPUTS +0 Β· false Β· off +raw Β· seed Β· question + + + +process + +PROCESS +logic Β· math +transformation + + + +input->process + + +  feed   + + + +output + +OUTPUTS +1 Β· true Β· on +product Β· fruit Β· answer + + + +process->output + + +  yield   + + + +output->input + + +feedback loop +output becomes input + + + diff --git a/let-us-define-a-permacomputer/index.html b/let-us-define-a-permacomputer/index.html index 93a00d1..9e79996 100644 --- a/let-us-define-a-permacomputer/index.html +++ b/let-us-define-a-permacomputer/index.html @@ -14,7 +14,7 @@ | Adventure #1 | ------------ | -| A reader may unfold how to read and write HTML using the verbose +| A reader may unfold how to read & write HTML using the verbose | Comment Tags throughout this HTML Document. | | Ready to Explore? @@ -37,7 +37,7 @@ The "head" tag holds "meta data" on how various clients should render or display - + grow food not lawn — unturf. @@ -49,37 +49,34 @@ The "head" tag holds "meta data" on how various clients should render or display - + - + + + - + --> - - + -
+
-

unturf.

+

unturf.

grow food not lawn

+ -

To start the conversation off, this is a first draft on this opening thread:

+

To start conversation off, here comes a first draft on this opening thread:

-

What are the possible ways to define a "Permacomputer".

+

What possible ways exist to define a "Permacomputer".

-Suppose we dream of technology, with many different ways to implement a shared computer of permanence (Permacomputer), built by the people for the people. Similar to using the tap for drinking water or AC Electricity to run machines. An always on computer by the people, for the people. One which is durable, and easy to repair. One where all parts, all layers of abstraction are accessible to the human operators. +Suppose we dream of technology, with many different ways to implement a shared computer of permanence (Permacomputer), built by people for people. Similar to using a tap for drinking water or AC Electricity to run machines. An always on computer by people, for people. One which stays durable, & easy to repair. One where all parts, all layers of abstraction remain accessible to human operators.

-Suppose we built so many different implementations that we found patterns where accepting certain properties, constraints, or trade-offs we could generate self-renewing abundance (as manifested naturally by such a system) simply choosing the right patterns and designs to optimize toward the ideal positive steady growth state. +Suppose we built so many different implementations that we found patterns where accepting certain properties, constraints, or trade-offs we could generate self-renewing abundance (as manifested naturally by such a system) simply choosing right patterns & designs to optimize toward an ideal positive steady growth state.

-Suppose the technology exists already, but has not been creatively linked in the proper orientation, yet. +Suppose technology already exists, but has not yet found creative linkage in proper orientation.

-Suppose we decide to build a Permacomputer which optimizes for the trivium key operating values of Truth, Freedom, and Love. +Suppose we decide to build a Permacomputer which optimizes for quadrivium key operating values of Truth, Freedom, Harmony, & Love.

-Suppose we use rigor to define and agree on the meaning of those key operating values. What technological properties would we need to ensure the maximum Truth, Freedom, and Love would result just by humans participating in this system? +Suppose we use rigor to define & agree on meaning of those key operating values. +What technological properties would we need to ensure maximum Truth, Freedom, Harmony, & Love would result just by humans participating in this system?

-So how do we solve for (and protect) these three key values using today's existing technologies? What properties does our Permacomputer need to become alive and grow indefinitely? +So how do we solve for (& protect) these four key values using today's existing technologies? +What properties does a permacomputer need to come alive & grow indefinitely?

TRUTH

-Our Universe is mathmatical, & math is a natural right (even above public domain). -The universe is logical & always follows a trivium of +Our Universe runs on math, & math remains a natural right (even above public domain). +Universe follows logic & always traces a trivium of inputs > process > outputs -This logic is of the 0 and 1 or True and False. +This logic holds 0 & 1 or True & False. -It is the separation between two, no edge or gradient. +A separation between two, no edge or gradient. -In regards to a Permacomputer, for Truth, the source code must be open source & freely distributed. +In regards to a Permacomputer, for Truth, source code must stay open source & freely distributed. -In fact, in my ideal the core parts of the machine would be gifted into the public domain (without license or warranty). +In fact, in my ideal core parts of a machine would get gifted into public domain (without license or warranty). -In this way we may treat our code bases as seeds to sprout on any abandoned technology. My reference implementation will use Python, however I fully expect people to port the ideas into all programming languages. +In this way we may treat our code bases as seeds to sprout on any abandoned technology. My reference implementation will use Python, however I fully expect people to port ideas into all programming languages.

go-rusty-rails-jvm.js

+ FREEDOM

-For Freedom, all actions on the Permacomputer are voluntary. You are not forced to upload content to the Permacomputer, you volunteer the same way you do when uploading to Monopolistic Corporate Owned Social Media Sites. When you upload content to the Permacomputer you have implicitly also agreed to the inherent & natural terms of the system. For example, if you configure content to be public, and you make the price $0, anyone can download the content however they please off the servers. Public data labeled free will be distributed over cloud object stores and then seeded via bittorrent. Content creators should upload content, the Permacomputer may have systems to prevent plagerism. Free to remix & collaborate with anyone, as long as it's voluntary with all humans involved. A Permacomputer is a gradient, a "gray zone", which form egdes between worlds and exist without grants or manicupalities. A Permacomputer is a Utopia of the commons. +For Freedom, all actions on a Permacomputer stay voluntary. Nobody forces you to upload content to a Permacomputer, you volunteer just as you do when uploading to Monopolistic Corporate Owned Social Media Sites. When you upload content to a Permacomputer you have implicitly also agreed to inherent & natural terms of a system. For example, if you configure content to go public, & you make the price $0, anyone can download content however they please off servers. Public data labeled free will get distributed over cloud object stores & then seeded via bittorrent. Content creators should upload content, a Permacomputer may have systems to prevent plagerism. Free to remix & collaborate with anyone, as long as participation stays voluntary with all humans involved. A Permacomputer forms a gradient, a "gray zone", which shapes egdes between worlds & exists without grants or manicupalities. A Permacomputer grows a Utopia of commons.

-Freedom is a tricky word for people to grok. -This is because people look at it from the FREEDOM TO perspective rather than the more valid FREEDOM FROM perspective. -FREEDOM FROM tyranny being key. -You are free to create & share, like a radio broadcasting creations to anyone who may find interest. +Freedom stays a tricky word for people to grok. +People look at it from a FREEDOM TO perspective rather than a more valid FREEDOM FROM perspective. +FREEDOM FROM tyranny remains key. +You stay free to create & share, like a radio broadcasting creations to anyone who may find interest. +

+ +Harmony + +

+A system in harmony has approapriate inputs for all of it's outputs. +Put another way, very little waste or pollution occurs during operation. +A system in harmony will self renew & cause diverse connections to thrive within. +Peace arrives when inner & outter parts of a system take harmonious action or inaction with each part of a holistic & shared universe. +Beings in harmony look out for one another & grow healthier because of fruitful relationships. +Beings in harmony help others unfold peace within their own tiny universes.

LOVE

-Finally Love, Freedom only works when we hold it with Love. Individual Freedoms are a NATURAL RIGHT. Be youself without hurting others. We know that the law of attraction manifests collaboration & cooperation from the smallest parts like our models of the atom, to a single cell, to a human's body, to the mind & the global subconscious. This law is love. Love is not always right but it's the fuel, it's what drives this whole mad universe and it's you and it's me and we are excellent! Can you imagine, your heart beating for you each and everyday, the bacteria in your gut digesting food for your cells to uptake and absorb. Everything in perfect balance and homeostasis! Sure we may fall ill, but our bodies repair even without our focus. In fact it's often better to sleep when feeling sick and turn down the conscious ego altogether and slip into lala land: to the place of archetypes, the shadow, the subconscious, and unconscious. Our bodies rescue us, we do nothing (wu wei) and only need to wait through the uncomfortable now. A new day will rise and after a short time we feel whole again. We have all experienced this. We know this because this is love. Our bodies love us and if we treat others inside this Permacomputer system with love, I don't see why Freedom cannot find a natural balance, especially if love were inherently part of the technological constraints and engineering decisions. You know what true love is, you might have forgotten, but you know it, and I love you. +Finally Love, Freedom only works when we hold it with Love. Individual Freedoms remain a NATURAL RIGHT. Stay youself without hurting others. We know that a law of attraction manifests collaboration & cooperation from smallest parts like our models of atoms, to a single cell, to a human's body, to mind & global subconscious. This law runs on love. Love doesn't always get it right but it stays fuel, it drives this whole mad universe & it's you & it's me & we rock! Can you imagine, your heart beating for you each & everyday, bacteria in your gut digesting food for your cells to uptake & absorb. Everything in perfect balance & homeostasis! Sure we may fall ill, but our bodies repair even without our focus. In fact it often works better to sleep when feeling sick & turn down conscious ego altogether & slip into lala land: to a place of archetypes, shadow, subconscious, & unconscious. Our bodies rescue us, we do nothing (wu wei) & only need to wait through an uncomfortable now. A new day will rise & after a short time we feel whole again. We have all experienced this. We know this because this runs on love. Our bodies love us & if we treat others inside a Permacomputer system with love, I don't see why Freedom cannot find a natural balance, especially if love stays inherently part of technological constraints & engineering decisions. You know what true love feels like, you might have forgotten, but you know it, & I love you.

-

So in the comments below, perhaps we talk about existing technologies both centralized and distributed computing stacks. Let's talk about bittorrent. Let's talk about the game changing Cloudflare R2 (AWS S3 compatible object store). Let's talk about the "pirate" peer-to-peer distribution networks of the 1990's and 2000's. Let's talk cryptography. Let's talk crypto currencies. Let's talk about how to build a distributed and permanent computer owned and operated by the people. Let's keep costs down close to zero. Let's talk about IPv4 and IPv6. Let's think inside and outside the box. After a couple of weeks this thread will be moved to the forum and a new thread will be posed to help the group move forward with either more creative thought or creative action. Right now we are searching to understand each of our specialized knowledge as a group. +


+ +

Diagrams

+ +
+ quadrivium: Truth, Freedom, Harmony, Love feeding a permacomputer +
the quadrivium: four values, one permacomputer
+
+ +
+ The Trivium: inputs, process, outputs with feedback loop +
the universal logic: inputs, process, outputs
+
+ +
+ Code as seeds: open source sprouting across languages and distribution networks +
seeds to sprout on any abandoned technology
+
+ +
+ Permacomputer properties mapped to the four quadrivium values +
technological properties organized by quadrivium value
+
+ +
+ +Action Items + +

So in comments below, perhaps we talk about existing technologies both centralized & distributed computing stacks. Let's talk about bittorrent. Let's talk about game changing Cloudflare R2 (AWS S3 compatible object store). Let's talk about "pirate" peer-to-peer distribution networks of 1990's & 2000's. Let's talk cryptography. Let's talk crypto currencies. Let's talk about how to build a distributed & permanent computer owned & operated by people. Let's keep costs down close to zero. Let's talk about IPv4 & IPv6. Let's think inside & outside every box. After a couple of weeks this thread will move to a forum & a new thread will get posed to help a group move forward with either more creative thought or creative action. Right now we search to understand each of our specialized knowledge as a group.

-We will set up a matrix server for the people who work better via async, instant messages, or chat. All channels on matrix will be encrypted so if you are interested please install the Element client and get yourself familiar with it, the core team will likely use it. +We set up a discord server for people who work better via async, instant messages, or chat. If you feel interested please install a client & get yourself familiar with it, a core team will likely use it. +

+ +

+Grab an invite here, while supplies last! +

+ +

+https://discord.gg/TZPmQdPj8a

If you're here to show support or volunteer, thank you, reach out however you like! -I will post videos here before other platforms and plan to move all my content under this domain free from advertisements or tracking! Thank you all for your support and for visiting this link, you are very early but I'm rushing to get everything ready for many great minds to share with each other. +I will post videos, art, & poety, music, & short stories over on media.unturf.com before other platforms & i plan to move all my content under this domain free from advertisements or tracking! + +Thank you all for your support & for visiting, you are very early but I'm rushing to get everything ready for many great minds to share with each other! <3

-Please feel free to express yourself (more than normal social media, this is the real Internet after all), but try not to offend. When in doubt aim for Truth, Freedom, and Love in your interactions on this forum. +Please feel free to express yourself (more than normal social media, this runs on real Internet after all), but try not to offend. When in doubt aim for Truth, Freedom, Harmony, & Love in your interactions on this domain.

-

For more details about the type of discourse which is acceptable, check out this short essay:

+

For more details about what type of discourse stays acceptable, check out this short essay:

+ + + + + +american_way +THE AMERICAN WAY OF LIFE +every convenience leaves a scar + + +morning + +MORNING +plastic toothbrush Β· plastic tube of toothpaste +plastic shampoo bottle Β· plastic razor +plastic deodorant stick + + + +breakfast + +BREAKFAST +plastic milk jug Β· plastic cereal liner +plastic yogurt cup Β· plastic straw +plastic wrapped cheese Β· styrofoam cup + + + +morning->breakfast + + + + + +commute + +COMMUTE +plastic dashboard Β· plastic steering wheel +nylon carpet Β· synthetic seats +plastic gas station coffee lid + + + +breakfast->commute + + + + + +work + +WORK +plastic keyboard Β· plastic monitor +plastic pen Β· plastic binder +plastic lunch container Β· plastic fork + + + +commute->work + + + + + +shopping + +SHOPPING +plastic bags Β· plastic wrapped produce +plastic blister packs Β· plastic hangers +shrink wrap Β· styrofoam trays + + + +work->shopping + + + + + +dinner + +DINNER +plastic cutting board Β· plastic wrap +plastic squeeze bottles Β· teflon pans +plastic takeout containers + + + +shopping->dinner + + + + + +evening + +EVENING +plastic TV remote Β· polyester clothing +plastic phone case Β· plastic charger +nylon bedsheets Β· plastic mattress wrap + + + +dinner->evening + + + + + +trash + +DAILY OUTPUT: 4.4 lbs waste per person +300 million Americans Γ— 365 days += 481 BILLION lbs per year +recycling rate: 5-6% + + + +evening->trash + + + + + +body + +INSIDE YOUR BODY +microplastics in blood, lungs, placenta, brain +estimated intake: 1 credit card per week +endocrine disruptors in every sample tested + + + +trash->body + + +the plastic +comes home + + + +body->morning + + +wake up +do it again + + + diff --git a/single-use-plastics/img/broken-cycle.dot b/single-use-plastics/img/broken-cycle.dot new file mode 100644 index 0000000..83333e3 --- /dev/null +++ b/single-use-plastics/img/broken-cycle.dot @@ -0,0 +1,89 @@ +digraph broken_cycle { + bgcolor="transparent" + rankdir=LR + pad=0.5 + nodesep=1.0 + ranksep=1.2 + + node [ + fontname="Helvetica" + fontsize=12 + style="filled" + penwidth=2 + shape=box + width=2.0 + height=0.9 + ] + + edge [ + fontname="Helvetica" + fontsize=10 + penwidth=3 + ] + + label="THE BROKEN CYCLE\ninputs without outputs" + labelloc=t + fontname="Helvetica" + fontsize=16 + fontcolor="#C62828" + + petroleum [ + label="PETROLEUM\n\nextracted from\n100 million year\nold deposits" + fillcolor="#37474F" + fontcolor="white" + color="#263238" + ] + + plastic [ + label="SINGLE-USE\nPLASTIC\n\nused for minutes\nexists for centuries" + fillcolor="#F44336" + fontcolor="white" + color="#B71C1C" + penwidth=4 + ] + + landfill [ + label="LANDFILL\nOCEAN\nSOIL\n\nno output\nno return\nno cycle" + fillcolor="#4E342E" + fontcolor="white" + color="#3E2723" + ] + + nowhere [ + label="?\n\nno process exists\nto return this\nto the earth" + shape=circle + fillcolor="#B71C1C" + fontcolor="white" + color="#7f0000" + width=1.8 + fixedsize=true + ] + + petroleum -> plastic [ + label="extract\nrefine\nmold" + color="#F44336" + fontcolor="#C62828" + ] + + plastic -> landfill [ + label="use once\ndiscard" + color="#F44336" + fontcolor="#C62828" + ] + + landfill -> nowhere [ + label="no path back\n400-1000 years\nto degrade" + color="#B71C1C" + fontcolor="#7f0000" + ] + + // The missing return arrow + nowhere -> petroleum [ + label="THIS ARROW\nDOES NOT EXIST" + color="#B71C1C" + fontcolor="#7f0000" + style=dashed + penwidth=1 + constraint=false + ] +} diff --git a/single-use-plastics/img/broken-cycle.png b/single-use-plastics/img/broken-cycle.png new file mode 100644 index 0000000..90be11d Binary files /dev/null and b/single-use-plastics/img/broken-cycle.png differ diff --git a/single-use-plastics/img/broken-cycle.svg b/single-use-plastics/img/broken-cycle.svg new file mode 100644 index 0000000..585eed0 --- /dev/null +++ b/single-use-plastics/img/broken-cycle.svg @@ -0,0 +1,86 @@ + + + + + + +broken_cycle +THE BROKEN CYCLE +inputs without outputs + + +petroleum + +PETROLEUM +extracted from +100 million year +old deposits + + + +plastic + +SINGLE-USE +PLASTIC +used for minutes +exists for centuries + + + +petroleum->plastic + + +extract +refine +mold + + + +landfill + +LANDFILL +OCEAN +SOIL +no output +no return +no cycle + + + +plastic->landfill + + +use once +discard + + + +nowhere + +? +no process exists +to return this +to the earth + + + +landfill->nowhere + + +no path back +400-1000 years +to degrade + + + +nowhere->petroleum + + +THIS ARROW +DOES NOT EXIST + + + diff --git a/single-use-plastics/img/engineer-without.dot b/single-use-plastics/img/engineer-without.dot new file mode 100644 index 0000000..3feff76 --- /dev/null +++ b/single-use-plastics/img/engineer-without.dot @@ -0,0 +1,90 @@ +digraph engineer_without { + bgcolor="transparent" + rankdir=TB + pad=0.5 + nodesep=0.5 + ranksep=0.8 + + node [ + fontname="Helvetica" + fontsize=11 + style="filled" + penwidth=2 + shape=box + width=2.6 + height=0.7 + ] + + edge [ + fontname="Helvetica" + fontsize=9 + penwidth=2 + ] + + label="ENGINEER WITHOUT\nreplace every single-use plastic with something that cycles" + labelloc=t + fontname="Helvetica" + fontsize=16 + fontcolor="#2E7D32" + + // Categories of replacement + subgraph cluster_food { + label="FOOD & DRINK" + fontname="Helvetica" + fontsize=12 + fontcolor="#2E7D32" + style="rounded,filled" + color="#4CAF50" + fillcolor="#E8F5E9" + + glass [label="glass bottles & jars\nreturn Β· refill Β· reuse forever" fillcolor="#C8E6C9" color="#4CAF50" fontcolor="#1B5E20"] + steel [label="stainless steel containers\nlunchbox Β· thermos Β· canteen" fillcolor="#C8E6C9" color="#4CAF50" fontcolor="#1B5E20"] + beeswax [label="beeswax wraps\nreplace plastic wrap Β· compostable" fillcolor="#C8E6C9" color="#4CAF50" fontcolor="#1B5E20"] + cotton_bag [label="cotton & hemp bags\nreplace plastic bags Β· last years" fillcolor="#C8E6C9" color="#4CAF50" fontcolor="#1B5E20"] + wooden [label="wooden utensils\nreplace plastic forks Β· compostable" fillcolor="#C8E6C9" color="#4CAF50" fontcolor="#1B5E20"] + } + + subgraph cluster_body { + label="BODY & HOME" + fontname="Helvetica" + fontsize=12 + fontcolor="#1565C0" + style="rounded,filled" + color="#2196F3" + fillcolor="#E3F2FD" + + bamboo [label="bamboo toothbrush\nreplace plastic Β· compostable" fillcolor="#BBDEFB" color="#2196F3" fontcolor="#0D47A1"] + bar_soap [label="bar soap & shampoo bars\nreplace plastic bottles entirely" fillcolor="#BBDEFB" color="#2196F3" fontcolor="#0D47A1"] + safety_razor [label="safety razor Β· cast iron pan\nmetal lasts generations" fillcolor="#BBDEFB" color="#2196F3" fontcolor="#0D47A1"] + wool [label="wool Β· linen Β· cotton Β· hemp\nreplace polyester Β· nylon Β· acrylic" fillcolor="#BBDEFB" color="#2196F3" fontcolor="#0D47A1"] + paper [label="paper & cardboard packaging\nreplace blister packs Β· shrink wrap" fillcolor="#BBDEFB" color="#2196F3" fontcolor="#0D47A1"] + } + + subgraph cluster_infra { + label="INFRASTRUCTURE" + fontname="Helvetica" + fontsize=12 + fontcolor="#E65100" + style="rounded,filled" + color="#FF9800" + fillcolor="#FFF3E0" + + bulk [label="bulk refill stations\nreplace single-serve everything" fillcolor="#FFE0B2" color="#FF9800" fontcolor="#E65100"] + local [label="local food systems\nfarmers market Β· CSA Β· garden\nno packaging needed" fillcolor="#FFE0B2" color="#FF9800" fontcolor="#E65100"] + deposit [label="deposit return systems\nbottle returns Β· container libraries" fillcolor="#FFE0B2" color="#FF9800" fontcolor="#E65100"] + repair [label="repair culture\nfix what breaks Β· share tools\nreject disposable everything" fillcolor="#FFE0B2" color="#FF9800" fontcolor="#E65100"] + } + + // The principle + principle [ + label="THE PRINCIPLE\n\nif it cannot cycle back to the earth\ndo not make it Β· do not buy it Β· do not use it" + fillcolor="#263238" + fontcolor="#CDDC39" + color="#CDDC39" + penwidth=3 + ] + + glass -> principle [color="#4CAF50" style=dashed] + bamboo -> principle [color="#2196F3" style=dashed] + bulk -> principle [color="#FF9800" style=dashed] +} diff --git a/single-use-plastics/img/engineer-without.png b/single-use-plastics/img/engineer-without.png new file mode 100644 index 0000000..4cafbc3 Binary files /dev/null and b/single-use-plastics/img/engineer-without.png differ diff --git a/single-use-plastics/img/engineer-without.svg b/single-use-plastics/img/engineer-without.svg new file mode 100644 index 0000000..33fc322 --- /dev/null +++ b/single-use-plastics/img/engineer-without.svg @@ -0,0 +1,155 @@ + + + + + + +engineer_without +ENGINEER WITHOUT +replace every single-use plastic with something that cycles + +cluster_food + +FOOD & DRINK + + +cluster_body + +BODY & HOME + + +cluster_infra + +INFRASTRUCTURE + + + +glass + +glass bottles & jars +return Β· refill Β· reuse forever + + + +principle + +THE PRINCIPLE +if it cannot cycle back to the earth +do not make it Β· do not buy it Β· do not use it + + + +glass->principle + + + + + +steel + +stainless steel containers +lunchbox Β· thermos Β· canteen + + + +beeswax + +beeswax wraps +replace plastic wrap Β· compostable + + + +cotton_bag + +cotton & hemp bags +replace plastic bags Β· last years + + + +wooden + +wooden utensils +replace plastic forks Β· compostable + + + +bamboo + +bamboo toothbrush +replace plastic Β· compostable + + + +bamboo->principle + + + + + +bar_soap + +bar soap & shampoo bars +replace plastic bottles entirely + + + +safety_razor + +safety razor Β· cast iron pan +metal lasts generations + + + +wool + +wool Β· linen Β· cotton Β· hemp +replace polyester Β· nylon Β· acrylic + + + +paper + +paper & cardboard packaging +replace blister packs Β· shrink wrap + + + +bulk + +bulk refill stations +replace single-serve everything + + + +bulk->principle + + + + + +local + +local food systems +farmers market Β· CSA Β· garden +no packaging needed + + + +deposit + +deposit return systems +bottle returns Β· container libraries + + + +repair + +repair culture +fix what breaks Β· share tools +reject disposable everything + + + diff --git a/single-use-plastics/img/harmony-test.dot b/single-use-plastics/img/harmony-test.dot new file mode 100644 index 0000000..0fee53a --- /dev/null +++ b/single-use-plastics/img/harmony-test.dot @@ -0,0 +1,92 @@ +digraph harmony_test { + bgcolor="transparent" + rankdir=TB + pad=0.5 + nodesep=0.8 + ranksep=0.9 + + node [ + fontname="Helvetica" + fontsize=12 + style="filled" + penwidth=2 + shape=box + width=2.4 + height=0.8 + ] + + edge [ + fontname="Helvetica" + fontsize=10 + penwidth=2.5 + ] + + // Harmony definition + harmony [ + label="HARMONY TEST\n\na system in harmony has\nappropriate inputs for all outputs" + shape=doublecircle + fillcolor="#263238" + fontcolor="#CDDC39" + color="#CDDC39" + fontsize=11 + width=2.6 + fixedsize=true + ] + + // Natural system passes + subgraph cluster_pass { + label="PASSES: a tree" + fontname="Helvetica" + fontsize=13 + fontcolor="#2E7D32" + style="rounded,filled" + color="#4CAF50" + fillcolor="#E8F5E9" + + sun [label="sunlight" fillcolor="#C8E6C9" color="#4CAF50" fontcolor="#1B5E20"] + water [label="water + minerals" fillcolor="#C8E6C9" color="#4CAF50" fontcolor="#1B5E20"] + co2 [label="CO2" fillcolor="#C8E6C9" color="#4CAF50" fontcolor="#1B5E20"] + tree [label="TREE" fillcolor="#4CAF50" fontcolor="white" color="#2E7D32" shape=ellipse] + oxygen [label="oxygen" fillcolor="#C8E6C9" color="#4CAF50" fontcolor="#1B5E20"] + fruit [label="fruit + wood" fillcolor="#C8E6C9" color="#4CAF50" fontcolor="#1B5E20"] + soil [label="leaf litter β†’ soil" fillcolor="#C8E6C9" color="#4CAF50" fontcolor="#1B5E20"] + + sun -> tree [color="#4CAF50"] + water -> tree [color="#4CAF50"] + co2 -> tree [color="#4CAF50"] + tree -> oxygen [color="#4CAF50"] + tree -> fruit [color="#4CAF50"] + tree -> soil [color="#4CAF50"] + soil -> water [color="#4CAF50" style=dashed label="cycle\ncloses" fontcolor="#2E7D32" fontsize=9] + } + + // Plastic fails + subgraph cluster_fail { + label="FAILS: a plastic bottle" + fontname="Helvetica" + fontsize=13 + fontcolor="#C62828" + style="rounded,filled" + color="#F44336" + fillcolor="#FFEBEE" + + oil [label="crude oil" fillcolor="#FFCDD2" color="#F44336" fontcolor="#B71C1C"] + energy [label="fossil energy" fillcolor="#FFCDD2" color="#F44336" fontcolor="#B71C1C"] + chemicals [label="industrial chemicals" fillcolor="#FFCDD2" color="#F44336" fontcolor="#B71C1C"] + bottle [label="PLASTIC BOTTLE" fillcolor="#F44336" fontcolor="white" color="#B71C1C" shape=ellipse] + waste [label="landfill forever" fillcolor="#FFCDD2" color="#F44336" fontcolor="#B71C1C"] + microplastic [label="microplastics\nin blood, water, soil" fillcolor="#FFCDD2" color="#F44336" fontcolor="#B71C1C"] + co2out [label="CO2 emissions" fillcolor="#FFCDD2" color="#F44336" fontcolor="#B71C1C"] + + oil -> bottle [color="#F44336"] + energy -> bottle [color="#F44336"] + chemicals -> bottle [color="#F44336"] + bottle -> waste [color="#F44336"] + bottle -> microplastic [color="#F44336"] + bottle -> co2out [color="#F44336"] + waste -> oil [color="#B71C1C" style=dashed label="cycle\nbroken" fontcolor="#B71C1C" fontsize=9] + } + + harmony -> sun [style=invis] + harmony -> oil [style=invis] +} diff --git a/single-use-plastics/img/harmony-test.png b/single-use-plastics/img/harmony-test.png new file mode 100644 index 0000000..f0dbed2 Binary files /dev/null and b/single-use-plastics/img/harmony-test.png differ diff --git a/single-use-plastics/img/harmony-test.svg b/single-use-plastics/img/harmony-test.svg new file mode 100644 index 0000000..9e48ada --- /dev/null +++ b/single-use-plastics/img/harmony-test.svg @@ -0,0 +1,206 @@ + + + + + + +harmony_test + +cluster_pass + +PASSES: a tree + + +cluster_fail + +FAILS: a plastic bottle + + + +harmony + + +HARMONY TEST +a system in harmony has +appropriate inputs for all outputs + + + +sun + +sunlight + + + + +oil + +crude oil + + + + +tree + +TREE + + + +sun->tree + + + + + +water + +water + minerals + + + +water->tree + + + + + +co2 + +CO2 + + + +co2->tree + + + + + +oxygen + +oxygen + + + +tree->oxygen + + + + + +fruit + +fruit + wood + + + +tree->fruit + + + + + +soil + +leaf litter β†’ soil + + + +tree->soil + + + + + +soil->water + + +cycle +closes + + + +bottle + +PLASTIC BOTTLE + + + +oil->bottle + + + + + +energy + +fossil energy + + + +energy->bottle + + + + + +chemicals + +industrial chemicals + + + +chemicals->bottle + + + + + +waste + +landfill forever + + + +bottle->waste + + + + + +microplastic + +microplastics +in blood, water, soil + + + +bottle->microplastic + + + + + +co2out + +CO2 emissions + + + +bottle->co2out + + + + + +waste->oil + + +cycle +broken + + + diff --git a/single-use-plastics/img/recycling-lie.dot b/single-use-plastics/img/recycling-lie.dot new file mode 100644 index 0000000..fa4ac6e --- /dev/null +++ b/single-use-plastics/img/recycling-lie.dot @@ -0,0 +1,81 @@ +digraph recycling_lie { + bgcolor="transparent" + rankdir=TB + pad=0.5 + nodesep=0.6 + ranksep=0.8 + + node [ + fontname="Helvetica" + fontsize=11 + style="filled" + penwidth=2 + shape=box + width=2.6 + height=0.7 + ] + + edge [ + fontname="Helvetica" + fontsize=9 + penwidth=2 + ] + + label="THE RECYCLING LIE\nthe symbol was designed by the petroleum industry" + labelloc=t + fontname="Helvetica" + fontsize=16 + fontcolor="#C62828" + + // What they told you + subgraph cluster_promise { + label="WHAT THEY PROMISED" + fontname="Helvetica" + fontsize=12 + fontcolor="#1565C0" + style="rounded,filled" + color="#2196F3" + fillcolor="#E3F2FD" + + buy [label="buy plastic products" fillcolor="#BBDEFB" color="#2196F3" fontcolor="#0D47A1"] + sort [label="sort into recycling bin" fillcolor="#BBDEFB" color="#2196F3" fontcolor="#0D47A1"] + recycle [label="recycled into new products" fillcolor="#BBDEFB" color="#2196F3" fontcolor="#0D47A1"] + circle [label="circular economy" fillcolor="#BBDEFB" color="#2196F3" fontcolor="#0D47A1"] + + buy -> sort -> recycle -> circle [color="#2196F3"] + circle -> buy [color="#2196F3" style=dashed] + } + + // What actually happens + subgraph cluster_reality { + label="WHAT ACTUALLY HAPPENS" + fontname="Helvetica" + fontsize=12 + fontcolor="#C62828" + style="rounded,filled" + color="#F44336" + fillcolor="#FFEBEE" + + buy2 [label="buy plastic products" fillcolor="#FFCDD2" color="#F44336" fontcolor="#B71C1C"] + sort2 [label="sort into recycling bin\n(feel good about yourself)" fillcolor="#FFCDD2" color="#F44336" fontcolor="#B71C1C"] + ship [label="shipped to Southeast Asia\nor dumped in local landfill" fillcolor="#FFCDD2" color="#F44336" fontcolor="#B71C1C"] + burn_dump [label="burned in open air\nor dumped in rivers\npoisoning communities" fillcolor="#F44336" fontcolor="white" color="#B71C1C"] + ocean [label="8-12 million tons enter\noceans every year" fillcolor="#B71C1C" fontcolor="white" color="#7f0000"] + + buy2 -> sort2 -> ship -> burn_dump -> ocean [color="#F44336"] + } + + // The numbers + numbers [ + label="THE NUMBERS\n\n8.7 billion tons produced total\n6.3 billion tons became waste\n9% recycled Β· 12% incinerated Β· 79% landfill or environment\nrecycling was never the plan Β· selling plastic was the plan" + fillcolor="#263238" + fontcolor="#CDDC39" + color="#CDDC39" + penwidth=3 + width=3.4 + height=1.2 + ] + + circle -> numbers [style=invis] + ocean -> numbers [color="#B71C1C" label="where it\nactually goes" fontcolor="#7f0000"] +} diff --git a/single-use-plastics/img/recycling-lie.png b/single-use-plastics/img/recycling-lie.png new file mode 100644 index 0000000..4230961 Binary files /dev/null and b/single-use-plastics/img/recycling-lie.png differ diff --git a/single-use-plastics/img/recycling-lie.svg b/single-use-plastics/img/recycling-lie.svg new file mode 100644 index 0000000..2e3439f --- /dev/null +++ b/single-use-plastics/img/recycling-lie.svg @@ -0,0 +1,150 @@ + + + + + + +recycling_lie +THE RECYCLING LIE +the symbol was designed by the petroleum industry + +cluster_promise + +WHAT THEY PROMISED + + +cluster_reality + +WHAT ACTUALLY HAPPENS + + + +buy + +buy plastic products + + + +sort + +sort into recycling bin + + + +buy->sort + + + + + +recycle + +recycled into new products + + + +sort->recycle + + + + + +circle + +circular economy + + + +recycle->circle + + + + + +circle->buy + + + + + +numbers + +THE NUMBERS +8.7 billion tons produced total +6.3 billion tons became waste +9% recycled Β· 12% incinerated Β· 79% landfill or environment +recycling was never the plan Β· selling plastic was the plan + + + + +buy2 + +buy plastic products + + + +sort2 + +sort into recycling bin +(feel good about yourself) + + + +buy2->sort2 + + + + + +ship + +shipped to Southeast Asia +or dumped in local landfill + + + +sort2->ship + + + + + +burn_dump + +burned in open air +or dumped in rivers +poisoning communities + + + +ship->burn_dump + + + + + +ocean + +8-12 million tons enter +oceans every year + + + +burn_dump->ocean + + + + + +ocean->numbers + + +where it +actually goes + + + diff --git a/single-use-plastics/img/scale-of-problem.dot b/single-use-plastics/img/scale-of-problem.dot new file mode 100644 index 0000000..5cb3e2e --- /dev/null +++ b/single-use-plastics/img/scale-of-problem.dot @@ -0,0 +1,48 @@ +digraph scale { + bgcolor="transparent" + rankdir=TB + pad=0.5 + nodesep=0.3 + ranksep=0.5 + + node [ + fontname="Helvetica" + fontsize=11 + style="filled" + penwidth=2 + shape=box + width=3.2 + height=0.6 + ] + + edge [ + penwidth=2 + color="#F44336" + arrowsize=0.8 + ] + + label="THE SCALE\n1950 to now" + labelloc=t + fontname="Helvetica" + fontsize=16 + fontcolor="#C62828" + + a [label="1950: 2 million tons of plastic produced per year" fillcolor="#FFCDD2" color="#F44336" fontcolor="#B71C1C"] + b [label="1970: 35 million tons Β· Great Pacific Garbage Patch begins forming" fillcolor="#FFCDD2" color="#F44336" fontcolor="#B71C1C"] + c [label="1990: 120 million tons Β· recycling symbol added to deceive consumers" fillcolor="#EF9A9A" color="#F44336" fontcolor="#B71C1C"] + d [label="2000: 213 million tons Β· microplastics found in human blood" fillcolor="#EF9A9A" color="#F44336" fontcolor="#B71C1C"] + e [label="2010: 334 million tons Β· ocean plastic outweighs all fish by 2050 trajectory" fillcolor="#E57373" color="#D32F2F" fontcolor="#B71C1C"] + f [label="2020: 400+ million tons Β· plastic found in placentas, lungs, brains" fillcolor="#EF5350" color="#C62828" fontcolor="white"] + g [label="2024: 450+ million tons Β· less than 6% ever recycled Β· the rest is forever" fillcolor="#F44336" color="#B71C1C" fontcolor="white"] + + total [ + label="CUMULATIVE: 10+ BILLION TONS PRODUCED SINCE 1950\n\n8.3 billion tons remain on earth as waste\nthe planet had zero synthetic plastic before 1907\nevery piece ever made still exists somewhere" + fillcolor="#B71C1C" + fontcolor="white" + color="#7f0000" + penwidth=4 + height=1.2 + ] + + a -> b -> c -> d -> e -> f -> g -> total +} diff --git a/single-use-plastics/img/scale-of-problem.png b/single-use-plastics/img/scale-of-problem.png new file mode 100644 index 0000000..1916f6f Binary files /dev/null and b/single-use-plastics/img/scale-of-problem.png differ diff --git a/single-use-plastics/img/scale-of-problem.svg b/single-use-plastics/img/scale-of-problem.svg new file mode 100644 index 0000000..672593f --- /dev/null +++ b/single-use-plastics/img/scale-of-problem.svg @@ -0,0 +1,107 @@ + + + + + + +scale +THE SCALE +1950 to now + + +a + +1950: 2 million tons of plastic produced per year + + + +b + +1970: 35 million tons Β· Great Pacific Garbage Patch begins forming + + + +a->b + + + + + +c + +1990: 120 million tons Β· recycling symbol added to deceive consumers + + + +b->c + + + + + +d + +2000: 213 million tons Β· microplastics found in human blood + + + +c->d + + + + + +e + +2010: 334 million tons Β· ocean plastic outweighs all fish by 2050 trajectory + + + +d->e + + + + + +f + +2020: 400+ million tons Β· plastic found in placentas, lungs, brains + + + +e->f + + + + + +g + +2024: 450+ million tons Β· less than 6% ever recycled Β· the rest is forever + + + +f->g + + + + + +total + +CUMULATIVE: 10+ BILLION TONS PRODUCED SINCE 1950 +8.3 billion tons remain on earth as waste +the planet had zero synthetic plastic before 1907 +every piece ever made still exists somewhere + + + +g->total + + + + + diff --git a/single-use-plastics/img/thermal-recovery.dot b/single-use-plastics/img/thermal-recovery.dot new file mode 100644 index 0000000..c95ffb5 --- /dev/null +++ b/single-use-plastics/img/thermal-recovery.dot @@ -0,0 +1,125 @@ +digraph thermal_recovery { + bgcolor="transparent" + rankdir=LR + pad=0.5 + nodesep=0.8 + ranksep=1.0 + + node [ + fontname="Helvetica" + fontsize=12 + style="filled" + penwidth=2 + shape=box + width=2.0 + height=0.9 + ] + + edge [ + fontname="Helvetica" + fontsize=10 + penwidth=3 + ] + + label="THERMAL RECOVERY\nburn the sin, fully combust the gases" + labelloc=t + fontname="Helvetica" + fontsize=16 + fontcolor="#E65100" + + waste_plastic [ + label="NON-RECYCLABLE\nPLASTIC\n\ndegraded Β· contaminated\nmixed Β· single-use" + fillcolor="#F44336" + fontcolor="white" + color="#B71C1C" + ] + + combustion [ + label="PRIMARY\nCOMBUSTION\n\nhigh temperature\ncontrolled burn" + fillcolor="#FF9800" + fontcolor="white" + color="#E65100" + shape=diamond + width=2.2 + height=1.4 + ] + + secondary [ + label="SECONDARY\nCOMBUSTION\n\nfully burn sin gases\ndioxins Β· furans\nfluorine Β· chlorine" + fillcolor="#FF5722" + fontcolor="white" + color="#BF360C" + shape=diamond + width=2.2 + height=1.4 + ] + + // Outputs + heat [ + label="THERMAL\nENERGY\n\nheating Β· electricity\ngreenhouse Β· workshop" + fillcolor="#4CAF50" + fontcolor="white" + color="#2E7D32" + ] + + ash [ + label="INERT ASH\n\nmineral content\nreturns to earth\ncycle closes" + fillcolor="#795548" + fontcolor="white" + color="#4E342E" + ] + + clean_exhaust [ + label="CLEAN\nEXHAUST\n\nCO2 + H2O\nmonitored\nfiltered" + fillcolor="#90A4AE" + fontcolor="white" + color="#546E7A" + ] + + waste_plastic -> combustion [ + label="petroleum energy\nlocked inside" + color="#FF9800" + fontcolor="#E65100" + ] + + combustion -> secondary [ + label="sin gases\nmust not escape" + color="#FF5722" + fontcolor="#BF360C" + ] + + combustion -> heat [ + label="capture\nheat" + color="#4CAF50" + fontcolor="#2E7D32" + ] + + secondary -> clean_exhaust [ + label="fully\ncombust" + color="#4CAF50" + fontcolor="#2E7D32" + ] + + secondary -> ash [ + label="mineral\nresidue" + color="#795548" + fontcolor="#4E342E" + ] + + // vs just dumping + dump [ + label="ALTERNATIVE:\ndo nothing\n\nlandfill 1000 years\nmicroplastics forever\npoison groundwater" + fillcolor="#B71C1C" + fontcolor="white" + color="#7f0000" + style="filled,dashed" + ] + + waste_plastic -> dump [ + label="the current\n'plan'" + color="#B71C1C" + fontcolor="#7f0000" + style=dashed + penwidth=1.5 + ] +} diff --git a/single-use-plastics/img/thermal-recovery.png b/single-use-plastics/img/thermal-recovery.png new file mode 100644 index 0000000..1790a99 Binary files /dev/null and b/single-use-plastics/img/thermal-recovery.png differ diff --git a/single-use-plastics/img/thermal-recovery.svg b/single-use-plastics/img/thermal-recovery.svg new file mode 100644 index 0000000..bc70e68 --- /dev/null +++ b/single-use-plastics/img/thermal-recovery.svg @@ -0,0 +1,128 @@ + + + + + + +thermal_recovery +THERMAL RECOVERY +burn the sin, fully combust the gases + + +waste_plastic + +NON-RECYCLABLE +PLASTIC +degraded Β· contaminated +mixed Β· single-use + + + +combustion + +PRIMARY +COMBUSTION +high temperature +controlled burn + + + +waste_plastic->combustion + + +petroleum energy +locked inside + + + +dump + +ALTERNATIVE: +do nothing +landfill 1000 years +microplastics forever +poison groundwater + + + +waste_plastic->dump + + +the current +'plan' + + + +secondary + +SECONDARY +COMBUSTION +fully burn sin gases +dioxins Β· furans +fluorine Β· chlorine + + + +combustion->secondary + + +sin gases +must not escape + + + +heat + +THERMAL +ENERGY +heating Β· electricity +greenhouse Β· workshop + + + +combustion->heat + + +capture +heat + + + +ash + +INERT ASH +mineral content +returns to earth +cycle closes + + + +secondary->ash + + +mineral +residue + + + +clean_exhaust + +CLEAN +EXHAUST +CO2 + H2O +monitored +filtered + + + +secondary->clean_exhaust + + +fully +combust + + + diff --git a/single-use-plastics/index.html b/single-use-plastics/index.html new file mode 100644 index 0000000..0de8eb2 --- /dev/null +++ b/single-use-plastics/index.html @@ -0,0 +1,211 @@ + + + + single-use plastics — unturf. + + + + + + + + + +
+ +

unturf.

+

grow food not lawn

+ + +

Single-Use Plastics

+ +

+unturf. rejects single-use plastics. +

+ +

+A system in harmony has appropriate inputs for all of its outputs. Single-use plastic fails this test absolutely. Input draws from petroleum deposits laid down over a hundred million years. Output persists for a thousand years in landfill, or forever as microplastics in soil, water, & blood.[11] No process exists to close this cycle. No return arrow exists from output back to input. +

+ +
+ The broken cycle: petroleum to plastic to landfill to nowhere +
inputs without outputs. the return arrow does not exist.
+
+ + + + + +

Harmony Test

+ +

+A permacomputer manifesto defines harmony: a system in harmony has appropriate inputs for all of its outputs. Very little waste or pollution during operation. Apply this test to a tree & to a plastic bottle. One passes. One fails. +

+ +
+ A tree passes the harmony test, a plastic bottle fails +
a tree cycles everything. a plastic bottle cycles nothing.
+
+ +

+A tree takes sunlight, water, & CO2. It produces oxygen, fruit, wood, & leaf litter that becomes soil that feeds the water table that feeds the tree. Every output becomes an input. The cycle closes. A plastic bottle takes crude oil, fossil energy, & industrial chemicals. It produces landfill waste, microplastics, & CO2 emissions. No output becomes an input. The cycle breaks. +

+ + + + + +

Scale

+ +

+Before 1907, zero synthetic plastic existed on earth.[1] In one human lifetime, petroleum industry produced over ten billion tons.[2] Every piece ever manufactured still exists somewhere.[3] +

+ +
+ Timeline of plastic production from 2 million tons in 1950 to 450+ million tons today +
from zero to ten billion tons in one century.[4] every piece still here.
+
+ + + + + +

Recycling Lies

+ +

+A recycling symbol on plastic got placed there by petroleum industry.[5] Not to enable recycling. To enable selling. That symbol transfers guilt from producer to consumer. You sort your trash. You feel responsible. You believe a cycle closes. It does not. +

+ +
+ What recycling promised versus what actually happens +
9% recycled. 79% in landfill or environment. the symbol was a marketing campaign.
+
+ +

+Less than 6% of plastic produced in United States gets recycled.[6] Rest goes to landfill,[7] gets shipped overseas, gets burned in open air poisoning communities in Southeast Asia,[8] or enters oceans. Numbered resin codes (1 through 7) never functioned as recycling categories.[9] They served as material identification codes that industry knew consumers would confuse with recyclability. Confusion served as product. +

+ + + + + +

An American Way of Life

+ +

+An average American touches single-use plastic from waking until sleep. Plastic toothbrush, plastic shampoo bottle, plastic milk jug, plastic wrapped food, plastic dashboard, plastic keyboard, plastic takeout container, polyester clothes, plastic phone case. Every convenience leaves a scar that outlasts a person who used it by centuries. +

+ +
+ A day in the American life: plastic at every step, 4.4 lbs waste per person per day +
4.4 lbs of waste per person per day.[10] 300 million people. 365 days. do the math.
+
+ +

+Microplastics now appear in human blood,[11] lung tissue,[12] placentas,[13] & brain tissue.[14] Researchers estimate an average person ingests approximately one credit card worth of plastic per week through food, water, & air.[15] Endocrine disruptors leaching from plastics interfere with hormone systems across every species tested.[16] American life wrapped itself in plastic & plastic wrapped itself in us. +

+ + + + + +

unturf. Position

+ +

+Two actions. Not one. Both. +

+ +

+First: engineer ways to do without. Every single-use plastic has an alternative that cycles back to earth. Glass, steel, wood, cotton, hemp, beeswax, paper, bamboo. These materials existed before plastic. They will exist after. Engineering here runs on substitution not invention: replace convenient poison with durable remedy, at every point of contact, from morning to night. +

+ +
+ Replace every single-use plastic with materials that cycle +
if it cannot cycle back to the earth, do not make it, do not buy it, do not use it
+
+ +

+Second: use non-recyclable plastics as thermal feedstock. Plastic that already exists & cannot get recycled still contains petroleum energy locked in during manufacturing. Burn it. Capture heat for greenhouses, workshops, & electricity generation. But a burn must go complete. Sin gases from burning degraded plastic (dioxins, furans, chlorine compounds, fluorine compounds) must pass through secondary combustion at temperatures high enough to fully destroy them. Exhaust must get monitored & filtered. Burn sin. Do not release it. +

+ +
+ Thermal recovery: controlled combustion with secondary burn of sin gases +
primary combustion extracts heat. secondary combustion destroys the poison. the alternative is landfill forever.
+
+ +

+This differs from incineration as practiced by municipal waste systems that burn at low temperatures & release toxins. Engineered thermal recovery with complete combustion of all hazardous byproducts changes everything. Difference matters. One poisons communities. Another closes a loop on material that has no other exit. +

+ + + + + +

Principle

+ +

+A permacomputer operates in harmony. Inputs match outputs. Waste approaches zero. Single-use plastic violates every property of permanence. It extracts from deposits that took geological ages to form. It persists in forms that poison living systems. It pretends to recycle while accumulating. It breaks a cycle at every point. +

+ +

+unturf. grows systems of permanence. Plastic that cannot return to earth has no place in a permanent system. We engineer alternatives. We burn what remains. We fully combust sin. We close loops or we do not participate. +

+ +

+Grow food not lawn. Grow glass not plastic. Grow what cycles. +

+ +
+ +

Sources

+ +
+
    +
  1. Leo Baekeland patented Bakelite in 1907, first fully synthetic plastic. American Chemical Society, Bakelite: First Synthetic Plastic, National Historic Chemical Landmarks.
  2. + +
  3. Geyer, Jambeck & Law, "Production, use, & fate of all plastics ever made," Science Advances 3(7), July 2017. Documented 8.3 billion metric tons produced through 2015; production has continued accelerating past 450 million tons per year since.
  4. + +
  5. Most plastic ever produced persists in landfills or environment. Roughly 12% has reached incineration. Geyer et al. (2017) found 79% accumulated in landfills or natural environment, 12% incinerated, 9% recycled (most of which later reached landfill).
  6. + +
  7. OECD, Global Plastics Outlook, 2022. Production grew from 2 million tons in 1950 to 460 million tons in 2019, nearly doubling every 15 years.
  8. + +
  9. Documented in NPR/PBS Frontline investigation, "Plastic Wars" (March 2020). Society of Plastics Industry created resin identification codes in 1988, deliberately resembling recycling symbols.
  10. + +
  11. U.S. EPA, Advancing Sustainable Materials Management: Facts & Figures, 2018 data (published 2020). EPA reported 8.7% recycling rate; Greenpeace & Last Beach Cleanup reported 5-6% for 2021. Both confirm single-digit recycling rates.
  12. + +
  13. Geyer, Jambeck & Law, Science Advances 3(7), 2017. 79% of all plastic ever produced accumulated in landfills or natural environment.
  14. + +
  15. Basel Action Network & numerous investigations documented US & European plastic waste exports to China (until 2018 National Sword ban), then redirection to Malaysia, Vietnam, Philippines, Indonesia, & Thailand. BAN Plastic Waste Transparency Project.
  16. + +
  17. NPR, "How Big Oil Misled Public Into Believing Plastic Would Be Recycled" (September 2020). Internal industry documents showed companies knew most plastic could not get recycled economically.
  18. + +
  19. U.S. EPA, Municipal Solid Waste Generation, Recycling, & Disposal in United States: Facts & Figures. Average American generates 4.4 pounds of municipal solid waste per day.
  20. + +
  21. Leslie et al., "Discovery & quantification of plastic particle pollution in human blood," Environment International 163, May 2022. Found microplastics in 77% of blood samples tested.
  22. + +
  23. Jenner et al., "Detection of microplastics in human lung tissue using μFTIR spectroscopy," Science of Total Environment 831, July 2022.
  24. + +
  25. Ragusa et al., "Plasticenta: First evidence of microplastics in human placenta," Environment International 146, January 2021.
  26. + +
  27. Campen et al., University of New Mexico, 2024. Found microplastics in all brain tissue samples examined, with concentrations increasing over time. UNM Health Sciences Center.
  28. + +
  29. WWF International & University of Newcastle, Australia, "No Plastic in Nature: Assessing Plastic Ingestion from Nature to People," June 2019. Estimated ~5 grams per week through food, water, & air. Figure remains debated; other studies estimate lower amounts.
  30. + +
  31. Endocrine Society Scientific Statement, "Endocrine-Disrupting Chemicals," 2009 & 2015 updates. Documented effects of BPA, phthalates, & other plastic-derived chemicals on hormone systems across mammalian, aquatic, & amphibian species.
  32. +
+
+ +
+ +

← back to the manifesto

+ +
+ + + + + + + diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..ba84083 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,63 @@ + + + + https://www.unturf.com/let-us-define-a-permacomputer/ + 2026-03-31 + monthly + 1.0 + + + https://www.unturf.com/software/ + 2026-05-07 + weekly + 0.9 + + + https://www.unturf.com/eight-forms-of-capital/ + 2026-04-08 + monthly + 0.8 + + + https://www.unturf.com/hemp-bioplastic/ + 2026-02-27 + monthly + 0.8 + + + https://www.unturf.com/growing-systems-of-permanence/ + 2026-02-27 + monthly + 0.7 + + + https://www.unturf.com/single-use-plastics/ + 2026-02-27 + monthly + 0.7 + + + https://www.unturf.com/hemp-bioplastic/process/ + 2026-02-28 + monthly + 0.6 + + + https://www.unturf.com/hemp-bioplastic/process/homeschool/ + 2026-02-28 + monthly + 0.5 + + + https://www.unturf.com/moonlight-sonata/ + 2026-03-23 + yearly + 0.5 + + + https://www.unturf.com/styleguide/ + 2026-03-14 + monthly + 0.3 + + diff --git a/software/index.html b/software/index.html new file mode 100644 index 0000000..1294521 --- /dev/null +++ b/software/index.html @@ -0,0 +1,154 @@ + + + + + + unturf. software — open source projects + + + + + +
+
+

unturf.

+

free software so you may grow food not lawn

+
+ +
+ + + + +
+

uncloseai.

+

Free LLM & Text-to-Speech machine learning service powered by Hermes 3 (general purpose conversational automated intelligence) & Qwen 3 Coder 30B (specialized coding model). A drop-in replacement for OpenAI's API that requires no API key, making machine learning accessible to everyone. Supports both server-side & browser-based (uncloseai.js) implementations.

+

Mission: Machine learning for all, internet for all, open web for everyone.

+ +
+ +
+

+

Anonymous remote code, compile, & execution API for humans & machine learning agents. Write, generate, compile & execute code across 42+ programming languages in isolated containers. Returns code artifacts like binaries, images & more.

+ +
+ +
+

undefect.

+

Systematic defect research across open source. Catalogs structural defects replicated at scale, publishes patches upstream to fix them. Each MOAD (Mother of All Defects) names a class of defect found across hundreds of projects. All research, patches, & intel enter public domain.

+

Mission: Patch our planet. Every open source project scanned, patched, & disclosed makes shared infrastructure faster & cheaper for everyone.

+ +
+
+

+

NextJS session logger & todo tracker for machine learning agents. Ingests Claude Code, Fetch, & uncloseai JSONL sessions, extracts todos, & provides a dashboard to triage work across projects.

+ +
+ +
+

+

Web archival tool for digital preservation. Crawls domains, deduplicates content, captures screenshots, converts to markdown & creates self-extracting archives. Full-text search with intelligent metadata indexing & uncloseai.js integration.

+ +
+ +
+

arborist

+

An arborist for trees & forests of cross-linked information. Ingests documents into a content-addressed, Merkle-committed SQLite store, distills them into recursive cores, & answers questions over a corpus via an OpenAI-compatible LLM. Every cached answer carries a verifiable Merkle proof tying it back to source documents.

+

Mission: Merkle Providence Reverse RAG. Verifiable machine learning grounded in source.

+ +
+ + + + +
+ +
+ All source code donated into public domain.
Trademarks reserved: unturf., Remarkbox, Make Post Sell, uncloseai, unsandbox, neopig, unfirehose, undefect, arborist, unhomeschool, nuhomeschool.
+ +
+
+ + + diff --git a/styleguide/index.html b/styleguide/index.html new file mode 100644 index 0000000..851728d --- /dev/null +++ b/styleguide/index.html @@ -0,0 +1,481 @@ + + + + styleguide — unturf. + + + + + + + + + + +
+ +

unturf.

+

grow food not lawn

+ + +

Styleguide

+ +

+A living reference for every component, element, & pattern across unturf. pages. This page uses unturf.css layered on Pico CSS v2.0.6 (classless). What you see here matches what appears across all pages. +

+ + + + + +

1. Color Palette

+ +

Every color lives in a CSS custom property inside :root. Change a variable, change every page.

+ +

Brand

+
+ + --primary #43a047 +
+ +

Step Label

+
+ + --step-bg inherits --primary (#43a047) +
+
+ + --step-text #fff +
+ +

Callout Boxes

+
+ + --honest-border #F44336 (honest box) +
+
+ + --recipe-border #4CAF50 (recipe box) +
+
+ + --warning-border #FF9800 (warning box) +
+ +

Footnotes

+
+ + --footnote-link inherits --primary (#43a047) +
+
+ + --footnote-highlight-border inherits --primary (#43a047) +
+ +

Eight Forms of Capital

+
+ + --capital-living #4CAF50 +
+
+ + --capital-material #795548 +
+
+ + --capital-financial #607D8B +
+
+ + --capital-intellectual #2196F3 +
+
+ + --capital-experiential #009688 +
+
+ + --capital-social #FF9800 +
+
+ + --capital-cultural #9C27B0 +
+
+ + --capital-spiritual #E91E63 +
+ +
+ + + + + +

2. Typography

+ +

Pico CSS handles body text via system fonts. unturf. uses ChunkFive ('chunkfiveregular') for branding only.

+ +

Brand Font

+

unturf.class="unturf-brand"

+ +

Heading Hierarchy

+

<h1> stays reserved for the site logo. Content headings start at <h2>.

+

h2: Page Title

+

h3: Section Heading

+

h4: Subsection Heading

+ +

Text Styles

+

A regular paragraph of body text. Pico CSS provides the base font stack, line height, & color.

+

Bold text via <b> tag.

+

Italic text via <i> tag.

+

Inline code via <code> tag.

+

Small text via <small> tag, used for navigation & footer.

+ +

Blockquote

+
go-rusty-rails-jvm.js
+ +
+ + + + + +

3. Layout

+ +

Two layout widths exist. Apply one class to <main>. Pico CSS provides the centering & padding.

+ + + + + + + + + +
ClassMax WidthUsed On
.content-narrow460pxmanifesto
.content-wide960pxall other content pages
+ +
+ + + + + +

4. Navigation & Footer

+ +

Every content page shares a header & footer pattern. Current page link gets aria-current="page" for bold, reduced opacity styling.

+ +

Header Pattern

+
<center><a href="/"><h1 class="site-title">unturf.</h1></a></center>
+<center><h3>grow food not lawn</h3></center>
+<center class="nav-links"><small>
+  <a href="...">manifesto</a> &middot;
+  <a href="..." aria-current="page">current page</a> &middot;
+  <a href="...">other page</a>
+</small></center>
+ +

Footer Pattern

+
<footer>
+  <center><a href="/software/" class="unturf-brand">unturf. software</a></center>
+  <center>Russell Ballestrini | <span class="unturf-brand">unturf.</span> &copy; 2025</center>
+</footer>
+ +
+ + + + + +

5. Step Label

+ +

Progressive disclosure pattern. A numbered label introduces each section on multi-step pages.

+ +STEP 1 +

Example Section Title

+

Content follows a step label & heading pair.

+ +
<span class="step-label">STEP 1</span>
+<h3>Section Title</h3>
+ +
+ + + + + +

6. Callout Boxes

+ +

Three box types share the same structure (left border, padding, subtle background). Each carries a distinct color & purpose.

+ +
+ Honest box. Caveats, corrections, uncomfortable truths. Red border signals caution about claims or expectations. +
+ +
+ Recipe box. Procedures, instructions, actionable steps. Green border signals constructive action. +
+ +
+ Warning box. Safety notes, hazards, things that could cause harm. Orange border signals attention required. +
+ +
<div class="honest-box">
+  <b>Label.</b> Content here.
+</div>
+
+<div class="recipe-box">
+  <b>Label.</b> Content here.
+</div>
+
+<div class="warning-box">
+  <b>Label.</b> Content here.
+</div>
+ +
+ + + + + +

7. Capital Cards

+ +

Eight color coded cards for the eight forms of capital. Each variant sets a left border color & heading color via custom property.

+ +
+

Living Capital

+

Soil, water, plants, animals, ecosystems.

+
+ +
+

Material Capital

+

Stone, metal, timber, tools, servers, networks.

+
+ +
+

Financial Capital

+

Money, currencies, securities.

+
+ +
+

Intellectual Capital

+

Ideas, concepts, knowledge, open source code.

+
+ +
+

Experiential Capital

+

Embodied know-how built from lived experience.

+
+ + + +
+

Cultural Capital

+

Shared story, myth, song, art, ceremony, ethics.

+
+ +
+

Spiritual Capital

+

Karma, faith, presence, connection to a greater whole.

+
+ +
<div class="capital-card capital-card--living">
+  <h4>Living Capital</h4>
+  <p>Description here.</p>
+</div>
+ +

Variants: --living, --material, --financial, --intellectual, --experiential, --social, --cultural, --spiritual.

+ +
+ + + + + +

8. Diagram Figure

+ +

All diagrams wrap in <figure class="diagram">. Images scale to container width. Captions render small & gray.

+ +
+ Example diagram: eight forms of capital from foundation to emergence +
example caption: from living capital at the foundation to cultural capital as emergent community property
+
+ +
<figure class="diagram">
+  <img src="path/to/diagram.svg" alt="Description">
+  <figcaption>caption text</figcaption>
+</figure>
+ +
+ + + + + +

9. Footnotes

+ +

Inline superscript links point to numbered footnotes at the bottom of a page. Clicking a footnote number scrolls down. A back arrow scrolls up. Targeted footnotes highlight with a lime left border.[1]

+ +

Inline Pattern

+
<sup id="ref1"><a href="#fn1">[1]</a></sup>
+ +

Footnote Section

+
+
    +
  1. Example footnote demonstrating the pattern. Source title, Publication Name, date.
  2. +
+
+ +
<div class="footnotes">
+  <ol>
+    <li id="fn1">Source text. <a href="#ref1">&#8617;</a></li>
+  </ol>
+</div>
+ +
+ + + + + +

10. Tables

+ +

Pico CSS styles tables from semantic markup alone. No classes needed.

+ + + + + + + + + + + +
CapitalPermacomputer ExpressionQuadrivium Value
LivingDurable hardware, repair not replaceHarmony
IntellectualOpen source, public domain, seeds to sproutTruth
SocialBy people, for people, voluntaryFreedom
SpiritualLove as fuel, wu wei, homeostasisLove
+ +
+ + + + + +

11. Lists

+ +

Unordered

+
    +
  • Glass jars for storage
  • +
  • Steel water bottles
  • +
  • Cotton bags
  • +
  • Beeswax wraps
  • +
+ +

Ordered

+
    +
  1. Eliminate petroleum plastic
  2. +
  3. Grow hemp
  4. +
  5. Process cooperatively
  6. +
  7. Compost at end of life
  8. +
+ +
+ + + + + +

12. Horizontal Rule & Links

+ +

A horizontal rule (<hr>) separates major sections:

+ +
+ +

Links styled by Pico CSS: home, manifesto, external link.

+ +
+ + + + + +

13. Software Page Components

+ +

The software page uses a distinct layout. A class="software-page" on <html> scopes all its rules. These classes apply only on that page:

+ + + + + + + + + + + + + +
ClassPurpose
.software-pageRoot scope on <html>, triggers ChunkFive headings & layout rules
.projects-gridResponsive grid: 1 column mobile, 2 columns at 768px+
.logo-containerSubtle background box for project logos
.unsandbox-logoArialPixel font, gold color
.neopig-logoGradient text effect (pink/orange)
.project-uncloseaiSpans full width at desktop breakpoint
+ +
+ + + + + +

14. uncloseai. Widget

+ +

Every content page loads the uncloseai. chat widget via a single script tag. The widget provides free machine learning chat, page translation, & text to speech.

+ +

Embed Pattern

+
<script src="https://uncloseai.com/uncloseai.js" type="module"></script>
+ +

Place before </body>. The script injects a floating button (bottom right) that opens a chat modal. Translation & TTS features appear as controls inside the modal.

+ +

Behavior

+ + + + + + + + + +
FeatureTriggerNotes
ChatClick floating buttonPage context passed automatically
TranslateGlobe icon in modal controlsRenders translated page inline via iframe
Text to SpeechSpeaker icon in modal controlsMultiple voices, adjustable speed
+ +

CSS Isolation

+

The widget loads its own stylesheet (uncloseai-modal-pico.css on PicoCSS sites, uncloseai-modal-builtin.css elsewhere). All selectors scope to dialog#uncloseai-embedded-modal, dialog#translate-modal, or dialog#tts-modal to avoid leaking into host page styles.

+ +

Software Page Card

+

On the software page, .project-uncloseai spans full grid width at desktop breakpoints.

+ +
+ +

← back to the manifesto

+ +
+ + + + + + + diff --git a/zebra-report/fonts/chunkfive-regular-webfont.woff b/zebra-report/fonts/chunkfive-regular-webfont.woff new file mode 100644 index 0000000..54ced00 Binary files /dev/null and b/zebra-report/fonts/chunkfive-regular-webfont.woff differ diff --git a/zebra-report/fonts/chunkfive-regular-webfont.woff2 b/zebra-report/fonts/chunkfive-regular-webfont.woff2 new file mode 100644 index 0000000..7cecf49 Binary files /dev/null and b/zebra-report/fonts/chunkfive-regular-webfont.woff2 differ diff --git a/zebra-report/host-your-own.html b/zebra-report/host-your-own.html new file mode 100644 index 0000000..9d1d8a8 --- /dev/null +++ b/zebra-report/host-your-own.html @@ -0,0 +1,535 @@ + + + + + +zebra report β€” host your own community + + + + + + + + +

host your own

+

run your own zebra community  Β·  self-hosted TURN + rendezvous on one edge box  Β·  + how it works  Β·  + open the chat  Β·  + unturf

+ +

+ The zebra pages (the chat, the 1:1 voice + call, and the multi-party spaces) need exactly two things from a server: a rendezvous relay + so two browsers can find each other, and a TURN server so they + can still connect when both sit behind NAT. Everything else — the crypto, + the modem, the audio — runs in the browser. This page hands you the whole + back end so you can run it for your own community on a single small box. +

+ +

+ This is the exact infrastructure behind www.unturf.com/zebra-report, + written out so you can stand up your own. It is a gift — reproduce it, + fork it, harden it. Your members then point the existing pages at your servers + with two URL parameters; nothing about the client needs to change. +

+ +▶ jump to "point your members at it" + +

1 Β· what you are building

+

+ One internet-facing box (a $5–$6/mo VPS is plenty for a small community) + running three daemons behind a TLS reverse proxy: +

+
    +
  • coturn — the STUN/TURN server. STUN tells a browser + its public address; TURN relays the encrypted media when a direct path is + impossible. This is the part that makes calls work across mobile networks and + strict NATs.
  • +
  • a rendezvous relay — a tiny WebSocket service that + pairs two browsers in a "room" and forwards their encrypted connection setup. + It never sees plaintext: the room id is an opaque hash and the setup data is + encrypted with the shared code before it ever reaches the server.
  • +
  • a credential mint — a single HTTP endpoint that hands + each browser a short-lived TURN username/password, so every user draws on + their own quota instead of sharing one static login.
  • +
+

+ The mint and the relay are the same small program here, but they are independent + — split them if you like. coturn is off-the-shelf. +

+ +

2 Β· the shape of it

+
browser A rendezvous (wss, encrypted SDP) browser B + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” ◄──────────────────────────────────────────────────────► β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ zebra β”‚ β”‚ zebra β”‚ + β”‚ page β”‚ ──┐ β”Œβ”€β”€ β”‚ page β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ GET /turn-cred (https) β†’ short-lived HMAC cred β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β–² β”‚ β”‚ β–² + β”‚ └────────────────────────┐ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ + β”‚ media (DTLS-SRTP, encrypted) β–Ό β–Ό media (DTLS-SRTP) β”‚ + β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ + └─────────────────────────►│ coturn TURN/STUN :3478 β”‚β—„β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ relay UDP 49152-50151 β”‚ + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ your edge box Caddy (auto-TLS) β”‚ + β”‚ wss://you/zebra-signal ─► relay :8090 β”‚ + β”‚ https://you/turn-cred ─► mint :8090 β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
+

+ When the network allows it, the two browsers talk directly and + coturn never touches the media. coturn is the fallback that guarantees a + connection; the rendezvous relay is only used for the few hundred bytes of + setup, then sits idle. +

+ +

3 Β· coturn β€” the TURN relay

+

+ Install it (apt install coturn on Debian/Ubuntu) and replace + /etc/turnserver.conf with this. Swap in your box's public IP and a + DNS name you control: +

+
# /etc/turnserver.conf +external-ip=YOUR.PUBLIC.IP +relay-ip=YOUR.PUBLIC.IP +listening-port=3478 +realm=turn.example.com + +# relay allocation range β€” open these UDP ports in your firewall too +min-port=49152 +max-port=50151 + +# time-limited credentials: the mint computes HMAC-SHA1(secret, expiry). +# the secret is appended below at deploy and never committed. +use-auth-secret +# static-auth-secret=<injected at deploy, see step 4> + +# abuse quotas β€” per ephemeral user, so they stay tight as you scale +total-quota=2000 +user-quota=6 +bps-capacity=400000000 +max-bps=2000000 +stale-nonce=600 + +fingerprint +no-cli +no-loopback-peers +no-multicast-peers +log-file=/var/log/coturn/coturn.log +simple-log
+

+ Run it under systemd as an unprivileged user (all ports are above 1024, so no + special capabilities are needed): +

+
# /etc/systemd/system/coturn.service +[Unit] +Description=coturn TURN/STUN relay for WebRTC NAT traversal +After=network-online.target +Wants=network-online.target + +[Service] +Type=simple +User=turnserver +Group=turnserver +ExecStart=/usr/bin/turnserver -c /etc/turnserver.conf +Restart=on-failure +RestartSec=5 +LogsDirectory=coturn +LogsDirectoryMode=0750 +PrivateTmp=true +ProtectSystem=full +ProtectHome=true +NoNewPrivileges=true + +[Install] +WantedBy=multi-user.target
+

+ Firewall: allow inbound UDP 3478 (and TCP 3478 if you + offer TCP relay) plus the whole UDP 49152-50151 range. On a cloud + provider, that means a firewall rule, not just ufw. +

+ +

4 Β· the shared secret

+

+ coturn and the mint share one secret. The mint signs each ephemeral credential + with it; coturn validates against the same value. Generate your own + — never reuse anyone else's, never print it, never commit it: +

+
# run once, as root, on the box +umask 077 +openssl rand -hex 32 > /etc/zebra-turn-secret +chmod 600 /etc/zebra-turn-secret + +SECRET=$(cat /etc/zebra-turn-secret) + +# wire it into coturn +sed -i '/^static-auth-secret=/d' /etc/turnserver.conf +printf 'static-auth-secret=%s\n' "$SECRET" >> /etc/turnserver.conf + +# and into the mint's environment +printf 'ZEBRA_TURN_SECRET=%s\n' "$SECRET" > /etc/zebra-signal.env +chmod 640 /etc/zebra-signal.env
+

+ Generate once and persist it: rotating the secret invalidates every credential + already handed out, dropping live calls. Keep the file 600, owned + by root. +

+ +

5 Β· minting credentials β€” /turn-cred

+

+ This is the only non-obvious piece, and it is tiny. coturn's + use-auth-secret mode accepts any username whose value is a future + unix timestamp, with the password being + base64(HMAC‑SHA1(secret, username)). So the endpoint just + stamps an expiry and signs it. In Go: +

+
const turnTTL = 12 * 3600 // seconds a credential stays valid + +func turnCred(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Access-Control-Allow-Origin", "*") // browsers (and file:// copies) can fetch + w.Header().Set("Content-Type", "application/json") + secret := os.Getenv("ZEBRA_TURN_SECRET") + if secret == "" { http.Error(w, `{"error":"turn unavailable"}`, 503); return } + + username := strconv.FormatInt(time.Now().Unix()+turnTTL, 10) + mac := hmac.New(sha1.New, []byte(secret)) + mac.Write([]byte(username)) + json.NewEncoder(w).Encode(map[string]any{ + "username": username, + "credential": base64.StdEncoding.EncodeToString(mac.Sum(nil)), + "ttl": turnTTL, + "stun": []string{"stun:turn.example.com:3478"}, + "uris": []string{ + "turn:turn.example.com:3478?transport=udp", + "turn:turn.example.com:3478?transport=tcp", + }, + }) +}
+

+ That Access-Control-Allow-Origin: * matters: it is what lets a + browser on any page — including a copy of the zebra page saved to disk and + opened from file:// — fetch a credential. The credential is + short-lived and per-user, so handing it out openly is by design. +

+ +

6 Β· the rendezvous relay

+

+ The relay is a stateless WebSocket server, a few hundred lines of standard + library, no database. Its whole job: +

+
    +
  • A browser connects to /zebra-signal?room=<hash>. The room + is a SHA-256 of the shared code, so the server learns nothing about the code.
  • +
  • The first peer in a room is told it is the offerer; the second is the + answerer. (Or "whoever is already present offers when the other joins" — + either rule works, as long as it is deterministic.)
  • +
  • Every message a peer sends is forwarded verbatim to the other peer in the + same room. The payload is the WebRTC offer/answer, already encrypted + in the browser with a key derived from the shared code (PBKDF2 → AES-GCM). + The relay forwards ciphertext it cannot read.
  • +
  • The server sends periodic WebSocket pings so idle calls don't get reaped by + intermediaries, and drops a room when both peers leave.
  • +
+

+ Run it under systemd as an unprivileged user, reading the secret from the env + file written in step 4: +

+
# /etc/systemd/system/zebra-signal.service +[Unit] +Description=zebra-signal β€” WebRTC rendezvous relay + TURN credential mint +After=network.target + +[Service] +Type=simple +User=www-data +Group=www-data +Environment=ZEBRA_SIGNAL_ADDR=:8090 +EnvironmentFile=-/etc/zebra-signal.env +ExecStart=/usr/local/bin/zebra-signal +Restart=on-failure +RestartSec=5 +NoNewPrivileges=true +PrivateTmp=true +ProtectSystem=full +ProtectHome=true + +[Install] +WantedBy=multi-user.target
+ +

7 Β· TLS + reverse proxy

+

+ Browsers require wss:// (TLS) for WebSockets and a secure context + for the crypto, so put a reverse proxy in front that terminates TLS. With + Caddy you get automatic certificates and + the config is four lines: +

+
# Caddyfile +turn.example.com { + handle /zebra-signal* { reverse_proxy localhost:8090 } + handle /turn-cred { reverse_proxy localhost:8090 } +}
+

+ Caddy fetches a Let's Encrypt certificate on first request. The WebSocket + upgrade is proxied transparently; the * CORS header set by the mint + passes straight through. That is the entire edge. +

+ +

8 Β· zebra-spaces — multi-party voice rooms (optional)

+

+ The 1:1 voice call (zebra-audio) needs only the + relay and coturn. For zebra-spaces — a host + plus co-hosts plus speakers plus an audience of listeners — you also stand + up two small Go services: +

+
    +
  • zebra-spaces-signal — a multi-member sibling of the + 1:1 rendezvous relay. Tracks roles (host > cohost > speaker > listener), + enforces an authority chain (mods can mic-invite/promote/demote/boot, + co-hosts can’t boot the host), and verifies an Ed25519 signature on every + role-change. The relay sees only opaque room ids and ciphertext SDP — a + compromised relay can refuse to forward but can’t forge promotions. + Defaults to port :8091.
  • +
  • zebra-spaces-sfu — a tiny audio-only Selective + Forwarding Unit built on pion/webrtc. + Speakers form a low-latency P2P mesh among themselves; they ALSO publish one + mic track to the SFU. Each listener holds one WebRTC connection to the SFU + and receives every speaker as a separate track — the listener fan-out + is what the mesh alone can’t do. RTP forwards unchanged: no mixing, no + decoding, no transcoding. Listener identity is mandatory (no anonymous + listening), so a moderator’s boot evicts the offender from + every path. HTTP signaling on :8092, ICE on a single UDP mux + port :7882.
  • +
+

+ Both services live in the same repo as zebra-signal: + git.unturf.com/engineering/unturf/proxy.unturf.com + — under cmd/zebra-spaces-signal/ and cmd/zebra-spaces-sfu/. + Public domain. Each ships a systemd unit and standard build target; the deploy + pattern mirrors zebra-signal exactly. The Caddyfile gets two more + routes: +

+
# Caddyfile (added to your existing block) +handle /zebra-spaces-signal* { reverse_proxy localhost:8091 } +handle /zebra-spaces-sfu* { reverse_proxy localhost:8092 { flush_interval -1 } }
+

+ flush_interval -1 matters: the SFU pushes renegotiation offers + over Server-Sent Events when speakers join or leave, and Caddy will buffer + those events into silence without it. +

+

+ The SFU advertises a public IP as its host ICE candidate, so set + ZEBRA_SFU_NAT1TO1_IP=<your.public.ip> on the unit and open + UDP 7882 in your firewall — that single port carries all + ICE/RTP via Pion’s UDP mux. No port range like coturn needs. +

+ +

9 Β· point your members at it

+

+ Now the payoff: nobody needs a modified page. The published + zebra pages read two URL parameters and fall back to the unturf servers only if + they are absent. Send your community a link with your own endpoints: +

+
https://www.unturf.com/zebra-report/zebra-audio.html?signal=wss://turn.example.com/zebra-signal&turncred=https://turn.example.com/turn-cred
+

+ Or host the page yourself (it is a single self-contained HTML file) and serve it + from the same box. Either way, the call is established through your + relay and, when needed, relayed through your coturn. The same two + parameters work on the text chat (index.html) and the voice call + (zebra-audio.html). +

+

+ Saved a copy to disk? It still works from file:// — the crypto + runs in a secure context and the * CORS header lets the saved file + fetch credentials — as long as your relay and TURN server are reachable. +

+ +

10 Β· how many users can it carry

+

+ The rendezvous relay is nearly free: it moves a few hundred bytes per call setup + and then idles, so a tiny box pairs thousands of rooms. coturn is the + ceiling, and only for relayed calls (direct peer-to-peer calls cost it + nothing). Each relayed voice call is bidirectional audio — tens of kbit/s + per leg. With bps-capacity=400000000 (400 Mbit/s) the limit is + whatever your VPS's actual uplink and monthly transfer allow, long before coturn + itself strains. +

+

+ The user-quota and total-quota lines cap concurrent + allocations to blunt abuse. Raise total-quota as you grow; keep + user-quota small (a handful of allocations per credential is plenty + for one call). Because credentials are per-user and expire, a leaked one is + worthless within hours. +

+ +
+ +

11 Β· it's a gift

+

+ This stack is open intellectual capital — take it and run a community the + unturf servers will never see or meter. Patch it, harden it, pass it on. Every + box that runs its own relay makes the whole mesh more resilient and less + centralised, which is the entire point. +

+▶ open the chat +  +▶ open the voice call + +

+ zebra report · host your own community · + unturf +

+ +
+ page integrity  Β·  built 2026-06-08
+ md5 fba56654bb0331ff415d14f655ef9e72
+ sha256 d543c2528cb8e04f7a1e841940cd7d8ca05b1ec4b9e3e23d1623952b0eec9128
+ hashes are of this page with these two fields zeroed β€” to verify, blank them and re-hash
+ one self-contained file β€” save a copy and verify it against these hashes; point it at your own servers with ?signal= and ?turncred= +
+ + + + diff --git a/zebra-report/how-it-works.html b/zebra-report/how-it-works.html new file mode 100644 index 0000000..c7f27a3 --- /dev/null +++ b/zebra-report/how-it-works.html @@ -0,0 +1,369 @@ + + + + + +zebra report β€” how it works + + + + + + + + +

zebra report

+

how it works  Β·  a volume-modem chatroom over webrtc  Β·  + open the chat  Β·  + host your own  Β·  unturf

+ +

+ Zebra report is a two-person chatroom where your words never travel as network + packets. Each message is encoded into the loudness of an audio tone, + carried inside an encrypted WebRTC voice stream, and decoded back into text on + the far side. A network observer sees an ordinary encrypted call. The chat + lives in the amplitude. +

+ +

+ This page walks through the whole machine: how two browsers find each other + with no copy-paste, how data rides on volume, why a speech codec nearly killed + it, and the error correction that finally made it solid. +

+ +▶ open the chat + +

1 Β· the idea: data in amplitude, not packets

+

+ The original zebra-report channel modulates a browser tab's PulseAudio volume: + step the volume through values at a fixed clock rate and the other side reads + those steps back as data, exactly like a dial-up modem. The payload lives in a + side channel that the network stack never sees. +

+

+ The browser version generates a pure 440 Hz tone locally (no microphone) + and swings its output gain per clock tick. That modulated tone becomes + the outbound WebRTC audio track. Wireshark sees only encrypted SRTP; the words + are in the amplitude envelope inside it. +

+ +

2 Β· bootstrapping with no copy-paste

+

+ WebRTC needs the two peers to swap connection descriptions (SDP) before media + flows. The usual way is to copy a blob of text from one device to the other and + back. We replaced that with a tiny signaling relay: +

+
A: rendezvous code ──▢ wss://cors-proxy.uncloseai.com/zebra-signal ◀── code :B + (relay pairs the two, forwards encrypted SDP) + + both type the same code Β· no link Β· no QR Β· no paste
+

+ Both peers type the same rendezvous code. The page derives an opaque room id + and an encryption key from that code, connects to the relay, and the relay + forwards the offer/answer between the two. The SDP is encrypted with the code + before it leaves the page, so the relay only ever sees ciphertext and + an opaque room id. It carries setup only; chat content never touches it. +

+ +

3 Β· the carrier and the modem

+

+ At connection time each browser starts a 440 Hz tone and modulates its + gain. Rather than a plain on/off (one bit per tick), the modem is + multi-level: each clock tick holds the volume at one of N + levels, so a symbol carries log₂(N) bits — 4 levels = 2 bits, 16 + levels = 4 bits per tick. +

+

+ Each byte is framed by a minimum-level start symbol and a + maximum-level stop symbol. The receiver locks onto that high-to-low + edge, then re-derives its own low and high amplitude reference from the start + and stop of every byte — so the level mapping self-calibrates + continuously and tolerates drift in the channel's gain. +

+ +

4 Β· the codec trap

+

+ The first cross-machine attempts decoded nothing. The cause was the audio + codec. WebRTC defaults to Opus, a perceptual speech codec that + re-quantizes audio in 20 ms frames and effectively normalizes loudness. + That is precisely the information our modem rides on, so Opus erased it. +

+

+ Two fixes restored a clean channel: +

+
    +
  • Pin the codec to G.711 (setCodecPreferences). + G.711 is memoryless companding — it preserves the amplitude envelope + sample by sample, like the PulseAudio path, instead of smearing it.
  • +
  • Use a single 440 Hz tone. The carrier had used + 440 Hz left / 441 Hz right for a stereo mode, but G.711 is mono, so + the two tones downmixed into a 1 Hz beat — a slow + sinusoidal swell that drowned the levels. One frequency, no beat.
  • +
+ +

5 Β· making it reliable

+

+ Even on a clean channel, a wireless link is lossy. Three layers make the chat + dependable: +

+
    +
  • Framing + CRC. Every frame carries a CRC32; a corrupted + frame is detected and dropped rather than shown as garbage.
  • +
  • Delivery ACKs + outbox. A sent message is held in an + outbox — not echoed into your log — until the far side + acknowledges it (the ACK echoes the frame's CRC as a message id). Only then + does it move into the log, marked delivered. The receiver de-dupes on CRC, so + a lost ACK never double-shows a message.
  • +
  • Retransmit with backoff. An un-acknowledged message is + resent, with exponential backoff so a bad stretch spaces out retries instead + of hammering the channel.
  • +
+ +

6 Β· error correction (the eureka)

+

+ The last problem was the worst kind: messages mostly worked, then a frame would + arrive one bit wrong, fail its CRC, get dropped, and the sender would retry + forever. The channel was good enough to almost work. +

+

+ The fix is forward error correction. Each data byte is carried as a + Hamming(12,8) codeword — 8 data bits plus 4 parity bits + — inside one byte-frame. Any single flipped bit is located and corrected + on the far side before the CRC check, so a marginal channel self-heals + instead of dropping the frame. +

+

+ Hamming corrects single-bit errors, but a misread volume level can flip two + bits at once. So the levels are Gray-coded: adjacent amplitude + levels differ by exactly one bit. The most common error — reading a level + as its neighbour — becomes a single-bit flip, which is exactly what + Hamming repairs. Together they turned a channel that gave up into one that + delivers. +

+ +

7 Β· encryption & threat model

+

+ Chat content is end-to-end encrypted at the application layer, on top of + WebRTC's own SRTP encryption. Two modes: +

+
    +
  • Passphrase — everyone types the same room phrase; + a 256-bit AES-GCM key is derived with PBKDF2-SHA256 (600k iterations).
  • +
  • Pubkey — 1-to-1 ECDH (P-256) between two public + keys.
  • +
+

+ The encryption happens before anything becomes volume, so the carrier + never holds the readable text — it holds scrambled bytes. Here is the + journey of "hi" in passphrase mode: +

+
    +
  1. Plaintext. "hi" is two bytes of ASCII: + 0x68 0x69.
  2. +
  3. AES-256-GCM scrambles it. A fresh random 12-byte IV + (nonce) is generated and the two bytes are encrypted with the + passphrase-derived key, producing IV (12) + + ciphertext (2) + auth tag (16) = + 30 bytes. The ciphertext is the same length as the plaintext + (GCM is a stream mode) and looks like random noise: GCM XORs a key+IV + keystream into your bytes, turning 0x68 0x69 into two + unpredictable ones. Because the IV is random every time, sending + "hi" twice yields completely different ciphertext, so no + patterns leak.
  4. +
  5. Then it is framed, error-corrected, and modulated. A frame + header + CRC wrap the 30 bytes (~43 bytes); each byte becomes a 12-bit + Hamming codeword; each codeword becomes Gray-coded N-level volume steps on + the 440 Hz carrier.
  6. +
+
"hi" ─▢ AES-256-GCM ─▢ IV + ciphertext + tag (30 bytes, looks random) + ─▢ frame + CRC (~43 B) ─▢ Hamming(12,8) codewords ─▢ volume levels
+

+ By the time it is volume, the readable h,i is gone + three layers up. Someone reading the volume locally (the same-UID PulseAudio + attack this project documents) demodulates the amplitude back to bytes and gets + 30 bytes of random-looking ciphertext, not "hi". Without the + passphrase the encryption is irreversible, and the auth tag means tampering + fails outright — flip one bit and decryption rejects it. +

+

+ And it is doubled up: that is the application layer (AES-GCM). + WebRTC independently wraps the whole audio stream in DTLS-SRTP, + so the carrier is encrypted again in transit. Two separate keys, two separate + layers — the readable "hi" exists only in RAM on the two + endpoints, never on the wire and never in the volume. +

+

+ Protects against a network observer reading chat content. Does not protect + against another process on either endpoint recording the local audio, or an + endpoint compromise — that local audio trust boundary is the surface this + project documents. +

+ +

8 Β· testing without two phones

+

+ The modem and protocol are validated by a Node test suite that runs the real + shipped code — no browser and no second device required + (make test-web). It covers the CRC and frame codec, the Hamming + and Gray logic, a full multi-level modem roundtrip through a simulated noisy + channel, and recovery of off-by-one symbol errors. Over three thousand + assertions guard every change to the wire format. +

+ +
+ +

Type a rendezvous code on two devices and watch text cross on nothing but the + loudness of a tone.

+▶ open the chat + +

+ zebra report · volume modem chatroom · + unturf +

+ +
+ page integrity  Β·  built 2026-06-08
+ md5 afd65bceadd50f210103e4aa0db67f1e
+ sha256 40bce299a96e57f2835c7c6d95c40c0f24309c91498eebbf20f1b966b3c79cbf
+ hashes are of this page with these two fields zeroed β€” to verify, blank them and re-hash
+ one self-contained file β€” save a copy and verify it against these hashes; point it at your own servers with ?signal= and ?turncred=, or host your own community +
+ + + + diff --git a/zebra-report/index.html b/zebra-report/index.html new file mode 100644 index 0000000..48aff05 --- /dev/null +++ b/zebra-report/index.html @@ -0,0 +1,1775 @@ + + + + + +zebra report β€” chat + + + + + + + + +

zebra report

+

volume modem chatroom  Β·  e2e encrypted  Β·  webrtc carrier  Β·  + how it works  Β·  + host your own  Β·  + unturf

+ +
+ +
+ +
+

identity

+
+ + + +
+
+ + + + + + + group Β· or 1-to-1 ECDH +
+
+ + +
+

room (passphrase mode)

+
+ +
+
+ + no room key +
+

+ PBKDF2-SHA256 (600k iter) of passphrase + literal salt "zebra-report-v1" + β†’ 256-bit AES-GCM group key. +

+
+ + +
+

room (pubkey mode)

+

your public key (click to copy):

+
generating…
+
+ + +
+
+ + +
+
+ + +
+

carrier

+
+
+ + + +
+
+ tx +
+ 0% +
+
+ rx +
+ β€” +
+
+ + +
+

connect

+
+ + +
+
+
+ not connected + +
+
+
+ peer link: idle + +
+
+
+ path: not connected +
+

+ both peers type the same code; SDP is exchanged automatically via the relay + (encrypted with the code). chat content rides the audio carrier. +

+
+ +
+ +
+ +
+

chat

+

peers in room:

+
+
none yet
+
+
+
+ + +
+ +
+ +
+ +
+ + + + + +
+ page integrity  Β·  built 2026-06-08
+ md5 68063155fd1e2138476cfd8a3518ea33
+ sha256 274a98127fba00617dd4540419c61b1080d2d5dcc1da48f3bc3f22d0ad415a47
+ hashes are of this page with these two fields zeroed β€” to verify, blank them and re-hash
+ one self-contained file β€” save a copy and verify it against these hashes; point it at your own servers with ?signal= and ?turncred=, or host your own community +
+ + + + diff --git a/zebra-report/zebra-audio.html b/zebra-report/zebra-audio.html new file mode 100644 index 0000000..c9f7b4a --- /dev/null +++ b/zebra-report/zebra-audio.html @@ -0,0 +1,775 @@ + + + + + +zebra audio + + + + + + + + +

zebra audio

+

encrypted voice  Β·  webrtc  Β·  rendezvous  Β·  + spaces  Β·  + host your own  Β·  + unturf

+ +
+

call

+
+ + +
+
+
+ idle + + +
+
+
+ path: β€” +
+
+ + +
+
+ +
+

+ both partners type the same code and hit call. audio is end-to-end + encrypted (DTLS-SRTP), peer-to-peer when the network allows, relayed through + a TURN server otherwise. the rendezvous server only sees an opaque room id + and code-encrypted setup data. +  run this for your own community → +

+
+ +
+

levels

+
+ you + +
+
+
+ them + +
+
+
+ +
+

log

+
+
+ + + + + + + + + + +
+ page integrity  Β·  built 2026-06-08
+ md5 68333dfbb426a52482dd269ec196960b
+ sha256 238a9c9f9f93b64c4ed22d32db2074748418e63499996a967a9beba4ead09038
+ hashes are of this page with these two fields zeroed β€” to verify, blank them and re-hash
+ one self-contained file β€” save a copy and verify it against these hashes; point it at your own servers with ?signal= and ?turncred=, or host your own community +
+ + + + diff --git a/zebra-report/zebra-spaces.html b/zebra-report/zebra-spaces.html new file mode 100644 index 0000000..a273e91 --- /dev/null +++ b/zebra-report/zebra-spaces.html @@ -0,0 +1,8202 @@ + + + + + + + + +zebra spaces + + + + + + + +
+ + + + +
+ + + + +
+ + +
+ + + + + + +
+

log

+
+
+ + + + + +