Compare commits

...
Sign in to create a new pull request.

382 commits

Author SHA1 Message Date
c3597454ac
zebra-report: deploy stacked layout below 1100px (kill cramped 3-col on iPad/split-screen) 2026-06-08 14:46:14 -04:00
d27b959436
zebra-report: deploy camera permission probe telemetry 2026-06-08 08:02:51 -04:00
e4493f292d
zebra-report: deploy bare-constraints camera retry 2026-06-07 21:14:54 -04:00
3b817799ad
zebra-report: deploy user-facing notice on camera NotAllowedError 2026-06-07 20:39:25 -04:00
1f27b89378
zebra-report: deploy chromium decoder anchor
Pulls in zebra-report dad697d: hidden muted <audio> element attached
alongside the MediaStreamAudioSourceNode forces chromium's WebRTC
decoder to actually run. Without it the worklet sees silence on
chrome remote audio tracks. Fixes fedora chrome silent-room from
ticket 0001.
2026-06-07 20:06:16 -04:00
9818f0860f
zebra-report: deploy always-SFU receive audio + 0.7s worklet cushion
Pulls in zebra-report 1984bb1: SFU is the only receive-audio path
for every role, mesh inbound audio ignored. SPEAKER_PLAYOUT_DELAY_SEC
0.5s → 0.7s.
2026-06-07 19:34:06 -04:00
faa52b4871
zebra-report: deploy sink-reapply on attach + per-tick ctx.sink telemetry
Continues ticket 0001 fix. Fox 2026-06-07 second telemetry pass showed
blanka-chrome's audioCtx sink reverted to 'default' after a leave/rejoin
even though the user had a picked device, because applySinkToAudioCtx
only ran inside the `if (!audioCtx)` branch and a persistent ctx with a
drifted sinkId stayed default forever.

Attach now re-applies sink when audioCtx exists + speakerDeviceId is set
+ ctx.sinkId differs. Per-tick telemetry exposes ctx.sink= (and want= on
mismatch) so the next session can verify sink stays on the picked device
across leave/rejoin.

Source commit: 4cedd85 in zebra-report.git
2026-06-07 17:43:00 -04:00
c40240167b
zebra-report: deploy mesh.recv telemetry
Pulls in zebra-report b9e2541: telemetry tick now emits per-peer
mesh.recv lines with the mesh PC's inbound audio receiver stats
(pkt/lost/bytes/jitter/level/jbuf/lp + short uuid prefix). Closes
the visibility gap on ticket 0001 — we can now see whether mesh's
audio decoder is alive or also silent when SFU's receiver is
orphaned by the worklet swap. fox 2026-06-07.
2026-06-07 12:24:32 -04:00
a8b06b5907
zebra-report: deploy fresh-stream wrap on mic ontrack + mute-gate mesh swap
Fixes ticket 0001 (fedora chrome cannot hear speakers) — fox 2026-06-07
telemetry ruled out the sink hypothesis from 0f36e02 and pinned two
coupled defects:

  (A) tracks=0 race in handleRemoteSfuTrack mic branch — ev.streams[0]
      can be empty at handler-time even when ev.track is live; the
      silent <audio> fallback ate the listener.
  (B) Mesh ontrack swapped the worklet to the mesh stream even when
      the mesh track was still muted, orphaning the SFU receiver and
      trapping the listener on a silent mesh source.

Mic now mirrors screen/camera/game (new MediaStream([ev.track])) and
the mesh swap waits for 'unmute' / restores SFU after a mute window.

Source commit: caa0548 in zebra-report.git
2026-06-07 11:34:29 -04:00
8e762fb100
zebra-report: deploy telemetry fingerprint + camera-error breadcrumbs
Pulls in zebra-report 1ed5263: every entry now emits a one-shot
'session: ua=... ctx={...} devs={...} picked={...}' line so the
signal-server log carries browser + audioCtx + device-count + saved-
deviceId-shortprefix context for diagnosing the open tickets
(0001 fedora chrome silence, 0002 fedora firefox cannot share camera).
Camera-open errors now include e.name + the constraints we tried
plus auto-recovery from OverconstrainedError + saved deviceId.
2026-06-07 11:27:39 -04:00
0f36e02e42
zebra-report: deploy audioCtx sinkId routing (fixes fedora chrome silence)
Pulls in zebra-report 467146a: every audioCtx now routes to the
user-picked output sink via applySinkToAudioCtx(). Fixes the
fedora chrome silent-speaker telemetry where RTP arrived, worklet
started, ctxState=running, but no audio reached the user — because
audioCtx.destination was always emitting to system default while
the speaker dropdown set <audio> sinks only. fox 2026-06-06.

Audio path now respects the picker on Chrome ≥110 and Firefox ≥116.
Older browsers continue to fall through to default.
2026-06-06 19:27:46 -04:00
e45db971aa
zebra-report: deploy shrink-retarget audio + lip-sync coupling
Pulls in zebra-report 9215eaa: JitterBufferProcessor now drops the
queue down to targetSamples (not 1.5×target) on a shrinking retarget,
eliminating the residual 6%-cap speed-up phase fox heard as "janky
slow" during listener-to-speaker promotion. The processor reports
the dropped sample count back to JS so installJitterBuffer's port
handler zeros every paired video receiver's jitterBufferTarget +
playoutDelayHint — video frames drop in lockstep with the audio
skip so lip-sync survives the jump.

Fox 2026-06-06: "if we skip ahead from whatever listener is at to
speaker speed, we need to make sure the video skips ahead the same
amount or rate to keep the lips synced".

Behavior change is isolated to the role-change moment (4s→0.5s on
promote). Steady-state audio and listener-only sessions unchanged.
2026-06-06 15:21:29 -04:00
3a0a30807e
zebra-report: deploy silent-listener fix + listener-bye-on-bfcache fix
Pulls in two upstream zebra-report commits:

  0ce1339 prefix-match in flushSfuStreams (kills the silent
          fedora-chrome listener: ontrack races peer-joined, cache
          keyed by 16-char streamID prefix, flush's strict-equality
          matcher never resolved short→full, listener heard nothing
          from anyone already in the room).

  5e8cdad send 'bye' on pagehide for listeners even when
          persisted=true (kills the closed-firefox-phone roster
          zombies sitting through the 120s readTimeout window).

Server-side backstop (60s listenerAliveTTL) ships separately in
proxy.unturf.com main; the client fix above stands on its own for
the common bye-arrives case.

Fox 2026-06-06: "rebooting fedora chrome blanka because it never
could hear any speakers for days now".
2026-06-06 14:48:09 -04:00
0444bd1297
zebra-spaces: one transcript line per sentence 2026-06-05 19:54:09 -04:00
32497859b0
zebra-spaces: tear down stale <audio> fallback when worklet path takes over 2026-06-05 19:52:43 -04:00
43780b2d6f
zebra-spaces: in-place source swap on re-attach 2026-06-05 19:46:12 -04:00
59c407f1c7
zebra-spaces: idempotent attach + drop stale stream cache 2026-06-05 19:41:22 -04:00
269ba777ca
zebra-spaces: stop re-attaching every speaker on peer-joined (kill fxhp double-audio) 2026-06-05 19:15:48 -04:00
c2d6016c8b
zebra-spaces: prime audioCtx on first interaction (fix desktop auto-rejoin) 2026-06-05 16:05:54 -04:00
d7fd405150
zebra-spaces: deploy attach diagnostic 2026-06-05 14:22:10 -04:00
d263740557
zebra-spaces: deploy duplicate-publisher audio dedup 2026-06-05 14:14:24 -04:00
4533e4e4b6
zebra-spaces: deploy lip-sync flap fix + transcript autoscroll 2026-06-05 14:04:26 -04:00
6d24cf2d8f
zebra-spaces: deploy anti-alias + compressor self-transcribe 2026-06-05 13:42:15 -04:00
eb1718225e
zebra-spaces: deploy transcribe-restore TDZ fix 2026-06-05 13:35:37 -04:00
129b4436af
zebra-spaces: deploy worklet load race fix 2026-06-05 13:34:06 -04:00
5a68c56963
zebra-spaces: deploy TDZ fix + self-capture diagnostics 2026-06-05 13:30:53 -04:00
f57733ebd3
zebra-spaces: deploy transcribe persist + self-capture fix 2026-06-05 13:25:46 -04:00
61f23e2b4d
zebra-spaces: deploy self-transcribe + whisper telemetry 2026-06-05 13:21:50 -04:00
a59f27a042
zebra-spaces: deploy whisper worker + inflight gate 2026-06-05 13:11:09 -04:00
224f2e9f31
zebra-spaces: deploy whisper hallucination filter 2026-06-05 13:06:55 -04:00
b7b910e4c4
zebra-spaces: deploy DOM-move spotlight 2026-06-05 13:00:43 -04:00
1280be650c
zebra-spaces: deploy listener instant tile switch 2026-06-05 12:52:11 -04:00
ab3b48e293
zebra-spaces: deploy client-side Whisper STT 2026-06-05 12:38:00 -04:00
f23b35af2f
zebra-spaces: deploy stream-toggle UI removal 2026-06-05 09:38:34 -04:00
8bf25aaa64
zebra-spaces: deploy predictive grow + self-calibrating floor 2026-06-05 09:23:43 -04:00
d9a233b8d7
zebra-spaces: deploy ±6% stretch cap 2026-06-05 09:17:54 -04:00
c208776c12
zebra-spaces: deploy listener adaptive shrink 2026-06-05 08:26:26 -04:00
fa0666f7cc
zebra-spaces: deploy Phase 3 adaptive time-stretching 2026-06-04 19:46:24 -04:00
4885cab72e
zebra-spaces: deploy Double Dragon controller 2026-06-04 18:26:18 -04:00
52866ed779
zebra-spaces: deploy 4s speaker buffer + HTTP lip-sync override 2026-06-04 18:21:51 -04:00
01abc88446
zebra-spaces: deploy mesh-through-worklet + lip-sync receiver rebind 2026-06-04 18:09:28 -04:00
5dea6156ba
zebra-spaces: deploy smooth audio source pivot 2026-06-04 18:01:00 -04:00
eaf5e37650
zebra-spaces: deploy SFU worklet detach on mesh ontrack 2026-06-04 17:51:56 -04:00
a9433589a0
zebra-spaces: deploy lip-sync algorithm 2026-06-04 17:13:48 -04:00
41283ec074
zebra-spaces: deploy listener buffer-ready status gating 2026-06-04 16:45:07 -04:00
f077c01c5e
zebra-spaces: deploy role-aware playout delays + worklet for all roles 2026-06-04 15:59:01 -04:00
6e42fc180c
zebra-spaces: deploy worklet sticky-started re-arm fix 2026-06-04 15:34:58 -04:00
7e17f9a5d2
zebra-spaces: deploy AudioWorklet listener jitter buffer 2026-06-04 15:26:09 -04:00
64ac008440
zebra-spaces: deploy jitterBufferTarget + jbuf telemetry 2026-06-04 15:10:40 -04:00
9f9dc91f7f
zebra-spaces: deploy split outbound telemetry per kind 2026-06-04 14:53:41 -04:00
50452361ae
zebra-spaces: deploy audio priority='high' (wiggle-storm fix mirror) 2026-06-04 14:38:14 -04:00
80a936fe7b
zebra-spaces: deploy publisher-side telemetry 2026-06-04 14:37:04 -04:00
645db6aca7
zebra-spaces: deploy peer-booted/role-change epoch refresh (mirror) 2026-06-04 14:22:28 -04:00
a2ff20534b
zebra-spaces: MuteFSM deploy (mirror of zebra-report 7f9d827) 2026-06-04 14:13:42 -04:00
8d6bf481fe
zebra-report: deploy applyPublishStateUI for share/stop buttons 2026-06-04 13:58:05 -04:00
1f19037c6f
zebra-report: deploy FSM-driven publish lifecycle (mic/camera/screen) 2026-06-04 13:55:45 -04:00
bbffd61d89
zebra-report: deploy FSM-driven call-state UI 2026-06-04 13:49:29 -04:00
385ccf5723
zebra-report: deploy silent screen-share recovery 2026-06-04 13:44:32 -04:00
be57d7769d
zebra-report: deploy sub PC rebuild on remote close 2026-06-04 13:28:00 -04:00
88ade82cf9
zebra-report: deploy full uuid in latency panel 2026-06-04 13:17:15 -04:00
ce64dd2512
zebra-report: deploy hide entry-row while joined (privacy) 2026-06-04 13:12:09 -04:00
0983639b24
zebra-report: deploy self-listener FSM (state-machine driven) 2026-06-04 13:10:30 -04:00
c578779398
zebra-report: deploy MediaSession for backgrounded mobile listeners 2026-06-04 13:01:38 -04:00
b2e8ee1a30
zebra-report: deploy kicked-self UI cleanup 2026-06-04 12:52:32 -04:00
954b4cf8fd
zebra-report: deploy expanded telemetry (lp + signal firehose) 2026-06-04 12:39:56 -04:00
6c214a19fb
zebra-report: deploy label-based mic/speaker device persistence 2026-06-04 12:36:11 -04:00
9288555d8e
zebra-report: deploy UA-gated auto-rejoin (mobile waits for tap) 2026-06-04 11:53:18 -04:00
15eca2bc92
zebra-report: deploy AudioContext oscillator-prime for Firefox Android 2026-06-04 11:50:00 -04:00
9d6b27842d
zebra-report: deploy AudioContext listener audio path (Firefox Android autoplay fix) 2026-06-04 11:46:27 -04:00
10d705beb3
zebra-report: deploy silent wedge-recovery for stuck audio elements 2026-06-04 11:37:16 -04:00
aaf7402912
zebra-report: deploy state-based autoplay-block detection 2026-06-04 11:30:57 -04:00
b8fd50c37b
zebra-report: deploy tap-to-resume + kick-clears-auto-rejoin 2026-06-04 11:27:39 -04:00
e5bb1366fc
zebra-report: deploy mod-action serializer (two-kick fix) 2026-06-04 10:44:49 -04:00
382d72b687
zebra-report: deploy realtime telemetry 2026-06-04 10:38:14 -04:00
5fc18d2423
zebra-report: deploy self-listener-mode include-self fix 2026-06-04 10:33:32 -04:00
d9e8041a37
zebra-report: deploy self-listener mode
Speakers, cohosts, and hosts can flip their own row's stream toggle
to listen via the buffered HTTP Ogg/Opus broadcast tap instead of
WebRTC. Mic auto-mutes while in that mode; unmuting hops back to the
live mesh seamlessly. Survives cellular ICE churn that breaks the
WebRTC path.
2026-06-04 10:29:34 -04:00
f39f6a4ea9
zebra-report: deploy auto-rejoin restore
Hard refresh resumes the last space again — the one-tap friction
buyback didn't actually fix the Firefox Android listener-audio bug
it was supposed to fix.
2026-06-04 10:01:23 -04:00
0843aa1317
zebra-report: deploy DJ-unmute + video lip-sync fixes
- DJ self-monitor stream now plays audibly (was muted-start with no
  unmute path for non-listeners)
- Screen / camera / game receivers get the same playoutDelayHint as
  audio so the picture stays in sync with the voice
2026-06-04 09:52:33 -04:00
22ecc0b5ba
zebra-report: remove dead audioPath references — fixes leave button
Mirror of zebra-report 3bc3edf.
2026-06-03 23:01:14 -04:00
b0bb2a1be4
zebra-report: cache-busting meta on the HTML root
Mirror of zebra-report 7981e9e.
2026-06-03 22:44:14 -04:00
63ff3ba5ec
zebra-report: trace leave click + global JS error logging
Mirror of zebra-report 6d5a2d4.
2026-06-03 22:41:28 -04:00
ccab98bee6
zebra-report: auto-rejoin pre-fills only; mute+leave hidden idle
Mirror of zebra-report 12df78a.
2026-06-03 22:21:36 -04:00
0f70d62148
zebra-report: pre-bless audio-element pool on entry click
Mirror of zebra-report 44e05b2.
2026-06-03 22:12:59 -04:00
cef405c204
zebra-report: drop play button for listeners — autoplay WebRTC
Mirror of zebra-report 9eb5b82.
2026-06-03 22:04:10 -04:00
4891a90be0
zebra-report: revert auto-DJ for listeners, restore WebRTC playback
Mirror of zebra-report 901bab1.
2026-06-03 21:42:27 -04:00
2c5d2618d6
zebra-report: swap fresh <audio> in listener click — Firefox Android fix
Mirror of zebra-report 1de3f2c.
2026-06-03 21:26:39 -04:00
c81e7e00f2
zebra-report: deeper audio-element telemetry for listener path
Mirror of zebra-report c8fc119.
2026-06-03 21:22:49 -04:00
e9aa3412f2
zebra-report: clear DJ state on leave + re-prime audio every entry
Leave was tearing down WebRTC but leaving streamMode/streamAudio/
audioPath stale — re-entry as listener saw "already enrolled" and
never made a fresh /stream request. Now leave wipes all three maps,
removes the <audio> elements, and stops the retry loop. Plus the
primeAudio one-shot gate is gone so every entry click re-primes the
mobile audio session (it can be suspended across tab background).
2026-06-03 21:12:59 -04:00
013b5c775c
zebra-report: telemetry on listener audio path
Mirror of zebra-report f196714.
2026-06-03 21:04:31 -04:00
e8bb5aadbd
zebra-report: 4s auto-enrol retry loop covers post-join publish race
If the host's mic publish lands after the listener's initial DJ auto-
enrol attempt, the 404 from the SFU was permanent — no event re-
triggered enrol. 4s interval re-checks every speaker and starts streams
that are still missing. Stops on transition out of listener.
2026-06-03 21:02:29 -04:00
fb1fabc810
zebra-report: listener mute button doubles as audio-unlock gesture
Mirror of zebra-report 334ee82.
2026-06-03 20:57:18 -04:00
995a9b230e
zebra-report: prime audio on entry click — drop tap-to-resume
Replaces the regressive tap-anywhere-to-resume queue with
primeAudioOnGesture(): the entry-button click handler plays a 1-frame
silent WAV through a hidden <audio>, blessing the page for audio.
Auto-enrolled DJ streams then play() without further user gesture.
No more "tap anywhere" message; no more flip-flop on stalled.
2026-06-03 20:31:13 -04:00
31bb90293a
zebra-report: tap-resume reload + log retry result
Calls a.load() inside the gesture before a.play() so the retry isn't
no-op'ing on an aborted element. Adds 'click' to the listened events
since Firefox Android only grants gesture-activation on click in some
configs. Logs retry success/failure so we know what's happening.
2026-06-03 20:19:01 -04:00
393b81fb23
zebra-report: tap-anywhere-to-resume on mobile autoplay block
When mobile Firefox/Safari blocks audio.play() on auto-enrolled DJ
streams, queue the elements and retry on the first pointerdown/
touchstart anywhere on the page. WebRTC stays unmuted as fallback
so the listener isn't silent in the meantime.
2026-06-03 20:16:20 -04:00
e3363d9cf1
zebra-report: stream-toggle reliability fixes
Three coupled fixes to the DJ-stream toggle path:
  - await setSinkId() before setting .src so it doesn't race + abort
    the in-flight media load
  - drop the 'stalled' handler that was ping-ponging WebRTC ↔ stream
    on every transient mobile-cellular buffer pause
  - make startStream idempotent on the same URL so a peer-joined
    auto-enrollment race can't reset .src and self-abort

Plus preload="auto" and playsInline on the dynamic <audio> for
mobile compat. Fixes "no music on phone stream stalled" and the
"autoplay blocked: aborted at user's request" log spam from host
self-monitor clicks.
2026-06-03 20:06:45 -04:00
94b981da29
zebra-report: mute button + peer-force-muted handler
Mirror of zebra-report a3c49f1 + proxy.unturf.com 90a5e96.
2026-06-03 19:51:30 -04:00
d91e908eb3
zebra-report: stream toggle uses its own top-row grid column
Moves the ◉/○ DJ-stream button out of the bottom mod-actions stack
into the dedicated `strm` grid column on the top row (next to the
mic icon). No more extra sub-row per speaker for the self-monitor or
host-controlled stream toggle — fixes the vertical scroll regression
when many members were in the room.
2026-06-03 19:39:11 -04:00
29beeb71d7
zebra-report: mod-action buttons horizontal via inline-block
Mirror of zebra-report 55d5e52.
2026-06-03 19:36:17 -04:00
5163613d1e
zebra-report: defer WebRTC mute until DJ stream actually plays
Mirror of zebra-report ebcd257.
2026-06-03 19:30:58 -04:00
ed93bb8fca
zebra-report: lock listeners into DJ mode — no per-speaker opt-out
Mirror of zebra-report 9fd6b06.
2026-06-03 19:28:30 -04:00
6d827b29d2
zebra-report: default-on DJ mode for listeners + 4s RTC playout buffer
Mirror of zebra-report 0cbbc37.
2026-06-03 19:19:45 -04:00
5f9a67b8e7
zebra-report: stream-gating + layout + 2s playout + bfcache-safe bye
Mirror of zebra-report de5b530.
2026-06-03 19:11:36 -04:00
486243cda6
zebra-report: kick + ban onto a dedicated row in mod-actions
Mirror of zebra-report 148116a.
2026-06-03 18:58:18 -04:00
ab82577cdc
zebra-report: mod-actions wraps so stream toggle doesn't cause scroll
Swap grid-auto-flow:column to grid-template-columns:repeat(auto-fit,max-content)
so the now-5-button row wraps to a second line on narrow panels instead
of overflowing horizontally.
2026-06-03 18:48:11 -04:00
e14c92e037
zebra-report: stream toggle on own row — DJ self-monitor
DJ can preview the ~2s delayed Ogg/Opus stream of their own mic to
confirm what listeners hear. Closed headphones recommended; open
speakers + music mode = feedback (title attr warns).
2026-06-03 18:44:14 -04:00
9b55fd96ce
zebra-report: per-speaker "stream" toggle (DJ mode, Ogg/Opus over HTTP)
Each speaker row carries a stream toggle that swaps their audio from
WebRTC subscribe (~700ms latency, glitchy under loss) to a plain
HTTP <audio> pulling Ogg/Opus from the SFU's new /stream endpoint
(~2s latency, browser-managed jitter buffer, bulletproof for DJ
playback). Requires matching proxy.unturf.com SFU build.
2026-06-03 18:35:52 -04:00
147dbc0f9e
zebra-report: revert remaining new Chrome-path codec params
Choppy persisted after every other dial-back. The only remaining new
Chrome-publisher params were the fullband pin and the 320k bump. Drop
both. Chrome publisher's SDP now back to the pre-feature shape
(stereo + FEC + 256k, no maxplaybackrate / sprop-maxcapturerate / cbr).

Kept: Firefox SDP regex fix, UA-gated NACK, speaker picker.
2026-06-03 18:12:49 -04:00
fcbac50caf
zebra-report: 320k Opus + drop maxptime + fix Firefox SDP no-op
Choppy persisted after NACK rollback. Dial back to 320k (transparent
threshold, much less stress on uploads alongside screen+camera). Drop
a=maxptime:120 — receivers + 700ms playout buffer don't handle larger
frames well. Fix the SDP regex that silently no-op'd on Firefox
publishers (Firefox's Opus fmtp lacks minptime=10 — the matcher
required it). Firefox publishers will now actually carry the music
codec params.
2026-06-03 18:07:54 -04:00
959d2dc65c
zebra-report: UA-gated audio NACK — Chrome↔Chrome reactive, Firefox honest
RTCRtpSender.getCapabilities probe decides whether to advertise NACK
in our Opus offers. Chromium publishes it (responds to retransmits),
Firefox/Safari omit (can't respond). Receivers honor only what the
sender promised — mixed-browser rooms stay clean, same-browser rooms
get the full reactive recovery.
2026-06-03 18:02:31 -04:00
01bdd802f2
zebra-report: drop audio NACK — Firefox→Chrome listener choppy/skipping
Chrome listeners requested NACK retransmits that Firefox publishers
never replied to (Firefox never implemented the audio NACK responder).
Chrome's jitter buffer waited for recovery that never arrived, then
skipped. useinbandfec + 700ms playout buffer remain.
2026-06-03 17:58:19 -04:00
c2c2183012
zebra-report: music-mode polish — 510k Opus, fullband pins, NACK, speaker picker
Codec headroom + loss resilience without DSP filters:
  - Opus 256k → 510k (spec ceiling) on mic SFU + mesh + screen + game audio
  - Fullband pin: maxplaybackrate / sprop-maxcapturerate = 48000, cbr=0
  - Audio NACK feedback on Opus rtpmap (reactive packet recovery)
  - a=maxptime:120 advertises tolerance for larger peer frames

Playback chain:
  - New speaker-output selector (setSinkId) routes peer audio to a
    chosen sink (studio monitors / external DAC). Hidden on Safari.

Hard refresh required for the new speaker-picker row to appear.
2026-06-03 17:51:34 -04:00
bbe6b14438
zebra-report: JS-bound heartbeat — 15s alive ping while joined
Mirror of zebra-report 1dde43f + proxy.unturf.com edb1009. Closes
the 'backgrounded tab squats in room' gap that WS-level pings
can't catch (browsers auto-pong below JS).
2026-06-03 17:37:41 -04:00
a11826b072
zebra-report: kick + ban buttons; pagehide sends 'bye'
Mirror of zebra-report 740ed2b + proxy.unturf.com 0733d61.

 - moderation: split single 'boot' into 'kick' (rejoinable) and 'ban'
   (blocks pubkey). Server adds matching kick wire-type alongside
   renamed boot→ban.
 - tab-close lifecycle: pagehide handler fires a 'bye' so closing a
   tab triggers a strong-leave (peer-left + SFU evict immediately)
   instead of waiting 8s for the hiccup grace. Fix for the case
   where Will's phone-tab close left audio leaking until the host
   manually kicked him.
2026-06-03 16:57:03 -04:00
60e4548665
zebra-report: rebuild <video> on MSID supplant — autoplay grant resets
Mirror of zebra-report fb7228b. Will refreshed; the supplant ontrack
hit autoplay block on srcObject swap. Fresh <video> dodges the
mid-life play() rejection.
2026-06-03 16:08:08 -04:00
e09a1793b9
zebra-report: surface boot errors + watchFirstFrame keyframe diagnostic
Mirror of zebra-report 3ca9042 + proxy.unturf.com bc04362.

 - moderation: boot failures now log to the moderator's page instead
   of looking like the button did nothing (stale uuid case).
 - diagnostic: watchFirstFrame fires 'still black after 2500ms — no
   keyframe?' if a fresh SFU video tile never decodes a first frame.
 - proxy-side companion: longer keyframe-burst on subscriber attach
   so a dropped PLI no longer leaves the tile permanently black.
2026-06-03 15:51:39 -04:00
19922ee9fa
zebra-report: deploy — mesh PC exponential backoff + give-up cap 2026-06-03 15:15:49 -04:00
c8715dcc71
zebra-report: deploy — latency + link move to full-width footer band 2026-06-03 14:56:39 -04:00
3541827e28
zebra-report: deploy — notice banner moves below 'your hand' 2026-06-03 14:47:19 -04:00
da3f097b64
zebra-report: deploy — preserve mute across leave+rejoin 2026-06-03 14:43:52 -04:00
5b8cce81dd
zebra-report: deploy — leave + step-down chimes 2026-06-03 14:42:59 -04:00
051213e273
zebra-report: deploy — chimes play in background tabs 2026-06-03 13:21:18 -04:00
a044099de5
zebra-report: deploy — 700ms jitter buffer for cross-Wi-Fi voice 2026-06-03 13:19:39 -04:00
12432a2ce5
zebra-report: deploy — classic chimes for join + hand-raise 2026-06-03 13:18:21 -04:00
edb6c6de14
zebra-report: deploy — log mesh-vs-SFU mic decision 2026-06-03 12:57:29 -04:00
a830bf5670
zebra-report: deploy — SFU mic fallback when mesh isn't connected 2026-06-03 12:50:51 -04:00
119c406b8d
zebra-report: deploy — screen PC failure asks user to re-share 2026-06-03 12:45:40 -04:00
1cddcda111
zebra-report: deploy — drop tiles on peer-booted 2026-06-03 12:44:23 -04:00
130e54cad8
zebra-report: deploy — drop tiles of demoted peers immediately 2026-06-03 12:38:57 -04:00
57b92a2c83
zebra-report: deploy — signed mic-state with anti-replay 2026-06-03 12:36:15 -04:00
cd9fd47359
zebra-report: deploy — mic-state re-announce on rejoin 2026-06-03 12:33:37 -04:00
408bcaaf8a
zebra-report: deploy — drop resume banner; richer picker hints 2026-06-03 12:29:51 -04:00
d5e7349321
zebra-report: deploy — screen-share one-click resume banner 2026-06-03 12:24:51 -04:00
e77322ac53
zebra-report: deploy — join-muted explainer 2026-06-03 12:15:58 -04:00
49b7966178
zebra-report: deploy — new promotions start muted 2026-06-03 12:14:47 -04:00
33f0fbec55
zebra-report: deploy — handleRemoteSfuTrack refactor (no behavior change) 2026-06-03 11:24:40 -04:00
b3192df9fe
zebra-report: deploy — share/stop click telemetry 2026-06-03 11:19:07 -04:00
0fecaaa236
zebra-report: deploy — client-log telemetry forward 2026-06-03 11:02:44 -04:00
aeb61c5ce0
zebra-report: deploy — fresh MediaStream per remote video track 2026-06-03 11:01:05 -04:00
8a055ea9fe
zebra-report: deploy — 60s camera window 2026-06-03 10:57:06 -04:00
95e6253698
zebra-report: deploy — send bye on explicit leave 2026-06-03 10:43:17 -04:00
80a38e14c1
zebra-report: deploy — 120s window for screen/game, 15s stays for camera 2026-06-03 10:33:30 -04:00
27a5319d81
zebra-report: deploy — 15s mute-removal window 2026-06-03 10:11:24 -04:00
17a62cfee6
zebra-report: deploy — full pubkey row in identity panel 2026-06-03 09:59:08 -04:00
7adea859e7
zebra-report: deploy — mobile hide-panel keeps single-column stack 2026-06-03 08:16:11 -04:00
646b17e872
zebra-report: deploy — lighter viewing-thumb overlay 2026-06-03 07:20:04 -04:00
6f701dd060
zebra-report: deploy — mobile thumbs full-width 2026-06-02 19:28:17 -04:00
474bf19baa
zebra-report: deploy — thumbs use freed width when panel hidden 2026-06-02 19:25:15 -04:00
d6b28e6c78
zebra-report: deploy — camera orientation re-acquire on rotate 2026-06-02 19:01:13 -04:00
2b37b398e4
zebra-report: deploy — landscape camera + portrait letterbox 2026-06-02 18:35:33 -04:00
2c5576c436
zebra-report: deploy — don't truncate handles 2026-06-02 18:02:42 -04:00
667a76f69f
zebra-report: deploy — log-out confirm spells out the consequences 2026-06-02 17:51:57 -04:00
de26a59e38
zebra-report: deploy 68dd6e3 — drop input label; prefix options 2026-06-02 17:51:18 -04:00
0ac5dea91c
zebra-report: deploy 40cc4a5 — mute survives hard refresh 2026-06-02 17:49:42 -04:00
49fb25d27d
zebra-report: deploy 8631c10 — publish PC auto-rebuild on ICE failure 2026-06-02 17:37:21 -04:00
574ce4e7ff
zebra-report: deploy 3a6b80e — room dies on host-grace expiry 2026-06-02 16:16:30 -04:00
d81dfb991a
zebra-report: deploy f45e956 — room list handles + full pubkeys 2026-06-02 16:02:45 -04:00
29e38868a8
zebra-report: deploy 3041a13 — fix old-watcher-evicts-new-tile on republish 2026-06-02 15:35:02 -04:00
20d045775d
zebra-report: deploy 438e886 — space-closing distinguishes succession vs close 2026-06-02 15:31:30 -04:00
c4e37d3cae
zebra-report: deploy 72d5208 — log full pubkey on every role/spot event 2026-06-02 15:06:47 -04:00
9f89786b87
zebra-report: demotion fixes — keep mesh, drop all publishes, no looked-away noise — mirror 2026-06-02 14:45:17 -04:00
4b3adb0bfd
zebra-report: unified popularity list for screens + cameras + game-shares — mirror 2026-06-02 14:15:13 -04:00
412881d28d
zebra-report: never truncate in logs — mirror 2026-06-02 13:13:43 -04:00
1b88bb6e50
zebra-report: log full-width above footer, 240px resizable — mirror 2026-06-02 13:02:33 -04:00
02f301f6a8
zebra-report: log ontrack with state — diagnostic mirror 2026-06-02 12:46:43 -04:00
fa969c2230
zebra-report: idempotent welcome on signal reconnect — mirror 2026-06-02 12:31:13 -04:00
604f9f1af7
zebra-report: kind=game share + Region Capture crop — mirror 2026-06-02 12:25:57 -04:00
63134d00b4
zebra-report: share gameplay button on spotlit game tile — mirror 2026-06-02 12:16:22 -04:00
d5e050753a
zebra-report: static game thumb cards with '▶ play' cue — mirror 2026-06-02 12:10:52 -04:00
785cbcc705
zebra-report: prune only after data flowed — mirror 2026-06-02 11:39:06 -04:00
791f1d6e09
zebra-report: stop subscribe-close loop — mirror 2026-06-02 11:36:07 -04:00
54196c48c8
zebra-report: listeners auto-spotlight latest screen — mirror 2026-06-02 11:32:11 -04:00
37a52098c5
zebra-report: games as spotlight tiles + broadcast — mirror 2026-06-02 11:29:10 -04:00
d9ff74756a
zebra-report: SFU sub PC rebuild on resume / failure — mirror 2026-06-02 11:25:42 -04:00
20601b913b
zebra-report: games as left-column tiles — mirror 2026-06-02 11:20:17 -04:00
1093f9d141
zebra-report: shadow CallFSM in live page — mirror 2026-06-02 11:13:31 -04:00
e8ec50e3e3
zebra-report: orchestrator + integration tests — mirror 2026-06-02 11:10:18 -04:00
910f92c52a
zebra-report: CallFSM — mirror 2026-06-02 11:07:57 -04:00
0520971ea6
zebra-report: RemoteTileFSM — mirror 2026-06-02 11:05:53 -04:00
a42c877a25
zebra-report: SubscribeFSM — mirror 2026-06-02 11:03:49 -04:00
26b6eb7978
zebra-report: FSM framework + publishSpec + tests — mirror 2026-06-02 11:01:34 -04:00
16007677ef
zebra-report: track mute → debounced tile removal — mirror 2026-06-02 10:55:38 -04:00
f6a89d9276
zebra-report: short-pubkey + dash streamID parse — mirror 2026-06-02 10:52:56 -04:00
d34eb61205
zebra-report: graceful mic re-acquire on BT/USB device swap — mirror 2026-06-02 10:45:55 -04:00
9a3bb7f64b
zebra-report: spotlight broadcast + popularity-sort thumbnails — mirror 2026-06-02 10:40:40 -04:00
e34e540598
zebra-report: thumbnails stay + viewing overlay — mirror 2026-06-02 10:30:00 -04:00
5e4693dc1e
zebra-report: spotlight tile model + click-to-swap — mirror 2026-06-02 10:25:16 -04:00
6e4d58ffab
zebra-report: serialise SFU sub renegotiation + skip own mic echo — mirror 2026-06-02 10:20:49 -04:00
f858869b3e
zebra-report: speakers subscribe to SFU — fixes screen/camera multi-speaker 2026-06-02 10:15:07 -04:00
0d57675de4
zebra-report: drop screen-resume flow — mirror 2026-06-02 09:58:43 -04:00
6114e7962e
zebra-report: auto-rejoin on refresh + camera/screen resume — mirror 2026-06-02 09:52:33 -04:00
7134c4ea28
zebra-report: initial mic-list refresh on page load — mirror 2026-06-02 09:45:12 -04:00
0e09111fef
zebra-report: transparent video bg + UI tweaks — mirror 2026-06-02 09:43:10 -04:00
33cec75073
zebra-report: tile chrome themed — light defaults to white, dark restores black 2026-06-02 09:37:16 -04:00
571dcce792
zebra-report: shrinkable row cells — fix music-mode label overflow 2026-06-02 09:27:57 -04:00
c44192f196
zebra-report: .row style guide + conditional grid templates — mirror 2026-06-02 09:22:13 -04:00
61d1e1fa86
zebra-report: cameras col actually hides when empty — mirror 2026-06-02 09:17:14 -04:00
5d589d9986
zebra-report: grid-only layout — fix controls-eats-viewport bug, no more flex 2026-06-02 09:12:48 -04:00
03afea7dd6
zebra-report: pin cameras column + focus-mode collapse — mirror 2026-06-02 09:03:12 -04:00
493f9fff86
zebra-report: 3-column layout (cameras|screen|controls) — mirror 2026-06-02 08:58:58 -04:00
a6de7024e8
zebra-report: hide-panel toggle + camera PiP overlay — mirror 2026-06-02 08:57:16 -04:00
1e6a6a7c1b
zebra-report: dark default + theme toggle on every page — mirror source 8c90379 2026-06-01 22:18:12 -04:00
53b29a97e8
zebra-report: hoist musicMode + device prefs to fix TDZ blocking init — mirror 2026-06-01 21:59:56 -04:00
8f2c6ea275
zebra-report: real dark mode — mirror source 2026-06-01 21:58:03 -04:00
b20fe5b91e
zebra-report: dark/light invert-everything toggle — mirror source 2026-06-01 21:45:25 -04:00
ee9b9370d5
zebra-report: 400ms jitter buffer — mirror source 2026-06-01 21:40:16 -04:00
5a83718328
zebra-report: persist music-mode + mic/camera device selection — mirror source 2026-06-01 21:38:24 -04:00
97b7ce8883
zebra-report: latency panel adds loss% + jitter — pinpoint audio chops
Mirror source 18e6410.
2026-06-01 21:34:10 -04:00
38892121c8
zebra-report: latency panel + 200ms jitter buffer + DTX off for music + link section
Mirror source 4c13044. Latency panel polls getStats every 2s and
renders one row per live PC with RTT + path kind. Jitter buffer up
to 200ms. Music mode disables Opus DTX (pops on continuous signals).
'share' section renamed 'link' and moved above the log.
2026-06-01 21:25:33 -04:00
44e878db7b
zebra-report: drop broken unmute-audio button from screen/camera tiles
Mirror source.
2026-06-01 21:09:29 -04:00
4a336a2702
zebra-report: kill audio chops (FEC+DTX+jitter buffer) + clear tiles on unshare
Mirror source 353037b. Needs SFU proxy.unturf.com#60a620f deployed for
the NACK + transport-cc feedback that browsers use to retransmit lost
audio packets and react to congestion.
2026-06-01 21:05:37 -04:00
851d2e688f
zebra-report: speakers can toggle camera, separate SFU publish
Mirror source 7ddedc9 — camera publish at 1280x720 @ 1.5Mbps as
kind=camera, with own #cameras grid below the screens. Needs SFU
proxy.unturf.com#017c94b deployed so the kind=camera allowlist
accepts the publish.
2026-06-01 20:43:57 -04:00
1de4b515c1
zebra-report: enforce + log mic constraints — surfaces hidden Firefox processing
Mirror source 3f43379 — applyConstraints after getUserMedia and log
track.getSettings() so users can see if EC/NS/AGC actually got disabled
(some UAs silently keep them on for monitor sources).
2026-06-01 20:33:47 -04:00
dfdd6987d9
zebra-report: log captured audio-track count for screen share + browser hint
Mirror source 1294e96 — Firefox tab/window getDisplayMedia drops audio
silently; surface this in the log so the publisher knows audio didn't
make it and what to do instead.
2026-06-01 20:27:46 -04:00
29f0f3e965
zebra-report: tap-to-play fallback + HTML muted attr — Firefox Android autoplay
Mirror source 6fbeade — set autoplay/playsinline/muted as attributes
not just properties, log play() rejections, show a tap-to-play overlay
when autoplay is blocked.
2026-06-01 20:20:18 -04:00
9b3504b163
zebra-report: broadcast-quality mic + screen — stereo Opus 256k, 1080p30 @ 6Mbps
Mirror source 5affebe — high-fidelity audio + video. Needs SFU
proxy.unturf.com#26913a8 deployed for end-to-end stereo (subscriber
decoders need stereo=1 in the SFU's outgoing fmtp).
2026-06-01 20:18:32 -04:00
4ad776b9d5
zebra-report: wider screen-share layout, trim right-column prose
Mirror source c454164 — full-width body, 360px right column, 92vh
video, four notes cut to ~1/3 their length.
2026-06-01 20:06:12 -04:00
78329ea04d
zebra-report: mute remote screen tiles by default, add unmute button
Mirror source 2fd2ac3 — fixes mobile autoplay so phone listeners
actually see the video pixels (was a black tile because mobile blocks
autoplay of unmuted audio).
2026-06-01 20:02:13 -04:00
39b74ef622
zebra-report: ship local preview tile for screen-share publisher
Mirror zebra-spaces fix + refreshed page-integrity stamps from
git.unturf.com/engineering/unturf/zebra-report d9852e6.
2026-06-01 19:45:30 -04:00
ab79242a50
zebra-report: zebra-spaces screens fill the left column 2026-06-01 15:21:40 -04:00
4ea9e36bb0
zebra-report: zebra-spaces log out button 2026-06-01 15:10:15 -04:00
972439bed6
zebra-report: zebra-spaces screen share via SFU 2026-06-01 14:41:29 -04:00
f3b653170e
zebra-report: zebra-spaces game switcher 2026-05-31 18:35:05 -04:00
40fcac6401
zebra-report: zebra-spaces frames unmario.com in the left column 2026-05-31 16:57:20 -04:00
e4d146728f
zebra-report: zebra-spaces share URL + terminal-block UX; host-your-own SFU section 2026-05-31 15:53:16 -04:00
d5e1e62e1e
zebra-report: zebra-spaces SFU /subscribe carries pubkey; self-boot tears WebRTC 2026-05-31 15:20:11 -04:00
6f2cc0fa7a
zebra-report: zebra-spaces invite buttons stack below the message 2026-05-31 15:10:13 -04:00
910d961dac
zebra-report: zebra-spaces mobile + host-rejoin fixes 2026-05-31 14:19:44 -04:00
a8b184b853
zebra-report: bump mobile body padding to 1.25rem 2026-05-31 14:13:34 -04:00
958ce6331b
zebra-report: zebra-spaces queues SFU ontrack until the matching member joins 2026-05-31 14:08:54 -04:00
a6047bfeaa
zebra-report: zebra-spaces clears the closing-in-30s warning when host returns 2026-05-31 14:02:59 -04:00
8d8ec175b0
zebra-report: zebra-spaces own-mute flips own mic icon 2026-05-31 13:54:25 -04:00
4e83197fbf
zebra-report: every page now mobile-friendly, no horizontal overflow 2026-05-31 13:52:40 -04:00
1119d4a8ed
zebra-report: zebra-spaces grant-mic shortcut + sfu publish diagnostic 2026-05-31 13:25:52 -04:00
ce42275c07
zebra-report: zebra-spaces v0.2 — SFU listener fan-out + role-change notice banner 2026-05-31 12:48:25 -04:00
b9938113ad
zebra-report: zebra-spaces meter survives re-renders, local mic also metered 2026-05-31 12:10:59 -04:00
a5a947861d
zebra-report: zebra-spaces mod-actions drop to a 2nd row under each member 2026-05-31 12:00:11 -04:00
588bad1103
zebra-report: zebra-spaces two-column layout (controls right 50%, timeline left placeholder) 2026-05-31 11:59:12 -04:00
751ee05822
zebra-report: zebra-spaces shows mic + music-mode controls before mic permission 2026-05-31 11:52:38 -04:00
583db0ab97
zebra-report: deploy zebra-spaces v0.1 + refresh integrity stamps
New page: zebra-spaces.html — multi-party voice rooms (host, 2 co-hosts,
speakers, listeners) with persistent Ed25519 identity, password-vault
backup/restore, hand-raise → mic-invite → accept flow, and signed role
transitions enforced server-side. Pairs with the new zebra-spaces-signal
relay on cors-proxy.uncloseai.com.

Other pages (chat.html → index.html, zebra-audio.html, how-it-works.html,
host-your-own.html) refreshed because their integrity stamps rolled
today; nav links to zebra-spaces added on zebra-audio and host-your-own.
2026-05-31 11:07:38 -04:00
847b2414e8
zebra-report: zebra-audio puppet reveal works on mobile (3 taps) 2026-05-29 19:14:15 -04:00
9ecc84e34e
zebra-report: stop displaying peer IP/port in zebra-audio path status
Path status used to show 'you A:B ↔ peer C:D', doxing both participants.
Now shows DIRECT vs RELAYED and candidate types only.
2026-05-29 17:43:40 -04:00
37d34013ef
zebra-report: secret TTS puppet console + host-your-own page
Deploy zebra-audio puppet console (triple-click footer seal: type -> TTS at
speech.ai.unturf.com -> into the call, send/stop) and the new host-your-own
page, plus nav links from chat (index) and how-it-works.
2026-05-29 15:18:00 -04:00
4ae59be669
zebra-report: auto-reconnect on drops + live mic-input switching 2026-05-28 21:29:55 -04:00
f96227ea26
CLAUDE.md: note zebra-report page integrity stamp + re-stamp flow 2026-05-28 19:21:01 -04:00
09ee274287
zebra-report: how-it-works — message encryption walkthrough 2026-05-28 17:58:25 -04:00
3ab9917115
zebra-report: integrity footer (build date + md5/sha256) on all pages 2026-05-28 17:50:21 -04:00
d22c43a2e3
zebra-report: zebra-audio music mode (disable voice isolation) 2026-05-28 17:38:43 -04:00
cb0e5454b1
zebra-report: zebra-audio mic icons (grid) + no button reflow 2026-05-28 15:09:25 -04:00
9a98ef18a5
zebra-report: zebra-audio advertises mic state to both players 2026-05-28 14:58:18 -04:00
5b561bfec6
zebra-report: zebra-audio auto-reconnect + verifiable path indicator 2026-05-28 14:13:39 -04:00
1a46f4a8d0
zebra-report: add zebra-audio voice-call SPA 2026-05-28 13:57:06 -04:00
905ff34f47
CLAUDE.md: refine style guidance + add workstation-balance / 8-capital sections 2026-05-28 13:50:18 -04:00
06c1e2bfec
zebra-report: fetch ephemeral TURN credentials from /turn-cred 2026-05-28 13:27:33 -04:00
11b6abaf13
zebra-report: when relayed, log how to force direct P2P (disable mDNS masking) 2026-05-28 13:09:09 -04:00
a995c8a711
zebra-report: surface media path (direct P2P vs relayed via TURN) 2026-05-28 12:56:52 -04:00
0a218c1a09
zebra-report: add how-it-works write-up + link from chat header 2026-05-28 12:50:36 -04:00
1183e17ba3
zebra-report: exponential retransmit backoff (stop hammering on lost ACK) 2026-05-28 12:44:21 -04:00
abde9079c8
zebra-report: Hamming(12,8) FEC + Gray-coded levels on the modem 2026-05-28 12:41:14 -04:00
4d2b6ba996
zebra-report: full viewport width on desktop (drop max-width cap) 2026-05-28 12:29:11 -04:00
6af92ddf4e
zebra-report: 50:50 setup/chat layout (CSS grid), strip redundant UI 2026-05-28 12:18:05 -04:00
90d5966c08
zebra-report: delivery ACKs + outbox (hold sent msgs until confirmed) 2026-05-28 12:00:30 -04:00
db382f6d44
zebra-report: echo sent message instantly (don't wait for slow transmit) 2026-05-28 11:35:33 -04:00
4eb0aab206
zebra-report: single 440 Hz carrier (kill 1 Hz beat under mono G.711) 2026-05-28 11:34:05 -04:00
c618c2c10d
zebra-report: multi-level volume modem (N-level symbols, ?levels=N) 2026-05-28 11:17:37 -04:00
23b7214b74
zebra-report: widen MARK/SPACE swing to 0.95/0.10 for decode margin 2026-05-28 10:56:12 -04:00
e3340a776b
zebra-report: force G.711/G.722 codec (fix amplitude modem over WebRTC) 2026-05-28 10:51:57 -04:00
c234cb9055
zebra-report: tunable link baud (?baud=N), default 20 for Opus reliability 2026-05-28 10:47:49 -04:00
a502b98fb2
zebra-report: send chat data at decoder baud (fix messages not crossing) 2026-05-28 10:41:46 -04:00
c25cddfc40
zebra-report: publish chunkfive webfont (fix 404 fallback to monospace) 2026-05-28 10:23:56 -04:00
bc8191622c
zebra-report: publish chat UX with signaling-relay auto-connect 2026-05-28 10:09:02 -04:00
9303d5e97f zebra-report: larger QR (320px) 2026-05-27 19:03:56 -04:00
6845ecd3d3 zebra-report: share-link + QR for SDP exchange 2026-05-27 18:37:19 -04:00
885d894023 zebra-report: add proxy.uncloseai.com TURN to iceServers 2026-05-27 17:10:30 -04:00
172d140868 zebra-report: reset button + ICE candidate logging + mDNS hint 2026-05-27 16:39:26 -04:00
3826d818a2 zebra-report: WebRTC P2P rewrite — drop native daemon dep, decode in-browser 2026-05-27 16:16:03 -04:00
b74e838d35 zebra-report: sync chat page — drop self-echo frames at onRxFrame entry 2026-05-27 16:00:29 -04:00
695b6af58f zebra-report: sync chat page, add ?loopback=1 dev mode
mirrors web/chat.html from the zebra-report repo. adds a
BroadcastChannel-based loopback gated on ?loopback=1 so two
tabs of a same browser can round-trip frames without zebrad,
useful for UX validation while a real PulseAudio introspector
daemon stays in progress.

yellow warning banner makes dev mode obvious when active.
2026-05-27 15:47:09 -04:00
c2b1883e0a zebra-report: drop production volume modem chatroom
single self-contained page at /zebra-report/. ports recovered web/chat.html
from git.unturf.com/engineering/unturf/zebra-report into this site's layout.

changes vs source:
  * @font-face points at /css/chunkfive/ instead of bundled fonts dir,
    so a single chunkfive copy serves a whole site.
  * back link points at / instead of ./ which looped to self.
  * "recovered rx.c" link points at git.unturf.com repo instead of ./.

what it does:
  * web audio GainNode modulator drives PulseAudio sink-input volume
    between MARK (0.80) & SPACE (0.20) per bit, 50 baud handshake,
    higher rates after benchmark + OFFER/READY exchange.
  * passphrase mode (PBKDF2 600k iter → AES-GCM-256 group key) or
    pubkey mode (ECDH P-256 → AES-GCM-256 pairwise). toggle in UI.
  * no chat content crosses a network packet. wireshark blind.
  * RX path requires a local zebrad introspector at ws://127.0.0.1:7777,
    documented inline on a page. without it, page transmits but cannot
    receive.

dual use posture:
  * page leads with threat model + mitigation panel citing
    foxhop.net/linux-audio-ipc-attack-surface whitepaper.
  * "what this does not protect against" explicit on a page.

CI publishes via .gitlab-ci.yml on master → deploy-www.sh runner.
2026-05-27 15:39:23 -04:00
dd55b64af0
software: swap neopig and undefect positions 2026-05-10 15:02:01 -04:00
c49101626f
seo: add sitemap.xml listing 10 public pages 2026-05-10 07:59:41 -04:00
7e31b8fb29
software: add arborist — Merkle Providence Reverse RAG
Inserted between undefect and nuhomeschool. With 8 articles before
the homeschool pair, 2-col grid renders nuhomeschool & unhomeschool
side by side. Trademark line updated.
2026-05-07 18:09:27 -04:00
a4c4397e85 software: add undefect.com — systematic defect research across open source 2026-04-22 08:36:06 -04:00
e4773775d7 eight-forms: add Mollison ref [2] — Permaculture: A Designers' Manual, p.534, Tagari 1988 2026-04-08 20:53:58 -04:00
47f2b1111c eight-forms: add original PM68 source citation (Ethan C. Roland, Permaculture Magazine No. 68, 2011) 2026-04-08 20:52:43 -04:00
f7bbee3768 style: use 'a permacomputer' not 'the/our permacomputer' across public pages 2026-03-31 20:36:52 -04:00
df9fa52cf0 style: avoid "the", use "our" — writing style rule + sweep 2026-03-31 13:20:23 -04:00
ac49f72946 Moonlight lush: triple density — 6 arp octaves, 4 bass octaves, 7th/9th color tones, 6-voice melody 2026-03-23 12:38:34 -04:00
dfec9e9616 Moonlight wall version: reduce fill density to 58% 2026-03-23 12:28:52 -04:00
fee50e5005 Moonlight piano roll: add #sparse #lush #wall anchor links 2026-03-23 12:19:00 -04:00
2bb4b9b69a Add Moonlight Sonata interactive piano roll
Beethoven Op.27 No.2 Mvt.I — scrolling piano roll with Web Audio fortepiano synthesis.
Three versions: sparse, lush, wall (61k notes from MIDI). Space to play, click to seek.
2026-03-23 12:09:16 -04:00
6e430ec75a Reorder homeschool cards: nuhomeschool before unhomeschool 2026-03-21 09:37:48 -04:00
74dd1b5923 Replace 'Free' with 'Online' in homeschool card descriptions 2026-03-21 09:31:31 -04:00
a8aac62554 Add unhomeschool & nuhomeschool software cards 2026-03-21 09:30:52 -04:00
e045fd4e97 Add uncloseai widget section to styleguide 2026-03-14 11:46:35 -04:00
542b6aeb3d Fix unfirehose logo light mode contrast & add auto-push rule to CLAUDE.md 2026-03-14 10:13:53 -04:00
0978dd5233 Add unfirehose to software page 2026-03-07 20:24:06 -05:00
3f7cb116d0 Add change password link to factory page bottom nav 2026-03-02 15:55:33 -05:00
7a35a9c828 Update caddy snippet to reference proxy.unturf.com config 2026-03-01 19:06:52 -05:00
702e9924ba Add bioplastic factory page with 7-station continuous-flow production line
6 Graphviz diagrams, product catalog, factory economics, distributed hub
replication model. Caddy basic auth snippet for pre-market access control.
Factory link added to bottom nav on process & homeschool pages.
2026-02-28 17:53:58 -05:00
e1bb2c8224 Align all age groups to same 4-day schedule
Sprouts expanded from 2 to 4 days (explore, measure, mix & mold, demold
& decorate). Shoots expanded from 3 to 4 days (gather, make paper,
crosslink & cure, wash & cut). Mixed-age groups now work side by side on
the same daily theme: Explore, Prepare, Transform, Finish.

Added cross-tier overview table showing all three groups per day.
2026-02-27 14:56:04 -05:00
ed075be601 Add homeschool hemp bioplastic recipe page with multi-day crafting progression
Three age-tiered recipes (Sprouts 3-7, Shoots 8-12, Stalks 13-18) broken
into daily sessions with clear inputs, process, & outputs per day. Each
day's output feeds the next day's input. Adult handles heat sources only
for under-13; students 13+ handle all chemistry with supervision.
2026-02-27 11:16:48 -05:00
7e2d5864cc Meme the made up infrastructure costs: $6,900, $42k, $420k, $4.20M 2026-02-27 10:01:24 -05:00
79de506ce2 Update village & town infrastructure costs to $42k & $420k 2026-02-27 09:58:55 -05:00
547e18964d Add recipe link to nav on all pages 2026-02-27 09:56:01 -05:00
957e418fe0 Redesign step labels & footnotes to match site palette
Step labels now use primary green (#43a047) background with white text,
bold weight, letter-spacing, & border-radius matching Pico conventions.
Footnote links switch from lime (#CDDC39) to primary green for proper
contrast in both light & dark modes. Callout boxes gain subtle
border-radius on right side. Styleguide color swatches updated.
2026-02-27 09:43:31 -05:00
aec82574e0 Convert eight forms of capital attribution to footnote with external link 2026-02-27 09:34:15 -05:00
8fff6ce010 Refactor unturf.css with custom properties, add styleguide page
Extract all hardcoded colors into :root CSS custom properties.
Consolidate callout box shared structure into grouped selectors.
Merge brand font-family declarations. Remove redundant box-sizing rule.
Reorganize into 7 clearly labeled sections.

Create /styleguide/ as living reference for every component:
color palette, typography, layout, navigation, step labels,
callout boxes, capital cards, diagrams, footnotes, tables, lists.
2026-02-27 09:31:44 -05:00
1d2427f89c Keep current page link in nav, mark with aria-current for focused style
Every page now shows all nav links instead of omitting its own.
Current page link gets aria-current="page" with reduced opacity
& bold weight so visitors see where they stand.
2026-02-27 09:00:44 -05:00
eef1b92c48 Extract all inline styles into shared unturf.css, add hemp bioplastic recipe page
Move all inline <style> blocks from every HTML page into /css/unturf.css.
Convert inline style attributes to CSS classes across all pages.
Fix footer links so "unturf. software" stays one full link everywhere.
Add hemp bioplastic process/recipe page with 7 diagrams, 3 approaches,
exact quantities, safety notes, & 12 footnoted sources.
Add "no dashes or emdashes" rule to CLAUDE.md.
2026-02-27 08:44:15 -05:00
b14172f41e Convert hemp bioplastic sources to clickable footnotes with inline superscripts 2026-02-27 08:27:16 -05:00
bbe37ea72d Add two-way footnote anchors with back-links on plastics page 2026-02-27 08:24:35 -05:00
5bf0e925b6 Add whitespace below nav links on all pages 2026-02-27 08:22:44 -05:00
7628a9f3e5 Convert plastics sources to clickable footnotes with inline superscript links 2026-02-27 08:20:40 -05:00
4ffd759189 Add hemp bioplastic page with honest numbers on land, yields, & cooperative models 2026-02-27 08:16:31 -05:00
f626ed75aa Enforce lowercase unturf. with ChunkFive font & add cited sources to plastics page 2026-02-27 07:40:28 -05:00
d8ba86012b Remove unnecessary 'the' from manifesto page 2026-02-27 07:09:01 -05:00
b2ecc4a2cd Remove unnecessary 'the' from plastics & eight forms pages 2026-02-26 23:47:31 -05:00
204d62d4e9 Add style rule: avoid 'the' unless absolutely needed 2026-02-26 23:44:27 -05:00
9a93a940d2 Apply style rules across all pages
Replace "and" with "&", eliminate to-be verbs (is/are/was/were),
change "the permacomputer" to "a permacomputer", replace "AI"
with "automated intelligence" on software page.
2026-02-26 23:43:09 -05:00
ec2381a042 Add style rule: automated intelligence, never artificial 2026-02-26 23:32:16 -05:00
fa4bf618e5 Update CLAUDE.md style rules: use & not and, avoid to-be verbs, a permacomputer not the 2026-02-26 23:31:36 -05:00
c133bea007 Add click-to-zoom lightbox for diagrams on all pages 2026-02-26 23:23:00 -05:00
8137d97949 Widen eight forms and single-use plastics pages to 960px 2026-02-26 23:22:13 -05:00
3b84c96e15 Widen eight forms page to 900px, move manifesto diagrams below prose
Diagrams on the manifesto now grouped in a Diagrams section after
the LOVE section, before Action Items. Eight forms of capital page
widened from 640px to 900px for better diagram readability.
2026-02-26 23:21:31 -05:00
5608ccd5d6 Add single-use plastics page with 7 DOT diagrams
Broken cycle, harmony test (tree vs bottle), scale of production
since 1950, the recycling lie, the American way of life mapped
hour by hour, thermal recovery with secondary combustion of sin
gases, and engineer-without alternatives. Links from manifesto nav.
2026-02-26 23:09:18 -05:00
4e95c5199f Add DOT diagrams to manifesto, create eight forms of capital page
Manifesto diagrams (4): quadrivium, trivium, seeds-and-sprouts,
permacomputer-properties. Each rendered to SVG and PNG from DOT source.

Eight forms of capital page with 9 step-by-step diagrams: individual
forms, full mesh, nurture vs transactional, extractive flow,
regenerative flow, knowledge loop, community loop, pollution, and
permacomputer-capital mapping. Maps the eight forms framework to the
permacomputer quadrivium values.
2026-02-26 22:42:34 -05:00
c9efc17746 deploy via proxy.uncloseai.com runner (replace Salt) 2026-02-13 17:20:00 -05:00
timehexon
d1233af576 Replace "AI" with "machine learning" in CLAUDE.md
Machine learning is what we grow. "AI" is forbidden in all
permacomputer discourse, marketing, & documentation.
2026-02-02 19:56:42 +00:00
18d1768af1 new file: google2dd95a728d9c0d9f.html 2026-01-14 15:53:54 -05:00
edc3ac386b Add neopig to trademarks 2026-01-06 11:55:47 -05:00
f0891f1434 Remove phoenix sentence from neopig description 2026-01-06 11:51:13 -05:00
735e53f1d1 Remove pig.py from unsandbox card 2026-01-06 11:49:33 -05:00
5b37b3da1f Add gradient logo styling for neopig card 2026-01-06 11:18:14 -05:00
9c48beca45 Add neopig card & source links for unsandbox, standardize ampersands
- Add neopig card with description & links to about page and pig.py source
- Add pig.py and un-inception source code links to unsandbox card
- Replace "and" with "&" across all project descriptions for consistency
- Update CLAUDE.md with git commit guidelines
2026-01-06 11:10:19 -05:00
813b38c69c Add unsandbox trademark and free software link to home page
- Add unsandbox to reserved trademarks list on software page
- Remove WASM from unsandbox description
- Add tasteful "free software" link below tagline on home page

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-09 07:48:55 -05:00
898aad1839 Add unsandbox.com card to software page with branded styling
Added new project card for unsandbox.com featuring anonymous remote code execution API supporting 42+ programming languages. Positioned alongside uncloseai.com in a 2x2 grid layout. Applied brand styling with ArialPixel font and #c4b550 accent color.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 10:49:30 -05:00
4722d0f4ae Enable dark mode for Remarkbox embeds
Add mode=dark query parameter to Remarkbox embed URLs on both pages to ensure consistent dark mode display matching the site's design.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-12 08:26:20 -05:00
cbc4d48345 Swap Make Post Sell and Remarkbox positions in grid layout 2025-11-03 15:02:52 -05:00
a0fed57091 Add plus emojis to action links, remove h2 tags from logo sections, update uncloseai description to mention both Hermes and Qwen models 2025-11-03 14:55:42 -05:00
91ceab5dbc Remove shop.unturf.com link and adjust grid to 3 columns for both projects 2025-11-03 14:45:21 -05:00
db7390d4fb Reduce navigation link font size to prevent wrapping 2025-11-03 14:44:07 -05:00
36a0fae7f1 Remove historical and business model text from Remarkbox section 2025-11-03 14:42:50 -05:00
e09ab97769 Redesign software page with CSS grid layout - Remarkbox and Make Post Sell side by side, uncloseai spans full width 2025-11-03 14:29:58 -05:00
eb05a88b59 Comment out analytics script
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-15 18:05:44 -04:00
82b067dce8 Add uncloseai.js button to all pages and update copyright to 2025
- Add uncloseai.js floating button to enable AI chat on all pages
- Update copyright year from 2022 to 2025 in permacomputer page

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-15 17:58:27 -04:00
347b4116f5 Add spacing below software page logos
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-15 08:07:24 -04:00
ed93ad542d Link headings and logos to project landing pages 2025-10-15 08:03:58 -04:00
491cb52fbb Make h1 link inherit color (stay white) 2025-10-15 08:03:06 -04:00
78333dcd4d Make unturf. h1 link back to homepage 2025-10-15 08:02:03 -04:00
624fefca04 Increase logo size to 800px (1/3 bigger) 2025-10-15 08:01:23 -04:00
73bc1dd209 Reduce gap on stacked links (mobile) 2025-10-15 08:01:02 -04:00
469913699d Fix grid layout - 4 columns on desktop, increase logo to 600px 2025-10-15 07:59:44 -04:00
ad5b6ded34 Limit logo width to 400px on desktop 2025-10-15 07:58:49 -04:00
05e706b35e Make links horizontal on desktop, vertical on mobile 2025-10-15 07:58:12 -04:00
f81d0990b5 Use CSS Grid for nav links (vertical stack) 2025-10-15 07:57:21 -04:00
50e949caeb Stack navigation links vertically on mobile 2025-10-15 07:57:09 -04:00
fd4bde6166 Fix mobile horizontal scroll and add logo containers
- Add box-sizing border-box and overflow-x hidden
- Wrap logos in containers with light background, padding, radius
- Change img width from 100% to max-width 100%
2025-10-15 07:56:57 -04:00
83405a3002 Change link text to 'unturf. software' 2025-10-15 07:51:58 -04:00
6090f54b36 Add link to software page in permacomputer footer 2025-10-15 07:51:29 -04:00
b23aa92541 Split CI into build and deploy stages like russell.ballestrini.net 2025-10-15 07:49:28 -04:00
019c76b4d5 Trigger rebuild 2025-10-15 07:47:09 -04:00
eba3ccf142 Complete software page redesign
- Change header to 'unturf.' with tagline 'free software so you may grow food not lawn'
- Convert to semantic HTML (hgroup, article, nav) for better Pico CSS styling
- Add ChunkFive font to all headings
- Add project logos (Remarkbox and Make Post Sell) under titles
- Make logos responsive (100% width, max 600px)
- Reorder projects: Make Post Sell, Remarkbox, uncloseai
- Add 'make a shop' and 'make a namespace' action links
- Remove ai.unturf.com link, keep only uncloseai.com
- Update trademark list to include uncloseai
- Change footer link to lowercase 'back to unturf.com'
- Strip most custom CSS, rely on Pico classless styling
2025-10-15 07:42:43 -04:00
0343b44741 Remove uncloseai-book from software page 2025-10-15 07:27:39 -04:00
788345df0c Simplify layout - logos above content, no flex 2025-10-15 07:27:18 -04:00
cb6198c2b5 Remove demo site description from shop.unturf.com link 2025-10-15 07:25:19 -04:00
4aadea1a2c Update software page branding and layout
- Add ChunkFive font to header
- Add logos for Remarkbox and Make Post Sell
- Update Make Post Sell links with makepostsell.com first
- Add demo site description for shop.unturf.com
2025-10-15 07:24:29 -04:00
f9c51b7ea0 Trigger rebuild for software page 2025-10-15 07:20:19 -04:00
6128e482d3 Add software landing page showcasing Unturf projects 2025-10-15 07:12:41 -04:00
cc53ea5cef Update .gitlab-ci.yml 2025-03-02 21:14:03 +00:00
fb50e701d3 Update index.html 2024-12-21 11:06:26 +00:00
c5b282cae7 Update index.html 2024-12-21 10:55:06 +00:00
7aeb7e22c0 host pico css our selves!
new file:   css/pico.classless.min.css
	modified:   growing-systems-of-permanence/index.html
	modified:   let-us-define-a-permacomputer/index.html
2024-11-18 09:49:38 -05:00
16e3bad447 Update let-us-define-a-permacomputer/index.html 2022-07-08 16:12:27 +00:00
96ab37985a Update let-us-define-a-permacomputer/index.html 2022-07-08 16:04:09 +00:00
ca851f67f0 Update make_tarball.sh 2022-06-22 23:11:14 +00:00
b94adf8bf4 Merge branch 'russellballestrini-master-patch-79282' into 'master'
Update make_tarball.sh

See merge request engineering/unturf/www.unturf.com!1
2022-06-22 23:09:55 +00:00
19d0dd3be8 Update make_tarball.sh 2022-06-22 23:09:42 +00:00
4f5d87886c Update .gitlab-ci.yml file 2022-06-22 23:08:10 +00:00
749f148209 discord
modified:   let-us-define-a-permacomputer/index.html
2022-03-28 15:28:55 -04:00
8db357ed1f Trivium -> Quadrivium
modified:   let-us-define-a-permacomputer/index.html
2022-03-28 15:18:06 -04:00
dd31d38a7b Trivium -> Quadrivium
modified:   let-us-define-a-permacomputer/index.html
2022-03-28 13:04:57 -04:00
7590470617 clarify pun in comments. 2022-01-17 04:05:08 +00:00
148 changed files with 24510 additions and 69 deletions

View file

@ -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"'

72
CLAUDE.md Normal file
View file

@ -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 <noreply@anthropic.com>
## 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.

16
caddy/factory-auth.caddy Normal file
View file

@ -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 <bcrypt-hash>
# }
# root * /opt/www/unturf
# file_server
# }

4
css/pico.classless.min.css vendored Normal file

File diff suppressed because one or more lines are too long

332
css/unturf.css Normal file
View file

@ -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;
}
}

View file

@ -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]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

View file

@ -0,0 +1,100 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: community Pages: 1 -->
<svg width="597pt" height="628pt"
viewBox="0.00 0.00 597.00 628.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(36 592)">
<title>community</title>
<!-- social -->
<g id="node1" class="node">
<title>social</title>
<polygon fill="#ff9800" stroke="#e65100" stroke-width="2" points="200,-556 0,-556 0,-491 200,-491 200,-556"/>
<text text-anchor="middle" x="100" y="-527.1" font-family="Helvetica,sans-Serif" font-size="13.00" fill="white">SOCIAL</text>
<text text-anchor="middle" x="100" y="-513.1" font-family="Helvetica,sans-Serif" font-size="13.00" fill="white">relationships · trust · favors</text>
</g>
<!-- cultural -->
<g id="node3" class="node">
<title>cultural</title>
<polygon fill="#9c27b0" stroke="#6a1b9a" stroke-width="3" points="445.5,-397 214.5,-397 214.5,-332 445.5,-332 445.5,-397"/>
<text text-anchor="middle" x="330" y="-375.1" font-family="Helvetica,sans-Serif" font-size="13.00" fill="white">CULTURAL</text>
<text text-anchor="middle" x="330" y="-361.1" font-family="Helvetica,sans-Serif" font-size="13.00" fill="white">shared story · art · ceremony</text>
<text text-anchor="middle" x="330" y="-347.1" font-family="Helvetica,sans-Serif" font-size="13.00" fill="white">(emerges from community only)</text>
</g>
<!-- social&#45;&gt;cultural -->
<g id="edge1" class="edge">
<title>social&#45;&gt;cultural</title>
<path fill="none" stroke="#ff9800" stroke-width="3" d="M146.27,-490.92C183.46,-465.53 235.81,-429.79 275.12,-402.96"/>
<polygon fill="#ff9800" stroke="#ff9800" stroke-width="3" points="277.52,-405.56 283.81,-397.03 273.57,-399.78 277.52,-405.56"/>
<text text-anchor="middle" x="278.5" y="-447" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e65100">relationships weave</text>
<text text-anchor="middle" x="278.5" y="-436" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e65100">into shared meaning</text>
</g>
<!-- spiritual -->
<g id="node2" class="node">
<title>spiritual</title>
<polygon fill="#e91e63" stroke="#ad1457" stroke-width="2" points="413.5,-65 200.5,-65 200.5,0 413.5,0 413.5,-65"/>
<text text-anchor="middle" x="307" y="-36.1" font-family="Helvetica,sans-Serif" font-size="13.00" fill="white">SPIRITUAL</text>
<text text-anchor="middle" x="307" y="-22.1" font-family="Helvetica,sans-Serif" font-size="13.00" fill="white">presence · awareness · depth</text>
</g>
<!-- spiritual&#45;&gt;cultural -->
<g id="edge2" class="edge">
<title>spiritual&#45;&gt;cultural</title>
<path fill="none" stroke="#e91e63" stroke-width="3" d="M352.04,-65.13C380,-87.68 413.46,-120.71 429,-159 452.9,-217.89 407.51,-283.65 370.57,-324.31"/>
<polygon fill="#e91e63" stroke="#e91e63" stroke-width="3" points="367.8,-322.15 363.55,-331.85 372.93,-326.92 367.8,-322.15"/>
<text text-anchor="middle" x="480" y="-196" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#ad1457">depth feeds</text>
<text text-anchor="middle" x="480" y="-185" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#ad1457">collective purpose</text>
</g>
<!-- living -->
<g id="node4" class="node">
<title>living</title>
<polygon fill="#4caf50" stroke="#2e7d32" stroke-width="2" points="180,-225.5 16,-225.5 16,-160.5 180,-160.5 180,-225.5"/>
<text text-anchor="middle" x="98" y="-203.6" font-family="Helvetica,sans-Serif" font-size="13.00" fill="white">LIVING</text>
<text text-anchor="middle" x="98" y="-189.6" font-family="Helvetica,sans-Serif" font-size="13.00" fill="white">stewardship sustained</text>
<text text-anchor="middle" x="98" y="-175.6" font-family="Helvetica,sans-Serif" font-size="13.00" fill="white">across generations</text>
</g>
<!-- cultural&#45;&gt;living -->
<g id="edge3" class="edge">
<title>cultural&#45;&gt;living</title>
<path fill="none" stroke="#9c27b0" stroke-width="3" d="M263.78,-331.96C244.2,-321.53 223.16,-309.19 205,-296 179.48,-277.46 153.8,-253.21 134,-233.01"/>
<polygon fill="#9c27b0" stroke="#9c27b0" stroke-width="3" points="136.45,-230.51 126.98,-225.77 131.43,-235.38 136.45,-230.51"/>
<text text-anchor="middle" x="257" y="-288" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#6a1b9a">shared ethics sustain</text>
<text text-anchor="middle" x="257" y="-277" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#6a1b9a">ecological care</text>
<text text-anchor="middle" x="257" y="-266" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#6a1b9a">for generations</text>
</g>
<!-- note -->
<g id="node5" class="node">
<title>note</title>
<polygon fill="#f3e5f5" stroke="#9c27b0" stroke-width="2" points="393.5,-227 238.5,-227 238.5,-159 399.5,-159 399.5,-221 393.5,-227"/>
<polyline fill="none" stroke="#9c27b0" stroke-width="2" points="393.5,-227 393.5,-221 "/>
<polyline fill="none" stroke="#9c27b0" stroke-width="2" points="399.5,-221 393.5,-221 "/>
<text text-anchor="middle" x="319" y="-214.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#4a148c">cultural capital</text>
<text text-anchor="middle" x="319" y="-202.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#4a148c">is the only form that</text>
<text text-anchor="middle" x="319" y="-190.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#4a148c">can only be gathered</text>
<text text-anchor="middle" x="319" y="-178.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#4a148c">by a community</text>
<text text-anchor="middle" x="319" y="-166.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#4a148c">never by individuals alone</text>
</g>
<!-- cultural&#45;&gt;note -->
<g id="edge6" class="edge">
<title>cultural&#45;&gt;note</title>
<path fill="none" stroke="#9c27b0" stroke-width="3" stroke-dasharray="1,5" d="M327.93,-331.62C326,-301.79 323.12,-257.43 321.15,-227.19"/>
</g>
<!-- living&#45;&gt;social -->
<g id="edge4" class="edge">
<title>living&#45;&gt;social</title>
<path fill="none" stroke="#4caf50" stroke-width="3" stroke-dasharray="5,2" d="M93.22,-225.64C87.79,-265.57 80.15,-336.36 84,-397 85.78,-425.1 89.79,-456.53 93.35,-480.9"/>
<polygon fill="#4caf50" stroke="#4caf50" stroke-width="3" points="89.9,-481.51 94.84,-490.89 96.83,-480.48 89.9,-481.51"/>
<text text-anchor="middle" x="135" y="-367.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2e7d32">abundance creates</text>
<text text-anchor="middle" x="135" y="-356.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2e7d32">space for connection</text>
</g>
<!-- living&#45;&gt;spiritual -->
<g id="edge5" class="edge">
<title>living&#45;&gt;spiritual</title>
<path fill="none" stroke="#4caf50" stroke-width="3" stroke-dasharray="5,2" d="M139.54,-160.5C173.27,-134.92 220.94,-98.77 256.8,-71.57"/>
<polygon fill="#4caf50" stroke="#4caf50" stroke-width="3" points="259.33,-74.05 265.18,-65.22 255.1,-68.47 259.33,-74.05"/>
<text text-anchor="middle" x="253" y="-115" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2e7d32">nature deepens</text>
<text text-anchor="middle" x="253" y="-104" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2e7d32">awareness</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.2 KiB

View file

@ -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]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

View file

@ -0,0 +1,138 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: extractive Pages: 1 -->
<svg width="1010pt" height="594pt"
viewBox="0.00 0.00 1010.00 594.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(36 558)">
<title>extractive</title>
<!-- title -->
<g id="node1" class="node">
<title>title</title>
<polygon fill="transparent" stroke="transparent" stroke-width="2" points="227,-522 0,-522 0,-464 227,-464 227,-522"/>
<text text-anchor="middle" x="113.5" y="-498.2" font-family="Helvetica,sans-Serif" font-size="16.00" fill="#c62828">THE EXTRACTIVE PATTERN</text>
<text text-anchor="middle" x="113.5" y="-480.2" font-family="Helvetica,sans-Serif" font-size="16.00" fill="#c62828">(degenerative)</text>
</g>
<!-- living -->
<g id="node2" class="node">
<title>living</title>
<polygon fill="#4caf50" stroke="#2e7d32" stroke-width="2" points="429,-522 314,-522 314,-464 429,-464 429,-522"/>
<text text-anchor="middle" x="371.5" y="-496.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">LIVING</text>
<text text-anchor="middle" x="371.5" y="-483.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">capital</text>
</g>
<!-- title&#45;&gt;living -->
<!-- material -->
<g id="node3" class="node">
<title>material</title>
<polygon fill="#795548" stroke="#4e342e" stroke-width="2" points="678,-406 563,-406 563,-348 678,-348 678,-406"/>
<text text-anchor="middle" x="620.5" y="-380.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">MATERIAL</text>
<text text-anchor="middle" x="620.5" y="-367.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">capital</text>
</g>
<!-- living&#45;&gt;material -->
<g id="edge1" class="edge">
<title>living&#45;&gt;material</title>
<path fill="none" stroke="#f44336" stroke-width="4" d="M429.17,-466.39C466.22,-448.99 514.76,-426.19 553.54,-407.98"/>
<polygon fill="#f44336" stroke="#f44336" stroke-width="4" points="555.11,-411.11 562.67,-403.69 552.13,-404.77 555.11,-411.11"/>
<text text-anchor="middle" x="496" y="-459" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#c62828">extract</text>
<text text-anchor="middle" x="496" y="-448" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#c62828">resources</text>
</g>
<!-- financial -->
<g id="node4" class="node">
<title>financial</title>
<polygon fill="#607d8b" stroke="#37474f" stroke-width="4" points="938,-232 823,-232 823,-174 938,-174 938,-232"/>
<text text-anchor="middle" x="880.5" y="-206.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">FINANCIAL</text>
<text text-anchor="middle" x="880.5" y="-193.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">capital</text>
</g>
<!-- material&#45;&gt;financial -->
<g id="edge2" class="edge">
<title>material&#45;&gt;financial</title>
<path fill="none" stroke="#f44336" stroke-width="4" d="M666.85,-347.8C698.69,-327.16 742.16,-298.71 780,-273 796.51,-261.78 814.4,-249.3 830.39,-238.02"/>
<polygon fill="#f44336" stroke="#f44336" stroke-width="4" points="832.41,-240.88 838.56,-232.25 828.37,-235.16 832.41,-240.88"/>
<text text-anchor="middle" x="750.5" y="-324" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#c62828">sell</text>
<text text-anchor="middle" x="750.5" y="-313" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#c62828">goods</text>
</g>
<!-- financial&#45;&gt;financial -->
<g id="edge8" class="edge">
<title>financial&#45;&gt;financial</title>
<path fill="none" stroke="#f44336" stroke-width="4" d="M860.79,-232.42C850.57,-260.04 857.14,-290 880.5,-290 901.12,-290 908.66,-266.65 903.11,-242.17"/>
<polygon fill="#f44336" stroke="#f44336" stroke-width="4" points="906.41,-241 900.21,-232.42 899.71,-243 906.41,-241"/>
<text text-anchor="middle" x="880.5" y="-304" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#c62828">exponential</text>
<text text-anchor="middle" x="880.5" y="-293" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#c62828">growth</text>
</g>
<!-- social -->
<g id="node5" class="node">
<title>social</title>
<polygon fill="#ff9800" stroke="#e65100" stroke-width="2" points="678,-290 563,-290 563,-232 678,-232 678,-290"/>
<text text-anchor="middle" x="620.5" y="-264.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">SOCIAL</text>
<text text-anchor="middle" x="620.5" y="-251.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">capital</text>
</g>
<!-- social&#45;&gt;financial -->
<g id="edge3" class="edge">
<title>social&#45;&gt;financial</title>
<path fill="none" stroke="#f44336" stroke-width="2" d="M678.12,-248.27C717.81,-239.35 771.01,-227.39 812.76,-218"/>
<polygon fill="#f44336" stroke="#f44336" stroke-width="2" points="813.58,-221.41 822.57,-215.8 812.04,-214.58 813.58,-221.41"/>
<text text-anchor="middle" x="750.5" y="-251" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#c62828">leverage</text>
<text text-anchor="middle" x="750.5" y="-240" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#c62828">connections</text>
</g>
<!-- cultural -->
<g id="node6" class="node">
<title>cultural</title>
<polygon fill="#9c27b0" stroke="#6a1b9a" stroke-width="2" points="678,-174 563,-174 563,-116 678,-116 678,-174"/>
<text text-anchor="middle" x="620.5" y="-148.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">CULTURAL</text>
<text text-anchor="middle" x="620.5" y="-135.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">capital</text>
</g>
<!-- cultural&#45;&gt;financial -->
<g id="edge4" class="edge">
<title>cultural&#45;&gt;financial</title>
<path fill="none" stroke="#f44336" stroke-width="2" d="M678.12,-157.73C717.81,-166.65 771.01,-178.61 812.76,-188"/>
<polygon fill="#f44336" stroke="#f44336" stroke-width="2" points="812.04,-191.42 822.57,-190.2 813.58,-184.59 812.04,-191.42"/>
<text text-anchor="middle" x="750.5" y="-193" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#c62828">commodify</text>
<text text-anchor="middle" x="750.5" y="-182" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#c62828">art &amp; story</text>
</g>
<!-- spiritual -->
<g id="node7" class="node">
<title>spiritual</title>
<polygon fill="#e91e63" stroke="#ad1457" stroke-width="2" points="678,-58 563,-58 563,0 678,0 678,-58"/>
<text text-anchor="middle" x="620.5" y="-32.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">SPIRITUAL</text>
<text text-anchor="middle" x="620.5" y="-19.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">capital</text>
</g>
<!-- spiritual&#45;&gt;financial -->
<g id="edge5" class="edge">
<title>spiritual&#45;&gt;financial</title>
<path fill="none" stroke="#f44336" stroke-width="2" d="M667.28,-58C699.13,-78.36 742.44,-106.41 780,-132 796.88,-143.5 815.12,-156.38 831.33,-167.99"/>
<polygon fill="#f44336" stroke="#f44336" stroke-width="2" points="829.43,-170.94 839.6,-173.93 833.52,-165.25 829.43,-170.94"/>
<text text-anchor="middle" x="750.5" y="-146" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#c62828">exploit</text>
<text text-anchor="middle" x="750.5" y="-135" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#c62828">faith</text>
</g>
<!-- intellectual -->
<g id="node8" class="node">
<title>intellectual</title>
<polygon fill="#2196f3" stroke="#0d47a1" stroke-width="2" points="429,-406 314,-406 314,-348 429,-348 429,-406"/>
<text text-anchor="middle" x="371.5" y="-380.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">INTELLECTUAL</text>
<text text-anchor="middle" x="371.5" y="-367.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">capital</text>
</g>
<!-- intellectual&#45;&gt;material -->
<g id="edge6" class="edge">
<title>intellectual&#45;&gt;material</title>
<path fill="none" stroke="#888888" stroke-width="1.5" stroke-dasharray="5,2" d="M429.17,-377C465.91,-377 513.94,-377 552.56,-377"/>
<polygon fill="#888888" stroke="#888888" stroke-width="1.5" points="552.67,-380.5 562.67,-377 552.67,-373.5 552.67,-380.5"/>
<text text-anchor="middle" x="496" y="-380" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#666666">facilitate</text>
</g>
<!-- experiential -->
<g id="node9" class="node">
<title>experiential</title>
<polygon fill="#009688" stroke="#00695c" stroke-width="2" points="429,-290 314,-290 314,-232 429,-232 429,-290"/>
<text text-anchor="middle" x="371.5" y="-264.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">EXPERIENTIAL</text>
<text text-anchor="middle" x="371.5" y="-251.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">capital</text>
</g>
<!-- experiential&#45;&gt;material -->
<g id="edge7" class="edge">
<title>experiential&#45;&gt;material</title>
<path fill="none" stroke="#888888" stroke-width="1.5" stroke-dasharray="5,2" d="M429.17,-287.61C466.22,-305.01 514.76,-327.81 553.54,-346.02"/>
<polygon fill="#888888" stroke="#888888" stroke-width="1.5" points="552.13,-349.23 562.67,-350.31 555.11,-342.89 552.13,-349.23"/>
<text text-anchor="middle" x="496" y="-332" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#666666">facilitate</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -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
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

View file

@ -0,0 +1,216 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: mesh Pages: 1 -->
<svg width="595pt" height="586pt"
viewBox="0.00 0.00 594.89 586.20" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(36 550.2)">
<title>mesh</title>
<!-- living -->
<g id="node1" class="node">
<title>living</title>
<ellipse fill="#4caf50" stroke="#2e7d32" stroke-width="2" cx="54" cy="-312.18" rx="54" ry="54"/>
<text text-anchor="middle" x="54" y="-327.88" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">LIVING</text>
<text text-anchor="middle" x="54" y="-302.88" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">soil · water</text>
<text text-anchor="middle" x="54" y="-290.88" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">plants · animals</text>
</g>
<!-- social -->
<g id="node2" class="node">
<title>social</title>
<ellipse fill="#ff9800" stroke="#e65100" stroke-width="2" cx="468.89" cy="-300.1" rx="54" ry="54"/>
<text text-anchor="middle" x="468.89" y="-315.8" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">SOCIAL</text>
<text text-anchor="middle" x="468.89" y="-290.8" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">relationships</text>
<text text-anchor="middle" x="468.89" y="-278.8" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">influence</text>
</g>
<!-- living&#45;&#45;social -->
<g id="edge1" class="edge">
<title>living&#45;&#45;social</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M108.24,-310.6C187.75,-308.29 335.11,-304 414.64,-301.68"/>
</g>
<!-- cultural -->
<g id="node3" class="node">
<title>cultural</title>
<ellipse fill="#9c27b0" stroke="#6a1b9a" stroke-width="2" cx="263.54" cy="-54" rx="54" ry="54"/>
<text text-anchor="middle" x="263.54" y="-69.7" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">CULTURAL</text>
<text text-anchor="middle" x="263.54" y="-44.7" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">shared story</text>
<text text-anchor="middle" x="263.54" y="-32.7" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">art · myth</text>
</g>
<!-- living&#45;&#45;cultural -->
<g id="edge2" class="edge">
<title>living&#45;&#45;cultural</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M88.13,-270.13C127.1,-222.12 190.46,-144.04 229.42,-96.04"/>
</g>
<!-- spiritual -->
<g id="node4" class="node">
<title>spiritual</title>
<ellipse fill="#e91e63" stroke="#ad1457" stroke-width="2" cx="177.83" cy="-460.2" rx="54" ry="54"/>
<text text-anchor="middle" x="177.83" y="-475.9" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">SPIRITUAL</text>
<text text-anchor="middle" x="177.83" y="-450.9" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">karma · faith</text>
<text text-anchor="middle" x="177.83" y="-438.9" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">presence</text>
</g>
<!-- living&#45;&#45;spiritual -->
<g id="edge3" class="edge">
<title>living&#45;&#45;spiritual</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M88.82,-353.81C105.78,-374.07 126.11,-398.37 143.05,-418.63"/>
</g>
<!-- financial -->
<g id="node5" class="node">
<title>financial</title>
<ellipse fill="#607d8b" stroke="#37474f" stroke-width="2" cx="365.74" cy="-448.44" rx="54" ry="54"/>
<text text-anchor="middle" x="365.74" y="-464.14" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">FINANCIAL</text>
<text text-anchor="middle" x="365.74" y="-439.14" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">money</text>
<text text-anchor="middle" x="365.74" y="-427.14" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">currencies</text>
</g>
<!-- living&#45;&#45;financial -->
<g id="edge4" class="edge">
<title>living&#45;&#45;financial</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M103.74,-333.92C162.02,-359.39 257.98,-401.34 316.18,-426.78"/>
</g>
<!-- material -->
<g id="node6" class="node">
<title>material</title>
<ellipse fill="#795548" stroke="#4e342e" stroke-width="2" cx="249.38" cy="-274.26" rx="54" ry="54"/>
<text text-anchor="middle" x="249.38" y="-289.96" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">MATERIAL</text>
<text text-anchor="middle" x="249.38" y="-264.96" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">tools · buildings</text>
<text text-anchor="middle" x="249.38" y="-252.96" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">infrastructure</text>
</g>
<!-- living&#45;&#45;material -->
<g id="edge5" class="edge">
<title>living&#45;&#45;material</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M107.13,-301.87C134.81,-296.5 168.58,-289.94 196.26,-284.57"/>
</g>
<!-- intellectual -->
<g id="node7" class="node">
<title>intellectual</title>
<ellipse fill="#2196f3" stroke="#0d47a1" stroke-width="2" cx="98.96" cy="-129.08" rx="54" ry="54"/>
<text text-anchor="middle" x="98.96" y="-144.78" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">INTELLECTUAL</text>
<text text-anchor="middle" x="98.96" y="-119.78" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">ideas</text>
<text text-anchor="middle" x="98.96" y="-107.78" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">knowledge</text>
</g>
<!-- living&#45;&#45;intellectual -->
<g id="edge6" class="edge">
<title>living&#45;&#45;intellectual</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M66.88,-259.71C72.9,-235.2 80.05,-206.07 86.07,-181.56"/>
</g>
<!-- experiential -->
<g id="node8" class="node">
<title>experiential</title>
<ellipse fill="#009688" stroke="#00695c" stroke-width="2" cx="422.89" cy="-129.81" rx="54" ry="54"/>
<text text-anchor="middle" x="422.89" y="-145.51" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">EXPERIENTIAL</text>
<text text-anchor="middle" x="422.89" y="-120.51" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">know&#45;how</text>
<text text-anchor="middle" x="422.89" y="-108.51" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">skill</text>
</g>
<!-- living&#45;&#45;experiential -->
<g id="edge7" class="edge">
<title>living&#45;&#45;experiential</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M102.61,-288.15C173.33,-253.19 303.85,-188.66 374.47,-153.75"/>
</g>
<!-- social&#45;&#45;cultural -->
<g id="edge8" class="edge">
<title>social&#45;&#45;cultural</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M434.29,-258.63C396.45,-213.29 336.17,-141.05 298.28,-95.64"/>
</g>
<!-- social&#45;&#45;spiritual -->
<g id="edge9" class="edge">
<title>social&#45;&#45;spiritual</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M421.48,-326.18C367.35,-355.95 279.34,-404.36 225.22,-434.13"/>
</g>
<!-- social&#45;&#45;financial -->
<g id="edge10" class="edge">
<title>social&#45;&#45;financial</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M437.94,-344.61C424.89,-363.38 409.72,-385.19 396.67,-403.96"/>
</g>
<!-- social&#45;&#45;material -->
<g id="edge11" class="edge">
<title>social&#45;&#45;material</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M415.19,-293.78C381.17,-289.77 337.34,-284.61 303.28,-280.6"/>
</g>
<!-- social&#45;&#45;intellectual -->
<g id="edge12" class="edge">
<title>social&#45;&#45;intellectual</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M419.76,-277.39C348.91,-244.63 218.79,-184.48 147.99,-151.75"/>
</g>
<!-- social&#45;&#45;experiential -->
<g id="edge13" class="edge">
<title>social&#45;&#45;experiential</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M454.71,-247.62C449.09,-226.8 442.64,-202.92 437.02,-182.12"/>
</g>
<!-- cultural&#45;&#45;spiritual -->
<g id="edge14" class="edge">
<title>cultural&#45;&#45;spiritual</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M252.33,-107.1C235.91,-184.95 205.46,-329.23 189.04,-407.08"/>
</g>
<!-- cultural&#45;&#45;financial -->
<g id="edge15" class="edge">
<title>cultural&#45;&#45;financial</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M277.11,-106.38C296.68,-181.93 332.63,-320.67 352.2,-396.16"/>
</g>
<!-- cultural&#45;&#45;material -->
<g id="edge16" class="edge">
<title>cultural&#45;&#45;material</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M260.06,-108.16C257.86,-142.3 255.04,-186.21 252.85,-220.3"/>
</g>
<!-- cultural&#45;&#45;intellectual -->
<g id="edge17" class="edge">
<title>cultural&#45;&#45;intellectual</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M214.16,-76.53C193.33,-86.03 169.13,-97.07 148.3,-106.57"/>
</g>
<!-- cultural&#45;&#45;experiential -->
<g id="edge18" class="edge">
<title>cultural&#45;&#45;experiential</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M312.65,-77.36C332.13,-86.63 354.48,-97.26 373.94,-106.52"/>
</g>
<!-- spiritual&#45;&#45;financial -->
<g id="edge19" class="edge">
<title>spiritual&#45;&#45;financial</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M231.93,-456.81C256.97,-455.25 286.66,-453.39 311.7,-451.82"/>
</g>
<!-- spiritual&#45;&#45;material -->
<g id="edge20" class="edge">
<title>spiritual&#45;&#45;material</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M197.38,-409.39C207.52,-383.04 219.86,-350.97 229.98,-324.68"/>
</g>
<!-- spiritual&#45;&#45;intellectual -->
<g id="edge21" class="edge">
<title>spiritual&#45;&#45;intellectual</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M165.24,-407.36C150.5,-345.47 126.22,-243.54 111.5,-181.72"/>
</g>
<!-- spiritual&#45;&#45;experiential -->
<g id="edge22" class="edge">
<title>spiritual&#45;&#45;experiential</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M210.12,-416.67C257.04,-353.41 343.57,-236.75 390.53,-173.44"/>
</g>
<!-- financial&#45;&#45;material -->
<g id="edge23" class="edge">
<title>financial&#45;&#45;material</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M335.47,-403.13C318.23,-377.32 296.71,-345.11 279.5,-319.34"/>
</g>
<!-- financial&#45;&#45;intellectual -->
<g id="edge24" class="edge">
<title>financial&#45;&#45;intellectual</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M330.87,-406.69C279.67,-345.4 184.72,-231.74 133.63,-170.59"/>
</g>
<!-- financial&#45;&#45;experiential -->
<g id="edge25" class="edge">
<title>financial&#45;&#45;experiential</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M375.31,-395.11C385.87,-336.2 402.78,-241.92 413.34,-183.05"/>
</g>
<!-- material&#45;&#45;intellectual -->
<g id="edge26" class="edge">
<title>material&#45;&#45;intellectual</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M210.25,-236.49C187.97,-214.98 160.14,-188.13 137.89,-166.65"/>
</g>
<!-- material&#45;&#45;experiential -->
<g id="edge27" class="edge">
<title>material&#45;&#45;experiential</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M290.94,-239.66C318.31,-216.87 354.01,-187.15 381.37,-164.37"/>
</g>
<!-- intellectual&#45;&#45;experiential -->
<g id="edge28" class="edge">
<title>intellectual&#45;&#45;experiential</title>
<path fill="none" stroke="#bdbdbd" stroke-width="1.2" d="M153.18,-129.2C213.06,-129.33 308.92,-129.55 368.77,-129.69"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View file

@ -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]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

View file

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: individual Pages: 1 -->
<svg width="442pt" height="765pt"
viewBox="0.00 0.00 441.70 765.20" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(21.6 743.6)">
<title>individual</title>
<!-- living -->
<g id="node1" class="node">
<title>living</title>
<polygon fill="#4caf50" stroke="#2e7d32" stroke-width="2" points="352,-722 87,-722 87,-679 352,-679 352,-722"/>
<text text-anchor="middle" x="219.5" y="-703.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">LIVING CAPITAL — the foundation</text>
<text text-anchor="middle" x="219.5" y="-692.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">soil · water · plants · animals · health · ecosystems</text>
</g>
<!-- material -->
<g id="node3" class="node">
<title>material</title>
<polygon fill="#795548" stroke="#4e342e" stroke-width="2" points="263.5,-625 17.5,-625 17.5,-582 263.5,-582 263.5,-625"/>
<text text-anchor="middle" x="140.5" y="-606.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">MATERIAL CAPITAL — physical things</text>
<text text-anchor="middle" x="140.5" y="-595.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">tools · buildings · infrastructure · raw resources</text>
</g>
<!-- living&#45;&gt;material -->
<g id="edge1" class="edge">
<title>living&#45;&gt;material</title>
<path fill="none" stroke="#888888" stroke-width="1.5" d="M202.36,-678.89C191.18,-665.44 176.43,-647.71 164.14,-632.93"/>
<polygon fill="#888888" stroke="#888888" stroke-width="1.5" points="166.69,-630.52 157.61,-625.07 161.31,-635 166.69,-630.52"/>
<text text-anchor="middle" x="228" y="-649.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#666666">resources extracted</text>
</g>
<!-- social -->
<g id="node2" class="node">
<title>social</title>
<polygon fill="#ff9800" stroke="#e65100" stroke-width="2" points="253.5,-237 19.5,-237 19.5,-194 253.5,-194 253.5,-237"/>
<text text-anchor="middle" x="136.5" y="-218.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">SOCIAL CAPITAL — influence &amp; connection</text>
<text text-anchor="middle" x="136.5" y="-207.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">relationships · networks · trust · favors owed</text>
</g>
<!-- cultural -->
<g id="node8" class="node">
<title>cultural</title>
<polygon fill="#9c27b0" stroke="#6a1b9a" stroke-width="2" points="263,-140 0,-140 0,-97 263,-97 263,-140"/>
<text text-anchor="middle" x="131.5" y="-121.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">CULTURAL CAPITAL — shared experience</text>
<text text-anchor="middle" x="131.5" y="-110.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">story · myth · song · art · ceremony · shared ethics</text>
</g>
<!-- social&#45;&gt;cultural -->
<g id="edge6" class="edge">
<title>social&#45;&gt;cultural</title>
<path fill="none" stroke="#888888" stroke-width="1.5" d="M135.42,-193.89C134.75,-181.19 133.88,-164.67 133.13,-150.42"/>
<polygon fill="#888888" stroke="#888888" stroke-width="1.5" points="136.6,-149.88 132.58,-140.07 129.61,-150.24 136.6,-149.88"/>
<text text-anchor="middle" x="181.5" y="-164.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#666666">community emerges</text>
</g>
<!-- financial -->
<g id="node4" class="node">
<title>financial</title>
<polygon fill="#607d8b" stroke="#37474f" stroke-width="2" points="234,-528 47,-528 47,-485 234,-485 234,-528"/>
<text text-anchor="middle" x="140.5" y="-509.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">FINANCIAL CAPITAL — the medium</text>
<text text-anchor="middle" x="140.5" y="-498.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">money · currencies · securities</text>
</g>
<!-- material&#45;&gt;financial -->
<g id="edge2" class="edge">
<title>material&#45;&gt;financial</title>
<path fill="none" stroke="#888888" stroke-width="1.5" d="M140.5,-581.89C140.5,-569.19 140.5,-552.67 140.5,-538.42"/>
<polygon fill="#888888" stroke="#888888" stroke-width="1.5" points="144,-538.07 140.5,-528.07 137,-538.07 144,-538.07"/>
<text text-anchor="middle" x="165" y="-552.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#666666">goods sold</text>
</g>
<!-- intellectual -->
<g id="node5" class="node">
<title>intellectual</title>
<polygon fill="#2196f3" stroke="#0d47a1" stroke-width="2" points="238,-431 43,-431 43,-388 238,-388 238,-431"/>
<text text-anchor="middle" x="140.5" y="-412.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">INTELLECTUAL CAPITAL — ideas</text>
<text text-anchor="middle" x="140.5" y="-401.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">concepts · knowledge · theory · truth</text>
</g>
<!-- financial&#45;&gt;intellectual -->
<g id="edge3" class="edge">
<title>financial&#45;&gt;intellectual</title>
<path fill="none" stroke="#888888" stroke-width="1.5" d="M140.5,-484.89C140.5,-472.19 140.5,-455.67 140.5,-441.42"/>
<polygon fill="#888888" stroke="#888888" stroke-width="1.5" points="144,-441.07 140.5,-431.07 137,-441.07 144,-441.07"/>
<text text-anchor="middle" x="181" y="-455.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#666666">education funded</text>
</g>
<!-- experiential -->
<g id="node6" class="node">
<title>experiential</title>
<polygon fill="#009688" stroke="#00695c" stroke-width="2" points="236.5,-334 42.5,-334 42.5,-291 236.5,-291 236.5,-334"/>
<text text-anchor="middle" x="139.5" y="-315.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">EXPERIENTIAL CAPITAL — know&#45;how</text>
<text text-anchor="middle" x="139.5" y="-304.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">embodied skill · practice · mastery</text>
</g>
<!-- intellectual&#45;&gt;experiential -->
<g id="edge4" class="edge">
<title>intellectual&#45;&gt;experiential</title>
<path fill="none" stroke="#888888" stroke-width="1.5" d="M140.28,-387.89C140.15,-375.19 139.98,-358.67 139.83,-344.42"/>
<polygon fill="#888888" stroke="#888888" stroke-width="1.5" points="143.32,-344.04 139.72,-334.07 136.32,-344.11 143.32,-344.04"/>
<text text-anchor="middle" x="178.5" y="-358.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#666666">theory practiced</text>
</g>
<!-- experiential&#45;&gt;social -->
<g id="edge5" class="edge">
<title>experiential&#45;&gt;social</title>
<path fill="none" stroke="#888888" stroke-width="1.5" d="M138.85,-290.89C138.45,-278.19 137.93,-261.67 137.48,-247.42"/>
<polygon fill="#888888" stroke="#888888" stroke-width="1.5" points="140.96,-246.96 137.15,-237.07 133.97,-247.18 140.96,-246.96"/>
<text text-anchor="middle" x="166" y="-261.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#666666">skills shared</text>
</g>
<!-- spiritual -->
<g id="node7" class="node">
<title>spiritual</title>
<polygon fill="#e91e63" stroke="#ad1457" stroke-width="2" points="343,-43 86,-43 86,0 343,0 343,-43"/>
<text text-anchor="middle" x="214.5" y="-24.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">SPIRITUAL CAPITAL — inner depth</text>
<text text-anchor="middle" x="214.5" y="-13.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">karma · faith · presence · awareness of the whole</text>
</g>
<!-- spiritual&#45;&gt;living -->
<g id="edge8" class="edge">
<title>spiritual&#45;&gt;living</title>
<path fill="none" stroke="#888888" stroke-width="1.5" stroke-dasharray="5,2" d="M248.26,-43.03C271.24,-59.85 297.5,-85.96 297.5,-117.5 297.5,-604.5 297.5,-604.5 297.5,-604.5 297.5,-629.31 293.46,-637.2 278.5,-657 274.16,-662.75 268.82,-668.05 263.15,-672.81"/>
<polygon fill="#888888" stroke="#888888" stroke-width="1.5" points="260.99,-670.05 255.26,-678.96 265.3,-675.57 260.99,-670.05"/>
<text text-anchor="middle" x="348" y="-358.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#666666">reverence sustains life</text>
</g>
<!-- cultural&#45;&gt;spiritual -->
<g id="edge7" class="edge">
<title>cultural&#45;&gt;spiritual</title>
<path fill="none" stroke="#888888" stroke-width="1.5" d="M149.51,-96.89C161.26,-83.44 176.75,-65.71 189.66,-50.93"/>
<polygon fill="#888888" stroke="#888888" stroke-width="1.5" points="192.58,-52.91 196.53,-43.07 187.31,-48.3 192.58,-52.91"/>
<text text-anchor="middle" x="216.5" y="-67.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#666666">meaning deepens</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.6 KiB

View file

@ -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"
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View file

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: knowledge Pages: 1 -->
<svg width="815pt" height="228pt"
viewBox="0.00 0.00 815.00 228.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(36 192)">
<title>knowledge</title>
<!-- intellectual -->
<g id="node1" class="node">
<title>intellectual</title>
<polygon fill="#2196f3" stroke="#0d47a1" stroke-width="2" points="139,-72 0,-72 0,0 139,0 139,-72"/>
<text text-anchor="middle" x="69.5" y="-54.1" font-family="Helvetica,sans-Serif" font-size="13.00" fill="white">INTELLECTUAL</text>
<text text-anchor="middle" x="69.5" y="-25.1" font-family="Helvetica,sans-Serif" font-size="13.00" fill="white">read · study</text>
<text text-anchor="middle" x="69.5" y="-11.1" font-family="Helvetica,sans-Serif" font-size="13.00" fill="white">understand theory</text>
</g>
<!-- experiential -->
<g id="node2" class="node">
<title>experiential</title>
<polygon fill="#009688" stroke="#00695c" stroke-width="2" points="435,-156 305,-156 305,-84 435,-84 435,-156"/>
<text text-anchor="middle" x="370" y="-138.1" font-family="Helvetica,sans-Serif" font-size="13.00" fill="white">EXPERIENTIAL</text>
<text text-anchor="middle" x="370" y="-109.1" font-family="Helvetica,sans-Serif" font-size="13.00" fill="white">practice · build</text>
<text text-anchor="middle" x="370" y="-95.1" font-family="Helvetica,sans-Serif" font-size="13.00" fill="white">feel the dough</text>
</g>
<!-- intellectual&#45;&gt;experiential -->
<g id="edge1" class="edge">
<title>intellectual&#45;&gt;experiential</title>
<path fill="none" stroke="#2196f3" stroke-width="3" d="M139.36,-55.38C185.99,-68.5 247.55,-85.82 295.19,-99.23"/>
<polygon fill="#2196f3" stroke="#2196f3" stroke-width="3" points="294.25,-102.6 304.83,-101.94 296.15,-95.86 294.25,-102.6"/>
<text text-anchor="middle" x="222" y="-101" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#0d47a1">apply theory</text>
<text text-anchor="middle" x="222" y="-90" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#0d47a1">through practice</text>
</g>
<!-- living -->
<g id="node3" class="node">
<title>living</title>
<polygon fill="#4caf50" stroke="#2e7d32" stroke-width="2" points="743,-72 612,-72 612,0 743,0 743,-72"/>
<text text-anchor="middle" x="677.5" y="-54.1" font-family="Helvetica,sans-Serif" font-size="13.00" fill="white">LIVING</text>
<text text-anchor="middle" x="677.5" y="-25.1" font-family="Helvetica,sans-Serif" font-size="13.00" fill="white">observe results</text>
<text text-anchor="middle" x="677.5" y="-11.1" font-family="Helvetica,sans-Serif" font-size="13.00" fill="white">harvest feedback</text>
</g>
<!-- experiential&#45;&gt;living -->
<g id="edge2" class="edge">
<title>experiential&#45;&gt;living</title>
<path fill="none" stroke="#009688" stroke-width="3" d="M435.04,-102.39C483.78,-88.99 550.95,-70.52 602.08,-56.46"/>
<polygon fill="#009688" stroke="#009688" stroke-width="3" points="603.04,-59.83 611.75,-53.8 601.18,-53.08 603.04,-59.83"/>
<text text-anchor="middle" x="523.5" y="-104" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#00695c">skilled hands</text>
<text text-anchor="middle" x="523.5" y="-93" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#00695c">transform the land</text>
</g>
<!-- living&#45;&gt;intellectual -->
<g id="edge3" class="edge">
<title>living&#45;&gt;intellectual</title>
<path fill="none" stroke="#4caf50" stroke-width="3" d="M611.77,-28.84C563.2,-23.83 495.02,-17.6 435,-15 377.28,-12.5 362.72,-12.42 305,-15 252.99,-17.32 194.69,-22.53 149.23,-27.18"/>
<polygon fill="#4caf50" stroke="#4caf50" stroke-width="3" points="148.73,-23.72 139.14,-28.23 149.45,-30.68 148.73,-23.72"/>
<text text-anchor="middle" x="370" y="-40" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2e7d32">observation</text>
<text text-anchor="middle" x="370" y="-29" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2e7d32">generates new</text>
<text text-anchor="middle" x="370" y="-18" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2e7d32">understanding</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

View file

@ -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"]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

View file

@ -0,0 +1,132 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: groups Pages: 1 -->
<svg width="977pt" height="381pt"
viewBox="0.00 0.00 977.00 381.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(36 345)">
<title>groups</title>
<g id="clust1" class="cluster">
<title>cluster_nurture</title>
<path fill="#e8f5e9" stroke="#4caf50" stroke-width="3" d="M20,-189C20,-189 663,-189 663,-189 669,-189 675,-195 675,-201 675,-201 675,-289 675,-289 675,-295 669,-301 663,-301 663,-301 20,-301 20,-301 14,-301 8,-295 8,-289 8,-289 8,-201 8,-201 8,-195 14,-189 20,-189"/>
<text text-anchor="middle" x="341.5" y="-285.8" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#2e7d32">NURTURE CAPITALS</text>
<text text-anchor="middle" x="341.5" y="-270.8" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#2e7d32">grow these · cultivate these · protect these</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_transactional</title>
<path fill="#eceff1" stroke="#607d8b" stroke-width="3" d="M244,-8C244,-8 885,-8 885,-8 891,-8 897,-14 897,-20 897,-20 897,-108 897,-108 897,-114 891,-120 885,-120 885,-120 244,-120 244,-120 238,-120 232,-114 232,-108 232,-108 232,-20 232,-20 232,-14 238,-8 244,-8"/>
<text text-anchor="middle" x="564.5" y="-104.8" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#37474f">TRANSACTIONAL CAPITALS</text>
<text text-anchor="middle" x="564.5" y="-89.8" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#37474f">facilitate exchange · instrumental · tools</text>
</g>
<!-- living -->
<g id="node1" class="node">
<title>living</title>
<polygon fill="#4caf50" stroke="#2e7d32" stroke-width="2" points="667,-255 537,-255 537,-197 667,-197 667,-255"/>
<text text-anchor="middle" x="602" y="-229.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">LIVING</text>
<text text-anchor="middle" x="602" y="-216.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">soil · water · life</text>
</g>
<!-- financial -->
<g id="node5" class="node">
<title>financial</title>
<polygon fill="#607d8b" stroke="#37474f" stroke-width="2" points="370,-74 240,-74 240,-16 370,-16 370,-74"/>
<text text-anchor="middle" x="305" y="-48.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">FINANCIAL</text>
<text text-anchor="middle" x="305" y="-35.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">money · currency</text>
</g>
<!-- living&#45;&gt;financial -->
<g id="edge1" class="edge">
<title>living&#45;&gt;financial</title>
<path fill="none" stroke="#f44336" stroke-width="3" d="M538.39,-196.97C530.59,-194.04 522.67,-191.3 515,-189 452.13,-170.13 423.28,-199.33 370,-161 343.26,-141.76 326.06,-107.91 316.12,-81.9"/>
<polygon fill="#f44336" stroke="#f44336" stroke-width="3" points="318.64,-80.65 313.26,-74.1 313.38,-82.58 318.64,-80.65"/>
<text text-anchor="middle" x="412.5" y="-153" font-family="Times,serif" font-size="10.00" fill="#c62828">current system</text>
<text text-anchor="middle" x="412.5" y="-142" font-family="Times,serif" font-size="10.00" fill="#c62828">extracts nurture</text>
<text text-anchor="middle" x="412.5" y="-131" font-family="Times,serif" font-size="10.00" fill="#c62828">to grow financial</text>
</g>
<!-- social -->
<g id="node2" class="node">
<title>social</title>
<polygon fill="#ff9800" stroke="#e65100" stroke-width="2" points="147.5,-255 16.5,-255 16.5,-197 147.5,-197 147.5,-255"/>
<text text-anchor="middle" x="82" y="-229.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">SOCIAL</text>
<text text-anchor="middle" x="82" y="-216.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">relationships · trust</text>
</g>
<!-- social&#45;&gt;financial -->
<g id="edge2" class="edge">
<title>social&#45;&gt;financial</title>
<path fill="none" stroke="#f44336" stroke-width="3" d="M117.34,-196.64C157.05,-164.76 221.47,-113.05 263.53,-79.28"/>
<polygon fill="#f44336" stroke="#f44336" stroke-width="3" points="265.34,-81.42 269.83,-74.23 261.84,-77.05 265.34,-81.42"/>
</g>
<!-- cultural -->
<g id="node3" class="node">
<title>cultural</title>
<polygon fill="#9c27b0" stroke="#6a1b9a" stroke-width="2" points="321,-255 191,-255 191,-197 321,-197 321,-255"/>
<text text-anchor="middle" x="256" y="-229.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">CULTURAL</text>
<text text-anchor="middle" x="256" y="-216.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">shared story · art</text>
</g>
<!-- cultural&#45;&gt;financial -->
<g id="edge3" class="edge">
<title>cultural&#45;&gt;financial</title>
<path fill="none" stroke="#f44336" stroke-width="3" d="M263.42,-196.96C268.58,-177.58 275.64,-151.2 282,-128 286.16,-112.84 290.83,-96.13 294.87,-81.77"/>
<polygon fill="#f44336" stroke="#f44336" stroke-width="3" points="297.57,-82.52 297.04,-74.06 292.18,-81 297.57,-82.52"/>
</g>
<!-- spiritual -->
<g id="node4" class="node">
<title>spiritual</title>
<polygon fill="#e91e63" stroke="#ad1457" stroke-width="2" points="494,-255 364,-255 364,-197 494,-197 494,-255"/>
<text text-anchor="middle" x="429" y="-229.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">SPIRITUAL</text>
<text text-anchor="middle" x="429" y="-216.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">faith · presence</text>
</g>
<!-- spiritual&#45;&gt;financial -->
<g id="edge4" class="edge">
<title>spiritual&#45;&gt;financial</title>
<path fill="none" stroke="#f44336" stroke-width="3" d="M370.2,-196.97C355.47,-187.42 341.03,-175.43 331,-161 315.01,-137.99 308.69,-106.72 306.26,-82.59"/>
<polygon fill="#f44336" stroke="#f44336" stroke-width="3" points="309.03,-82.11 305.56,-74.38 303.45,-82.59 309.03,-82.11"/>
</g>
<!-- financial&#45;&gt;living -->
<g id="edge5" class="edge">
<title>financial&#45;&gt;living</title>
<path fill="none" stroke="#4caf50" stroke-width="3" stroke-dasharray="5,2" d="M329.58,-74.31C345.39,-90.53 367.36,-109.66 391,-120 419.69,-132.54 432.34,-115.39 461,-128 481.47,-137.01 481,-147.72 499,-161 513.84,-171.95 530.58,-182.89 546.19,-192.56"/>
<polygon fill="#4caf50" stroke="#4caf50" stroke-width="3" points="544.98,-195.11 553.27,-196.91 547.91,-190.33 544.98,-195.11"/>
<text text-anchor="middle" x="552" y="-153" font-family="Times,serif" font-size="10.00" fill="#2e7d32">regenerative system</text>
<text text-anchor="middle" x="552" y="-142" font-family="Times,serif" font-size="10.00" fill="#2e7d32">invests transactional</text>
<text text-anchor="middle" x="552" y="-131" font-family="Times,serif" font-size="10.00" fill="#2e7d32">back into nurture</text>
</g>
<!-- material -->
<g id="node6" class="node">
<title>material</title>
<polygon fill="#795548" stroke="#4e342e" stroke-width="2" points="716,-74 586,-74 586,-16 716,-16 716,-74"/>
<text text-anchor="middle" x="651" y="-48.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">MATERIAL</text>
<text text-anchor="middle" x="651" y="-35.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">tools · buildings</text>
</g>
<!-- intellectual -->
<g id="node7" class="node">
<title>intellectual</title>
<polygon fill="#2196f3" stroke="#0d47a1" stroke-width="2" points="543,-74 413,-74 413,-16 543,-16 543,-74"/>
<text text-anchor="middle" x="478" y="-48.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">INTELLECTUAL</text>
<text text-anchor="middle" x="478" y="-35.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">ideas · knowledge</text>
</g>
<!-- intellectual&#45;&gt;living -->
<g id="edge6" class="edge">
<title>intellectual&#45;&gt;living</title>
<path fill="none" stroke="#2196f3" stroke-width="1.5" stroke-dasharray="5,2" d="M503.1,-74.32C518.94,-90.34 540.76,-109.25 564,-120 584.83,-129.63 600.09,-110.56 615,-128 629.14,-144.53 625.89,-168.78 619.1,-188.9"/>
<polygon fill="#2196f3" stroke="#2196f3" stroke-width="1.5" points="616.38,-188.19 616.24,-196.66 621.63,-190.12 616.38,-188.19"/>
<text text-anchor="middle" x="659.5" y="-147.3" font-family="Times,serif" font-size="9.00" fill="#1565c0">understanding</text>
<text text-anchor="middle" x="659.5" y="-137.3" font-family="Times,serif" font-size="9.00" fill="#1565c0">guides action</text>
</g>
<!-- experiential -->
<g id="node8" class="node">
<title>experiential</title>
<polygon fill="#009688" stroke="#00695c" stroke-width="2" points="889,-74 759,-74 759,-16 889,-16 889,-74"/>
<text text-anchor="middle" x="824" y="-48.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">EXPERIENTIAL</text>
<text text-anchor="middle" x="824" y="-35.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">skill · know&#45;how</text>
</g>
<!-- experiential&#45;&gt;living -->
<g id="edge7" class="edge">
<title>experiential&#45;&gt;living</title>
<path fill="none" stroke="#009688" stroke-width="1.5" stroke-dasharray="5,2" d="M797.8,-74.16C774.41,-98.55 738.59,-134.03 704,-161 689.7,-172.15 673.39,-183.09 658.06,-192.68"/>
<polygon fill="#009688" stroke="#009688" stroke-width="1.5" points="656.43,-190.4 651.1,-196.99 659.38,-195.16 656.43,-190.4"/>
<text text-anchor="middle" x="773.5" y="-147.3" font-family="Times,serif" font-size="9.00" fill="#00695c">skilled hands</text>
<text text-anchor="middle" x="773.5" y="-137.3" font-family="Times,serif" font-size="9.00" fill="#00695c">heal land</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.4 KiB

View file

@ -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"]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

View file

@ -0,0 +1,149 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: permacomputer_capital Pages: 1 -->
<svg width="1476pt" height="383pt"
viewBox="0.00 0.00 1476.00 383.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(36 347)">
<title>permacomputer_capital</title>
<!-- pc -->
<g id="node1" class="node">
<title>pc</title>
<ellipse fill="#263238" stroke="#cddc39" stroke-width="2" cx="702" cy="-83" rx="79" ry="79"/>
<ellipse fill="none" stroke="#cddc39" stroke-width="2" cx="702" cy="-83" rx="83" ry="83"/>
<text text-anchor="middle" x="702" y="-99.9" font-family="Helvetica,sans-Serif" font-size="12.00" fill="#cddc39">PERMACOMPUTER</text>
<text text-anchor="middle" x="702" y="-72.9" font-family="Helvetica,sans-Serif" font-size="12.00" fill="#cddc39">truth · freedom</text>
<text text-anchor="middle" x="702" y="-59.9" font-family="Helvetica,sans-Serif" font-size="12.00" fill="#cddc39">harmony · love</text>
</g>
<!-- living -->
<g id="node2" class="node">
<title>living</title>
<polygon fill="#4caf50" stroke="#2e7d32" stroke-width="2" points="144,-311 0,-311 0,-242 144,-242 144,-311"/>
<text text-anchor="middle" x="72" y="-298.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">LIVING</text>
<text text-anchor="middle" x="72" y="-273.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">the hardware lives</text>
<text text-anchor="middle" x="72" y="-261.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">repair not replace</text>
<text text-anchor="middle" x="72" y="-249.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">durable materials</text>
</g>
<!-- living&#45;&gt;pc -->
<g id="edge1" class="edge">
<title>living&#45;&gt;pc</title>
<path fill="none" stroke="#4caf50" stroke-width="2" d="M144.05,-248.16C150.1,-246.02 156.15,-243.94 162,-242 318.88,-189.93 504.3,-137.66 611.99,-108.21"/>
<polygon fill="#4caf50" stroke="#4caf50" stroke-width="2" points="613.12,-111.53 621.85,-105.52 611.28,-104.78 613.12,-111.53"/>
<text text-anchor="middle" x="318" y="-201.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#2e7d32">HARMONY</text>
</g>
<!-- intellectual -->
<g id="node3" class="node">
<title>intellectual</title>
<polygon fill="#2196f3" stroke="#0d47a1" stroke-width="2" points="324,-311 180,-311 180,-242 324,-242 324,-311"/>
<text text-anchor="middle" x="252" y="-298.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">INTELLECTUAL</text>
<text text-anchor="middle" x="252" y="-273.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">open source code</text>
<text text-anchor="middle" x="252" y="-261.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">public domain</text>
<text text-anchor="middle" x="252" y="-249.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">seeds to sprout</text>
</g>
<!-- intellectual&#45;&gt;pc -->
<g id="edge2" class="edge">
<title>intellectual&#45;&gt;pc</title>
<path fill="none" stroke="#2196f3" stroke-width="2" d="M324.3,-244.73C403.92,-210.85 531.85,-156.41 616.42,-120.42"/>
<polygon fill="#2196f3" stroke="#2196f3" stroke-width="2" points="617.91,-123.59 625.74,-116.45 615.17,-117.15 617.91,-123.59"/>
<text text-anchor="middle" x="439.5" y="-201.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#0d47a1">TRUTH</text>
</g>
<!-- social -->
<g id="node4" class="node">
<title>social</title>
<polygon fill="#ff9800" stroke="#e65100" stroke-width="2" points="504,-311 360,-311 360,-242 504,-242 504,-311"/>
<text text-anchor="middle" x="432" y="-298.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">SOCIAL</text>
<text text-anchor="middle" x="432" y="-273.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">by the people</text>
<text text-anchor="middle" x="432" y="-261.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">for the people</text>
<text text-anchor="middle" x="432" y="-249.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">voluntary participation</text>
</g>
<!-- social&#45;&gt;pc -->
<g id="edge3" class="edge">
<title>social&#45;&gt;pc</title>
<path fill="none" stroke="#ff9800" stroke-width="2" d="M479.34,-241.92C519.93,-213.13 579.15,-171.13 626.31,-137.68"/>
<polygon fill="#ff9800" stroke="#ff9800" stroke-width="2" points="628.54,-140.39 634.67,-131.75 624.49,-134.69 628.54,-140.39"/>
<text text-anchor="middle" x="557.5" y="-201.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#e65100">FREEDOM</text>
</g>
<!-- experiential -->
<g id="node5" class="node">
<title>experiential</title>
<polygon fill="#009688" stroke="#00695c" stroke-width="2" points="684,-311 540,-311 540,-242 684,-242 684,-311"/>
<text text-anchor="middle" x="612" y="-298.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">EXPERIENTIAL</text>
<text text-anchor="middle" x="612" y="-273.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">all layers accessible</text>
<text text-anchor="middle" x="612" y="-261.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">learn by operating</text>
<text text-anchor="middle" x="612" y="-249.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">human operators</text>
</g>
<!-- experiential&#45;&gt;pc -->
<g id="edge4" class="edge">
<title>experiential&#45;&gt;pc</title>
<path fill="none" stroke="#009688" stroke-width="2" d="M627.88,-241.7C637.59,-221.05 650.46,-193.67 662.75,-167.51"/>
<polygon fill="#009688" stroke="#009688" stroke-width="2" points="665.98,-168.87 667.07,-158.33 659.65,-165.89 665.98,-168.87"/>
<text text-anchor="middle" x="662.5" y="-201.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#00695c">TRUTH</text>
</g>
<!-- cultural -->
<g id="node6" class="node">
<title>cultural</title>
<polygon fill="#9c27b0" stroke="#6a1b9a" stroke-width="2" points="864,-311 720,-311 720,-242 864,-242 864,-311"/>
<text text-anchor="middle" x="792" y="-298.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">CULTURAL</text>
<text text-anchor="middle" x="792" y="-273.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">utopia of the commons</text>
<text text-anchor="middle" x="792" y="-261.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">shared infrastructure</text>
<text text-anchor="middle" x="792" y="-249.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">code outlasts authors</text>
</g>
<!-- cultural&#45;&gt;pc -->
<g id="edge5" class="edge">
<title>cultural&#45;&gt;pc</title>
<path fill="none" stroke="#9c27b0" stroke-width="2" d="M776.12,-241.7C766.41,-221.05 753.54,-193.67 741.25,-167.51"/>
<polygon fill="#9c27b0" stroke="#9c27b0" stroke-width="2" points="744.35,-165.89 736.93,-158.33 738.02,-168.87 744.35,-165.89"/>
<text text-anchor="middle" x="782.5" y="-201.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#6a1b9a">FREEDOM</text>
</g>
<!-- financial -->
<g id="node7" class="node">
<title>financial</title>
<polygon fill="#607d8b" stroke="#37474f" stroke-width="2" points="1044,-311 900,-311 900,-242 1044,-242 1044,-311"/>
<text text-anchor="middle" x="972" y="-298.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">FINANCIAL</text>
<text text-anchor="middle" x="972" y="-273.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">costs near zero</text>
<text text-anchor="middle" x="972" y="-261.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">no monopoly</text>
<text text-anchor="middle" x="972" y="-249.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">free as water</text>
</g>
<!-- financial&#45;&gt;pc -->
<g id="edge6" class="edge">
<title>financial&#45;&gt;pc</title>
<path fill="none" stroke="#607d8b" stroke-width="2" d="M924.66,-241.92C884.07,-213.13 824.85,-171.13 777.69,-137.68"/>
<polygon fill="#607d8b" stroke="#607d8b" stroke-width="2" points="779.51,-134.69 769.33,-131.75 775.46,-140.39 779.51,-134.69"/>
<text text-anchor="middle" x="898.5" y="-201.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#37474f">FREEDOM</text>
</g>
<!-- material -->
<g id="node8" class="node">
<title>material</title>
<polygon fill="#795548" stroke="#4e342e" stroke-width="2" points="1224,-311 1080,-311 1080,-242 1224,-242 1224,-311"/>
<text text-anchor="middle" x="1152" y="-298.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">MATERIAL</text>
<text text-anchor="middle" x="1152" y="-273.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">servers · networks</text>
<text text-anchor="middle" x="1152" y="-261.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">IPv4 · IPv6</text>
<text text-anchor="middle" x="1152" y="-249.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">cryptography</text>
</g>
<!-- material&#45;&gt;pc -->
<g id="edge7" class="edge">
<title>material&#45;&gt;pc</title>
<path fill="none" stroke="#795548" stroke-width="2" d="M1079.7,-244.73C1000.08,-210.85 872.15,-156.41 787.58,-120.42"/>
<polygon fill="#795548" stroke="#795548" stroke-width="2" points="788.83,-117.15 778.26,-116.45 786.09,-123.59 788.83,-117.15"/>
<text text-anchor="middle" x="1016" y="-201.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#4e342e">HARMONY</text>
</g>
<!-- spiritual -->
<g id="node9" class="node">
<title>spiritual</title>
<polygon fill="#e91e63" stroke="#ad1457" stroke-width="2" points="1404,-311 1260,-311 1260,-242 1404,-242 1404,-311"/>
<text text-anchor="middle" x="1332" y="-298.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">SPIRITUAL</text>
<text text-anchor="middle" x="1332" y="-273.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">love as fuel</text>
<text text-anchor="middle" x="1332" y="-261.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">wu wei · effortless</text>
<text text-anchor="middle" x="1332" y="-249.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">homeostasis</text>
</g>
<!-- spiritual&#45;&gt;pc -->
<g id="edge8" class="edge">
<title>spiritual&#45;&gt;pc</title>
<path fill="none" stroke="#e91e63" stroke-width="2" d="M1259.95,-248.16C1253.9,-246.02 1247.85,-243.94 1242,-242 1085.12,-189.93 899.7,-137.66 792.01,-108.21"/>
<polygon fill="#e91e63" stroke="#e91e63" stroke-width="2" points="792.72,-104.78 782.15,-105.52 790.88,-111.53 792.72,-104.78"/>
<text text-anchor="middle" x="1136" y="-201.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#ad1457">LOVE</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View file

@ -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]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

View file

@ -0,0 +1,95 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: pollution Pages: 1 -->
<svg width="1797pt" height="345pt"
viewBox="0.00 0.00 1797.00 345.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(36 309)">
<title>pollution</title>
<text text-anchor="middle" x="862.5" y="-256.2" font-family="Helvetica,sans-Serif" font-size="16.00" fill="#c62828">WHEN CAPITAL ACCUMULATES WITHOUT FLOWING</text>
<text text-anchor="middle" x="862.5" y="-238.2" font-family="Helvetica,sans-Serif" font-size="16.00" fill="#c62828">it becomes pollution</text>
<g id="clust1" class="cluster">
<title>cluster_flow</title>
<path fill="transparent" stroke="#4caf50" stroke-dasharray="5,2" d="M1320,-134C1320,-134 1516,-134 1516,-134 1522,-134 1528,-140 1528,-146 1528,-146 1528,-209 1528,-209 1528,-215 1522,-221 1516,-221 1516,-221 1320,-221 1320,-221 1314,-221 1308,-215 1308,-209 1308,-209 1308,-146 1308,-146 1308,-140 1314,-134 1320,-134"/>
<text text-anchor="middle" x="1418" y="-207.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="#2e7d32">HEALTHY: capital flows</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_pollution</title>
<path fill="transparent" stroke="#f44336" stroke-dasharray="5,2" d="M20,-8C20,-8 1705,-8 1705,-8 1711,-8 1717,-14 1717,-20 1717,-20 1717,-83 1717,-83 1717,-89 1711,-95 1705,-95 1705,-95 20,-95 20,-95 14,-95 8,-89 8,-83 8,-83 8,-20 8,-20 8,-14 14,-8 20,-8"/>
<text text-anchor="middle" x="862.5" y="-81.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="#c62828">STAGNANT: capital hoarded</text>
</g>
<!-- flow -->
<g id="node1" class="node">
<title>flow</title>
<ellipse fill="#c8e6c9" stroke="#4caf50" stroke-width="2" cx="1418" cy="-167" rx="101.53" ry="25"/>
<text text-anchor="middle" x="1418" y="-170.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#1b5e20">pool → flow → pool</text>
<text text-anchor="middle" x="1418" y="-158.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#1b5e20">exchange creates vitality</text>
</g>
<!-- financial_p -->
<g id="node2" class="node">
<title>financial_p</title>
<polygon fill="#607d8b" stroke="#37474f" stroke-width="2" points="1235,-66 1063,-66 1063,-16 1235,-16 1235,-66"/>
<text text-anchor="middle" x="1149" y="-44.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">FINANCIAL pollution</text>
<text text-anchor="middle" x="1149" y="-32.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">paranoia · control · isolation</text>
</g>
<!-- flow&#45;&gt;financial_p -->
<g id="edge1" class="edge">
<title>flow&#45;&gt;financial_p</title>
<path fill="none" stroke="#f44336" stroke-width="2" d="M1366.04,-145.35C1332.59,-131.74 1288.36,-113.13 1250,-95 1234.14,-87.5 1217.15,-78.84 1201.73,-70.73"/>
<polygon fill="#f44336" stroke="#f44336" stroke-width="2" points="1203.32,-67.61 1192.85,-66.03 1200.05,-73.8 1203.32,-67.61"/>
<text text-anchor="middle" x="1306.5" y="-105.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#c62828">hoarding</text>
</g>
<!-- living_p -->
<g id="node4" class="node">
<title>living_p</title>
<polygon fill="#4caf50" stroke="#2e7d32" stroke-width="2" points="1708.5,-66 1481.5,-66 1481.5,-16 1708.5,-16 1708.5,-66"/>
<text text-anchor="middle" x="1595" y="-44.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">LIVING pollution</text>
<text text-anchor="middle" x="1595" y="-32.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">invasive species · ecosystem collapse</text>
</g>
<!-- flow&#45;&gt;living_p -->
<!-- material_p -->
<g id="node3" class="node">
<title>material_p</title>
<polygon fill="#795548" stroke="#4e342e" stroke-width="2" points="1452,-66 1264,-66 1264,-16 1452,-16 1452,-66"/>
<text text-anchor="middle" x="1358" y="-44.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">MATERIAL pollution</text>
<text text-anchor="middle" x="1358" y="-32.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">waste · physical contamination</text>
</g>
<!-- social_p -->
<g id="node5" class="node">
<title>social_p</title>
<polygon fill="#ff9800" stroke="#e65100" stroke-width="2" points="1033.5,-66 868.5,-66 868.5,-16 1033.5,-16 1033.5,-66"/>
<text text-anchor="middle" x="951" y="-44.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">SOCIAL pollution</text>
<text text-anchor="middle" x="951" y="-32.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">parasitism · codependency</text>
</g>
<!-- intellectual_p -->
<g id="node6" class="node">
<title>intellectual_p</title>
<polygon fill="#2196f3" stroke="#0d47a1" stroke-width="2" points="839.5,-66 614.5,-66 614.5,-16 839.5,-16 839.5,-66"/>
<text text-anchor="middle" x="727" y="-44.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">INTELLECTUAL pollution</text>
<text text-anchor="middle" x="727" y="-32.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">ivory tower · detachment from reality</text>
</g>
<!-- experiential_p -->
<g id="node7" class="node">
<title>experiential_p</title>
<polygon fill="#009688" stroke="#00695c" stroke-width="2" points="585.5,-66 400.5,-66 400.5,-16 585.5,-16 585.5,-66"/>
<text text-anchor="middle" x="493" y="-44.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">EXPERIENTIAL pollution</text>
<text text-anchor="middle" x="493" y="-32.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">action addiction · no reflection</text>
</g>
<!-- cultural_p -->
<g id="node8" class="node">
<title>cultural_p</title>
<polygon fill="#9c27b0" stroke="#6a1b9a" stroke-width="2" points="371,-66 201,-66 201,-16 371,-16 371,-66"/>
<text text-anchor="middle" x="286" y="-44.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">CULTURAL pollution</text>
<text text-anchor="middle" x="286" y="-32.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">colonization · disconnection</text>
</g>
<!-- spiritual_p -->
<g id="node9" class="node">
<title>spiritual_p</title>
<polygon fill="#e91e63" stroke="#ad1457" stroke-width="2" points="171.5,-66 16.5,-66 16.5,-16 171.5,-16 171.5,-66"/>
<text text-anchor="middle" x="94" y="-44.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">SPIRITUAL pollution</text>
<text text-anchor="middle" x="94" y="-32.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">cults · hollow institutions</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.6 KiB

View file

@ -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]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

View file

@ -0,0 +1,164 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: regenerative Pages: 1 -->
<svg width="765pt" height="869pt"
viewBox="0.00 0.00 764.50 869.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(36 833)">
<title>regenerative</title>
<!-- title -->
<g id="node1" class="node">
<title>title</title>
<polygon fill="transparent" stroke="transparent" stroke-width="2" points="603,-797 352,-797 352,-739 603,-739 603,-797"/>
<text text-anchor="middle" x="477.5" y="-773.2" font-family="Helvetica,sans-Serif" font-size="16.00" fill="#2e7d32">THE REGENERATIVE PATTERN</text>
<text text-anchor="middle" x="477.5" y="-755.2" font-family="Helvetica,sans-Serif" font-size="16.00" fill="#2e7d32">(grow what survives)</text>
</g>
<!-- financial -->
<g id="node2" class="node">
<title>financial</title>
<polygon fill="#607d8b" stroke="#37474f" stroke-width="2" points="535,-666 420,-666 420,-608 535,-608 535,-666"/>
<text text-anchor="middle" x="477.5" y="-640.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">FINANCIAL</text>
<text text-anchor="middle" x="477.5" y="-627.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">capital</text>
</g>
<!-- title&#45;&gt;financial -->
<!-- living -->
<g id="node3" class="node">
<title>living</title>
<polygon fill="#4caf50" stroke="#2e7d32" stroke-width="4" points="468,-210 353,-210 353,-152 468,-152 468,-210"/>
<text text-anchor="middle" x="410.5" y="-184.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">LIVING</text>
<text text-anchor="middle" x="410.5" y="-171.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">capital</text>
</g>
<!-- financial&#45;&gt;living -->
<g id="edge1" class="edge">
<title>financial&#45;&gt;living</title>
<path fill="none" stroke="#4caf50" stroke-width="4" d="M487.07,-607.7C507.95,-540.78 551.16,-369.17 491.5,-246 486.08,-234.8 477.63,-224.97 468.21,-216.58"/>
<polygon fill="#4caf50" stroke="#4caf50" stroke-width="4" points="470.41,-213.86 460.48,-210.17 465.95,-219.25 470.41,-213.86"/>
<text text-anchor="middle" x="553" y="-412" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2e7d32">invest in</text>
<text text-anchor="middle" x="553" y="-401" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2e7d32">regeneration</text>
</g>
<!-- social -->
<g id="node5" class="node">
<title>social</title>
<polygon fill="#ff9800" stroke="#e65100" stroke-width="2" points="445,-514 330,-514 330,-456 445,-456 445,-514"/>
<text text-anchor="middle" x="387.5" y="-488.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">SOCIAL</text>
<text text-anchor="middle" x="387.5" y="-475.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">capital</text>
</g>
<!-- financial&#45;&gt;social -->
<g id="edge4" class="edge">
<title>financial&#45;&gt;social</title>
<path fill="none" stroke="#4caf50" stroke-width="2" d="M453.14,-607.7C444.47,-596.92 435.01,-584.27 427.5,-572 418.17,-556.76 409.57,-539 402.75,-523.58"/>
<polygon fill="#4caf50" stroke="#4caf50" stroke-width="2" points="405.93,-522.11 398.74,-514.33 399.5,-524.9 405.93,-522.11"/>
<text text-anchor="middle" x="455.5" y="-564" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2e7d32">fund</text>
<text text-anchor="middle" x="455.5" y="-553" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2e7d32">community</text>
</g>
<!-- intellectual -->
<g id="node8" class="node">
<title>intellectual</title>
<polygon fill="#2196f3" stroke="#0d47a1" stroke-width="2" points="115,-514 0,-514 0,-456 115,-456 115,-514"/>
<text text-anchor="middle" x="57.5" y="-488.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">INTELLECTUAL</text>
<text text-anchor="middle" x="57.5" y="-475.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">capital</text>
</g>
<!-- financial&#45;&gt;intellectual -->
<g id="edge5" class="edge">
<title>financial&#45;&gt;intellectual</title>
<path fill="none" stroke="#4caf50" stroke-width="2" d="M419.98,-615.46C343.02,-587.97 206.77,-539.31 125.02,-510.12"/>
<polygon fill="#4caf50" stroke="#4caf50" stroke-width="2" points="125.93,-506.72 115.33,-506.65 123.57,-513.31 125.93,-506.72"/>
<text text-anchor="middle" x="317" y="-564" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2e7d32">fund</text>
<text text-anchor="middle" x="317" y="-553" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2e7d32">education</text>
</g>
<!-- living&#45;&gt;living -->
<g id="edge11" class="edge">
<title>living&#45;&gt;living</title>
<path fill="none" stroke="#2e7d32" stroke-width="3" d="M468.01,-194.97C494.69,-196.49 518,-191.84 518,-181 518,-171.56 500.31,-166.81 478.12,-166.75"/>
<polygon fill="#2e7d32" stroke="#2e7d32" stroke-width="3" points="477.91,-163.25 468.01,-167.03 478.1,-170.25 477.91,-163.25"/>
<text text-anchor="middle" x="551.5" y="-184" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1b5e20">self&#45;renewing</text>
<text text-anchor="middle" x="551.5" y="-173" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1b5e20">abundance</text>
</g>
<!-- material -->
<g id="node4" class="node">
<title>material</title>
<polygon fill="#795548" stroke="#4e342e" stroke-width="2" points="596,-58 481,-58 481,0 596,0 596,-58"/>
<text text-anchor="middle" x="538.5" y="-32.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">MATERIAL</text>
<text text-anchor="middle" x="538.5" y="-19.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">capital</text>
</g>
<!-- living&#45;&gt;material -->
<g id="edge2" class="edge">
<title>living&#45;&gt;material</title>
<path fill="none" stroke="#4caf50" stroke-width="3" stroke-dasharray="5,2" d="M434.58,-151.79C455.31,-127.48 485.37,-92.27 507.82,-65.95"/>
<polygon fill="#4caf50" stroke="#4caf50" stroke-width="3" points="510.7,-67.97 514.53,-58.09 505.38,-63.42 510.7,-67.97"/>
<text text-anchor="middle" x="512" y="-108" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2e7d32">harvest only</text>
<text text-anchor="middle" x="512" y="-97" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2e7d32">surplus</text>
</g>
<!-- material&#45;&gt;financial -->
<g id="edge3" class="edge">
<title>material&#45;&gt;financial</title>
<path fill="none" stroke="#4caf50" stroke-width="2" stroke-dasharray="5,2" d="M575.71,-58.06C607.28,-85.35 647.5,-129.94 647.5,-180 647.5,-486 647.5,-486 647.5,-486 647.5,-543.68 591.79,-584.48 544.15,-608.82"/>
<polygon fill="#4caf50" stroke="#4caf50" stroke-width="2" points="542.46,-605.75 535.05,-613.32 545.57,-612.02 542.46,-605.75"/>
<text text-anchor="middle" x="670" y="-336" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2e7d32">sustain</text>
<text text-anchor="middle" x="670" y="-325" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2e7d32">the cycle</text>
</g>
<!-- cultural -->
<g id="node6" class="node">
<title>cultural</title>
<polygon fill="#9c27b0" stroke="#6a1b9a" stroke-width="2" points="445,-362 330,-362 330,-304 445,-304 445,-362"/>
<text text-anchor="middle" x="387.5" y="-336.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">CULTURAL</text>
<text text-anchor="middle" x="387.5" y="-323.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">capital</text>
</g>
<!-- social&#45;&gt;cultural -->
<g id="edge8" class="edge">
<title>social&#45;&gt;cultural</title>
<path fill="none" stroke="#ff9800" stroke-width="2" d="M386.89,-455.72C386.6,-438.95 386.35,-417.26 386.5,-398 386.57,-389.63 386.68,-380.64 386.81,-372.12"/>
<polygon fill="#ff9800" stroke="#ff9800" stroke-width="2" points="390.31,-372.09 386.97,-362.04 383.31,-371.98 390.31,-372.09"/>
<text text-anchor="middle" x="423" y="-412" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e65100">community</text>
<text text-anchor="middle" x="423" y="-401" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e65100">creates culture</text>
</g>
<!-- cultural&#45;&gt;living -->
<g id="edge9" class="edge">
<title>cultural&#45;&gt;living</title>
<path fill="none" stroke="#9c27b0" stroke-width="2" d="M383.91,-303.87C382.48,-286.96 381.91,-265.08 385.5,-246 387.17,-237.14 390.03,-227.94 393.24,-219.36"/>
<polygon fill="#9c27b0" stroke="#9c27b0" stroke-width="2" points="396.52,-220.59 396.95,-210 390.01,-218 396.52,-220.59"/>
<text text-anchor="middle" x="434.5" y="-260" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#6a1b9a">shared ethics</text>
<text text-anchor="middle" x="434.5" y="-249" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#6a1b9a">sustain stewardship</text>
</g>
<!-- spiritual -->
<g id="node7" class="node">
<title>spiritual</title>
<polygon fill="#e91e63" stroke="#ad1457" stroke-width="2" points="280,-514 165,-514 165,-456 280,-456 280,-514"/>
<text text-anchor="middle" x="222.5" y="-488.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">SPIRITUAL</text>
<text text-anchor="middle" x="222.5" y="-475.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">capital</text>
</g>
<!-- spiritual&#45;&gt;cultural -->
<g id="edge10" class="edge">
<title>spiritual&#45;&gt;cultural</title>
<path fill="none" stroke="#e91e63" stroke-width="2" d="M242.82,-455.99C256.38,-438.3 275.2,-415.56 294.5,-398 306.15,-387.4 319.66,-377.14 332.7,-368.06"/>
<polygon fill="#e91e63" stroke="#e91e63" stroke-width="2" points="334.9,-370.8 341.19,-362.27 330.95,-365.02 334.9,-370.8"/>
<text text-anchor="middle" x="334" y="-412" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#ad1457">depth feeds</text>
<text text-anchor="middle" x="334" y="-401" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#ad1457">shared meaning</text>
</g>
<!-- experiential -->
<g id="node9" class="node">
<title>experiential</title>
<polygon fill="#009688" stroke="#00695c" stroke-width="2" points="233,-362 118,-362 118,-304 233,-304 233,-362"/>
<text text-anchor="middle" x="175.5" y="-336.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">EXPERIENTIAL</text>
<text text-anchor="middle" x="175.5" y="-323.4" font-family="Helvetica,sans-Serif" font-size="12.00" fill="white">capital</text>
</g>
<!-- intellectual&#45;&gt;experiential -->
<g id="edge6" class="edge">
<title>intellectual&#45;&gt;experiential</title>
<path fill="none" stroke="#2196f3" stroke-width="2" d="M77.39,-455.7C89.53,-438.73 105.54,-416.84 120.5,-398 127.83,-388.77 135.98,-379.02 143.72,-369.99"/>
<polygon fill="#2196f3" stroke="#2196f3" stroke-width="2" points="146.49,-372.13 150.38,-362.27 141.19,-367.56 146.49,-372.13"/>
<text text-anchor="middle" x="140.5" y="-412" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#0d47a1">learn by</text>
<text text-anchor="middle" x="140.5" y="-401" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#0d47a1">doing</text>
</g>
<!-- experiential&#45;&gt;living -->
<g id="edge7" class="edge">
<title>experiential&#45;&gt;living</title>
<path fill="none" stroke="#009688" stroke-width="3" d="M219.43,-303.96C258.62,-278.95 316.08,-242.27 357.75,-215.67"/>
<polygon fill="#009688" stroke="#009688" stroke-width="3" points="359.84,-218.49 366.39,-210.15 356.08,-212.58 359.84,-218.49"/>
<text text-anchor="middle" x="335" y="-260" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#00695c">skilled care</text>
<text text-anchor="middle" x="335" y="-249" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#00695c">heals land</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1,303 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>eight forms of capital &#8212; unturf.</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#5871ad">
<meta charset="utf-8">
<link rel="stylesheet" href="/css/chunkfive/stylesheet.css" type="text/css" charset="utf-8" />
<link rel="stylesheet" href="/css/pico.classless.min.css">
<link rel="stylesheet" href="/css/unturf.css">
</head>
<body>
<main class="content-wide">
<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="/let-us-define-a-permacomputer/">manifesto</a> · <a href="/eight-forms-of-capital/" aria-current="page">eight forms of capital</a> · <a href="/single-use-plastics/">single-use plastics</a> · <a href="/hemp-bioplastic/">hemp bioplastic</a> · <a href="/hemp-bioplastic/process/">recipe</a> · <a href="/software/">free software</a></small></center>
<h2>Eight Forms of Capital</h2>
<p>
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.
</p>
<p>
This framework comes from Ethan Roland & Gregory Landua, who noticed that permaculture courses exchanged far more than money.<sup id="ref1"><a href="#fn1">[1]</a></sup> 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&#8217;s earlier categorization of assets in <i>Permaculture: A Designers&#8217; Manual</i>.<sup id="ref2"><a href="#fn2">[2]</a></sup>
</p>
<!-- ============================================================ -->
<!-- STEP 1: THE INDIVIDUAL FORMS -->
<!-- ============================================================ -->
<span class="step-label">STEP 1</span>
<h3>Eight Forms</h3>
<p>Each form of capital exists as a pool (stored amount) & participates in flows (exchanges with other pools). Here they stand, from foundation to emergence:</p>
<figure class="diagram">
<img src="img/individual-forms.svg" alt="The eight forms of capital from foundation to emergence">
<figcaption>from living capital at the foundation to cultural capital as emergent community property</figcaption>
</figure>
<div class="capital-card capital-card--living">
<h4>Living Capital</h4>
<p>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.</p>
</div>
<div class="capital-card capital-card--material">
<h4>Material Capital</h4>
<p>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.</p>
</div>
<div class="capital-card capital-card--financial">
<h4>Financial Capital</h4>
<p>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.</p>
</div>
<div class="capital-card capital-card--intellectual">
<h4>Intellectual Capital</h4>
<p>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.</p>
</div>
<div class="capital-card capital-card--experiential">
<h4>Experiential Capital</h4>
<p>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.</p>
</div>
<div class="capital-card capital-card--social">
<h4>Social Capital</h4>
<p>Influence, connections, relationships, trust, networks. Favors owed & given. Of primary importance in politics, business, & community organizing. Takes forms of equity (goodwill) or debt (obligation).</p>
</div>
<div class="capital-card capital-card--cultural">
<h4>Cultural Capital</h4>
<p>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.</p>
</div>
<div class="capital-card capital-card--spiritual">
<h4>Spiritual Capital</h4>
<p>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.</p>
</div>
<!-- ============================================================ -->
<!-- STEP 2: THE FULL MESH -->
<!-- ============================================================ -->
<span class="step-label">STEP 2</span>
<h3>Full Mesh</h3>
<p>
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.
</p>
<figure class="diagram">
<img src="img/full-mesh.svg" alt="Full mesh showing all 28 connections between eight forms of capital">
<figcaption>28 connections between 8 forms, every node reaches every other node</figcaption>
</figure>
<p>
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.
</p>
<!-- ============================================================ -->
<!-- STEP 3: NURTURE VS TRANSACTIONAL -->
<!-- ============================================================ -->
<span class="step-label">STEP 3</span>
<h3>Two Groups: Nurture & Transactional</h3>
<p>
Eight forms divide into two groups of four. This division reveals how current systems operate & how a regenerative system would differ.
</p>
<figure class="diagram">
<img src="img/nurture-vs-transactional.svg" alt="Nurture capitals versus transactional capitals">
<figcaption>the red arrows show extraction, the green arrows show regeneration</figcaption>
</figure>
<p>
<b>Nurture capitals</b> 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.
</p>
<p>
<b>Transactional capitals</b> facilitate exchange: financial, material, intellectual, experiential. These serve as tools & media. They carry value but do not generate lasting wealth on their own.
</p>
<p>
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.
</p>
<!-- ============================================================ -->
<!-- STEP 4: THE EXTRACTIVE FLOW -->
<!-- ============================================================ -->
<span class="step-label">STEP 4</span>
<h3>An Extractive Pattern</h3>
<p>
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.
</p>
<figure class="diagram">
<img src="img/extractive-flow.svg" alt="The extractive degenerative flow pattern">
<figcaption>one-way extraction, every form feeds financial, financial feeds itself</figcaption>
</figure>
<p>
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.
</p>
<!-- ============================================================ -->
<!-- STEP 5: THE REGENERATIVE FLOW -->
<!-- ============================================================ -->
<span class="step-label">STEP 5</span>
<h3>A Regenerative Pattern</h3>
<p>
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.
</p>
<figure class="diagram">
<img src="img/regenerative-flow.svg" alt="The regenerative flow pattern">
<figcaption>invest in living capital, harvest only surplus, grow what survives</figcaption>
</figure>
<p>
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.
</p>
<!-- ============================================================ -->
<!-- STEP 6: THE KNOWLEDGE LOOP -->
<!-- ============================================================ -->
<span class="step-label">STEP 6</span>
<h3>A Knowledge Loop</h3>
<p>
Three forms of capital create a self-reinforcing cycle of learning & application. Theory meets practice meets observation. Each loop accelerates mastery.
</p>
<figure class="diagram">
<img src="img/knowledge-loop.svg" alt="The knowledge loop: intellectual to experiential to living and back">
<figcaption>read, practice, observe, repeat. theory grounded in dirt.</figcaption>
</figure>
<p>
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.
</p>
<p>
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.
</p>
<!-- ============================================================ -->
<!-- STEP 7: THE COMMUNITY LOOP -->
<!-- ============================================================ -->
<span class="step-label">STEP 7</span>
<h3>A Community Loop</h3>
<p>
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.
</p>
<figure class="diagram">
<img src="img/community-loop.svg" alt="The community loop: social and spiritual feeding into cultural, then into living">
<figcaption>relationships weave into shared meaning, shared meaning sustains the land for generations</figcaption>
</figure>
<p>
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.
</p>
<p>
"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.
</p>
<!-- ============================================================ -->
<!-- STEP 8: THE POLLUTION DIMENSION -->
<!-- ============================================================ -->
<span class="step-label">STEP 8</span>
<h3>When Capital Stagnates</h3>
<p>
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.
</p>
<figure class="diagram">
<img src="img/pollution.svg" alt="Each form of capital and its pollution shadow when hoarded">
<figcaption>capital that stops flowing starts rotting</figcaption>
</figure>
<p>
A system in harmony has appropriate inputs for all of its outputs. Very little waste or pollution during operation. This principle from a <a href="/let-us-define-a-permacomputer/">permacomputer manifesto</a> applies directly. A permacomputer keeps capital flowing: open source releases intellectual capital, voluntary participation circulates social capital, distributed infrastructure prevents material capital from concentrating.
</p>
<!-- ============================================================ -->
<!-- STEP 9: THE PERMACOMPUTER MAPPING -->
<!-- ============================================================ -->
<span class="step-label">STEP 9</span>
<h3>A Permacomputer as Regenerative System</h3>
<p>
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.
</p>
<figure class="diagram">
<img src="img/permacomputer-capital.svg" alt="How each form of capital maps to a permacomputer quadrivium values">
<figcaption>each form of capital maps to one or more quadrivium values: truth, freedom, harmony, love</figcaption>
</figure>
<table>
<thead>
<tr><th>Capital</th><th>Permacomputer Expression</th><th>Quadrivium Value</th></tr>
</thead>
<tbody>
<tr><td>Living</td><td>Durable hardware, repair not replace</td><td>Harmony</td></tr>
<tr><td>Material</td><td>Servers, networks, IPv4/IPv6, cryptography</td><td>Harmony</td></tr>
<tr><td>Financial</td><td>Costs near zero, no monopoly, free as water</td><td>Freedom</td></tr>
<tr><td>Intellectual</td><td>Open source, public domain, seeds to sprout</td><td>Truth</td></tr>
<tr><td>Experiential</td><td>All layers accessible, learn by operating</td><td>Truth</td></tr>
<tr><td>Social</td><td>By the people, for the people, voluntary</td><td>Freedom</td></tr>
<tr><td>Cultural</td><td>Utopia of the commons, code outlasts authors</td><td>Freedom</td></tr>
<tr><td>Spiritual</td><td>Love as fuel, wu wei, homeostasis</td><td>Love</td></tr>
</tbody>
</table>
<p>
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.
</p>
<p>
Grow food not lawn. Grow all eight, not just one.
</p>
<hr>
<h3>Sources</h3>
<div class="footnotes">
<ol>
<li id="fn1">Ethan C. Roland &amp; Gregory Landua, <a href="https://www.regenerativeenterprise.com/" target="_blank"><i>Regenerative Enterprise: Optimizing for Multi-Capital Abundance</i></a> (2013). Original article: Ethan C. Roland, &#8220;Eight Forms of Capital,&#8221; <i>Permaculture Magazine</i>, No. 68 (2011), AppleSeed Permaculture. PDF: <a href="http://appleseedpermaculture.com/wp-content/uploads/2011/04/8_Forms_of_Capital_PM68.pdf" target="_blank">appleseedpermaculture.com/&hellip;/8_Forms_of_Capital_PM68.pdf</a>. Diagrams generated from DOT source files included in this repository. <a href="#ref1">&#8617;</a></li>
<li id="fn2">Bill Mollison, <i>Permaculture: A Designers&#8217; Manual</i>, p.&nbsp;534. Tagari Publications, Tasmania, Australia, 1988. <a href="#ref2">&#8617;</a></li>
</ol>
</div>
<p><a href="/let-us-define-a-permacomputer/">&#8592; back to the manifesto</a></p>
</main>
<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>
<script src="/js/diagram-zoom.js"></script>
<script src="https://uncloseai.com/uncloseai.js" type="module"></script>
</body>
</html>

View file

@ -0,0 +1 @@
google-site-verification: google2dd95a728d9c0d9f.html

View file

@ -13,8 +13,10 @@
<!-- unturf. logo! -->
<link rel="stylesheet" href="/css/chunkfive/stylesheet.css" type="text/css" charset="utf-8" />
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-F3w7mX95PdgyTmZZMECAngseQB83DfGTowi0iMjiWaeVhAn4FJkqJByhZMI3AhiU" crossorigin="anonymous">
<!-- a choice permacomputer CSS stylesheet to-end-all stylesheets, pico.classless.min.css ! woot -->
<!-- you should steal this stylesheet. -->
<!-- <link rel="stylesheet" href="https://unpkg.com/@picocss/pico@latest/css/pico.classless.min.css "> -->
<link rel="stylesheet" href="/css/pico.classless.min.css">
</head>
@ -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 @@
<footer class="pt-5 my-5 text-muted border-top">
<center>
Russell Ballestrini | unturf &middot; &copy; 2021
Russell Ballestrini | <span style="font-family: 'chunkfiveregular';">unturf.</span> &middot; &copy; 2021
</center>
</footer>
</div>
@ -108,5 +112,6 @@
<!-- Bootstrap JavaScript Bundle with Popper -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-/bQdsTh/da6pkI1MST/rWKFNjaCP5gBSY4sEBT38Q/9RBh9AH40zEOg7Hlq2THRZ" crossorigin="anonymous"></script>
<script src="https://uncloseai.com/uncloseai.js" type="module"></script>
</body>
</html>

View file

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

View file

@ -0,0 +1,178 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: acre_yields Pages: 1 -->
<svg width="479pt" height="307pt"
viewBox="0.00 0.00 479.00 307.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 303)">
<title>acre_yields</title>
<polygon fill="#1a1a2e" stroke="transparent" points="-4,4 -4,-303 475,-303 475,4 -4,4"/>
<g id="clust1" class="cluster">
<title>cluster_third</title>
<polygon fill="#1a1a2e" stroke="#cddc39" stroke-dasharray="5,2" points="11,-8 11,-97 463,-97 463,-8 11,-8"/>
<text text-anchor="middle" x="237" y="-83.4" font-family="Helvetica Bold" font-size="12.00" fill="#cddc39">1/3 ACRE</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_one</title>
<polygon fill="#1a1a2e" stroke="#4caf50" stroke-dasharray="5,2" points="11,-105 11,-194 463,-194 463,-105 11,-105"/>
<text text-anchor="middle" x="237" y="-180.4" font-family="Helvetica Bold" font-size="12.00" fill="#4caf50">1 ACRE</text>
</g>
<g id="clust3" class="cluster">
<title>cluster_three</title>
<polygon fill="#1a1a2e" stroke="#2196f3" stroke-dasharray="5,2" points="8,-202 8,-291 463,-291 463,-202 8,-202"/>
<text text-anchor="middle" x="235.5" y="-277.4" font-family="Helvetica Bold" font-size="12.00" fill="#2196f3">3 ACRES</text>
</g>
<!-- t_stalk -->
<g id="node1" class="node">
<title>t_stalk</title>
<polygon fill="#827717" stroke="black" points="86,-60 19,-60 19,-24 86,-24 86,-60"/>
<text text-anchor="middle" x="52.5" y="-45" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">~1,333 kg</text>
<text text-anchor="middle" x="52.5" y="-34" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">dry stalk</text>
</g>
<!-- t_cellulose -->
<g id="node2" class="node">
<title>t_cellulose</title>
<polygon fill="#9e9d24" stroke="black" points="188.5,-60 128.5,-60 128.5,-24 188.5,-24 188.5,-60"/>
<text text-anchor="middle" x="158.5" y="-45" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">~560 kg</text>
<text text-anchor="middle" x="158.5" y="-34" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">cellulose</text>
</g>
<!-- t_stalk&#45;&gt;t_cellulose -->
<g id="edge1" class="edge">
<title>t_stalk&#45;&gt;t_cellulose</title>
<path fill="none" stroke="#888888" d="M86.12,-42C96.22,-42 107.45,-42 117.97,-42"/>
<polygon fill="#888888" stroke="#888888" points="118.17,-45.5 128.17,-42 118.17,-38.5 118.17,-45.5"/>
</g>
<!-- t_plastic -->
<g id="node3" class="node">
<title>t_plastic</title>
<polygon fill="#afb42b" stroke="black" points="293.5,-60 229.5,-60 229.5,-24 293.5,-24 293.5,-60"/>
<text text-anchor="middle" x="261.5" y="-45" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">~400 kg</text>
<text text-anchor="middle" x="261.5" y="-34" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">bioplastic</text>
</g>
<!-- t_cellulose&#45;&gt;t_plastic -->
<g id="edge2" class="edge">
<title>t_cellulose&#45;&gt;t_plastic</title>
<path fill="none" stroke="#888888" d="M188.71,-42C198.14,-42 208.78,-42 218.92,-42"/>
<polygon fill="#888888" stroke="#888888" points="219.24,-45.5 229.24,-42 219.24,-38.5 219.24,-45.5"/>
</g>
<!-- t_serves -->
<g id="node4" class="node">
<title>t_serves</title>
<polygon fill="#263238" stroke="black" points="449,-68 331,-68 331,-16 455,-16 455,-62 449,-68"/>
<polyline fill="none" stroke="black" points="449,-68 449,-62 "/>
<polyline fill="none" stroke="black" points="455,-62 449,-62 "/>
<text text-anchor="middle" x="393" y="-56" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#cddc39">serves ~33 people</text>
<text text-anchor="middle" x="393" y="-45" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#cddc39">packaging only</text>
<text text-anchor="middle" x="393" y="-34" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#cddc39">or 1 household</text>
<text text-anchor="middle" x="393" y="-23" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#cddc39">all replaceable plastic</text>
</g>
<!-- t_plastic&#45;&gt;t_serves -->
<g id="edge3" class="edge">
<title>t_plastic&#45;&gt;t_serves</title>
<path fill="none" stroke="#888888" d="M293.52,-42C301.76,-42 311.02,-42 320.46,-42"/>
<polygon fill="#888888" stroke="#888888" points="320.76,-45.5 330.76,-42 320.76,-38.5 320.76,-45.5"/>
</g>
<!-- o_stalk -->
<g id="node5" class="node">
<title>o_stalk</title>
<polygon fill="#2e7d32" stroke="black" points="86,-157 19,-157 19,-121 86,-121 86,-157"/>
<text text-anchor="middle" x="52.5" y="-142" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">~4,000 kg</text>
<text text-anchor="middle" x="52.5" y="-131" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">dry stalk</text>
</g>
<!-- o_cellulose -->
<g id="node6" class="node">
<title>o_cellulose</title>
<polygon fill="#388e3c" stroke="black" points="192,-157 125,-157 125,-121 192,-121 192,-157"/>
<text text-anchor="middle" x="158.5" y="-142" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">~1,680 kg</text>
<text text-anchor="middle" x="158.5" y="-131" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">cellulose</text>
</g>
<!-- o_stalk&#45;&gt;o_cellulose -->
<g id="edge4" class="edge">
<title>o_stalk&#45;&gt;o_cellulose</title>
<path fill="none" stroke="#888888" d="M86.12,-139C95.22,-139 105.24,-139 114.83,-139"/>
<polygon fill="#888888" stroke="#888888" points="114.99,-142.5 124.99,-139 114.99,-135.5 114.99,-142.5"/>
</g>
<!-- o_plastic -->
<g id="node7" class="node">
<title>o_plastic</title>
<polygon fill="#43a047" stroke="black" points="295,-157 228,-157 228,-121 295,-121 295,-157"/>
<text text-anchor="middle" x="261.5" y="-142" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">~1,200 kg</text>
<text text-anchor="middle" x="261.5" y="-131" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">bioplastic</text>
</g>
<!-- o_cellulose&#45;&gt;o_plastic -->
<g id="edge5" class="edge">
<title>o_cellulose&#45;&gt;o_plastic</title>
<path fill="none" stroke="#888888" d="M192.01,-139C200.13,-139 208.96,-139 217.5,-139"/>
<polygon fill="#888888" stroke="#888888" points="217.7,-142.5 227.7,-139 217.7,-135.5 217.7,-142.5"/>
</g>
<!-- o_serves -->
<g id="node8" class="node">
<title>o_serves</title>
<polygon fill="#263238" stroke="black" points="449,-165 331,-165 331,-113 455,-113 455,-159 449,-165"/>
<polyline fill="none" stroke="black" points="449,-165 449,-159 "/>
<polyline fill="none" stroke="black" points="455,-159 449,-159 "/>
<text text-anchor="middle" x="393" y="-153" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">serves ~100 people</text>
<text text-anchor="middle" x="393" y="-142" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">packaging only</text>
<text text-anchor="middle" x="393" y="-131" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">or 6 households</text>
<text text-anchor="middle" x="393" y="-120" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">all replaceable plastic</text>
</g>
<!-- o_plastic&#45;&gt;o_serves -->
<g id="edge6" class="edge">
<title>o_plastic&#45;&gt;o_serves</title>
<path fill="none" stroke="#888888" d="M295.18,-139C303.07,-139 311.82,-139 320.73,-139"/>
<polygon fill="#888888" stroke="#888888" points="320.82,-142.5 330.82,-139 320.82,-135.5 320.82,-142.5"/>
</g>
<!-- h_stalk -->
<g id="node9" class="node">
<title>h_stalk</title>
<polygon fill="#1565c0" stroke="black" points="89,-254 16,-254 16,-218 89,-218 89,-254"/>
<text text-anchor="middle" x="52.5" y="-239" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">~12,000 kg</text>
<text text-anchor="middle" x="52.5" y="-228" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">dry stalk</text>
</g>
<!-- h_cellulose -->
<g id="node10" class="node">
<title>h_cellulose</title>
<polygon fill="#1976d2" stroke="black" points="192,-254 125,-254 125,-218 192,-218 192,-254"/>
<text text-anchor="middle" x="158.5" y="-239" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">~5,040 kg</text>
<text text-anchor="middle" x="158.5" y="-228" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">cellulose</text>
</g>
<!-- h_stalk&#45;&gt;h_cellulose -->
<g id="edge7" class="edge">
<title>h_stalk&#45;&gt;h_cellulose</title>
<path fill="none" stroke="#888888" d="M89,-236C97.28,-236 106.19,-236 114.75,-236"/>
<polygon fill="#888888" stroke="#888888" points="114.96,-239.5 124.96,-236 114.96,-232.5 114.96,-239.5"/>
</g>
<!-- h_plastic -->
<g id="node11" class="node">
<title>h_plastic</title>
<polygon fill="#1e88e5" stroke="black" points="295,-254 228,-254 228,-218 295,-218 295,-254"/>
<text text-anchor="middle" x="261.5" y="-239" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">~3,600 kg</text>
<text text-anchor="middle" x="261.5" y="-228" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">bioplastic</text>
</g>
<!-- h_cellulose&#45;&gt;h_plastic -->
<g id="edge8" class="edge">
<title>h_cellulose&#45;&gt;h_plastic</title>
<path fill="none" stroke="#888888" d="M192.01,-236C200.13,-236 208.96,-236 217.5,-236"/>
<polygon fill="#888888" stroke="#888888" points="217.7,-239.5 227.7,-236 217.7,-232.5 217.7,-239.5"/>
</g>
<!-- h_serves -->
<g id="node12" class="node">
<title>h_serves</title>
<polygon fill="#263238" stroke="black" points="449,-262 331,-262 331,-210 455,-210 455,-256 449,-262"/>
<polyline fill="none" stroke="black" points="449,-262 449,-256 "/>
<polyline fill="none" stroke="black" points="455,-256 449,-256 "/>
<text text-anchor="middle" x="393" y="-250" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2196f3">serves ~300 people</text>
<text text-anchor="middle" x="393" y="-239" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2196f3">packaging only</text>
<text text-anchor="middle" x="393" y="-228" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2196f3">or 18 households</text>
<text text-anchor="middle" x="393" y="-217" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2196f3">all replaceable plastic</text>
</g>
<!-- h_plastic&#45;&gt;h_serves -->
<g id="edge9" class="edge">
<title>h_plastic&#45;&gt;h_serves</title>
<path fill="none" stroke="#888888" d="M295.18,-236C303.07,-236 311.82,-236 320.73,-236"/>
<polygon fill="#888888" stroke="#888888" points="320.82,-239.5 330.82,-236 320.82,-232.5 320.82,-239.5"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -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=<<B><FONT COLOR="#cccccc" POINT-SIZE="14">what hemp bioplastic can &amp; cannot replace</FONT></B>>
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]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

View file

@ -0,0 +1,129 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: can_vs_cannot Pages: 1 -->
<svg width="459pt" height="494pt"
viewBox="0.00 0.00 459.00 494.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 490)">
<title>can_vs_cannot</title>
<polygon fill="#1a1a2e" stroke="transparent" points="-4,4 -4,-490 455,-490 455,4 -4,4"/>
<text text-anchor="start" x="56" y="-471.8" font-family="Times,serif" font-weight="bold" font-size="14.00" fill="#cccccc">what hemp bioplastic can &amp; cannot replace</text>
<g id="clust1" class="cluster">
<title>cluster_can</title>
<polygon fill="#1a1a2e" stroke="#4caf50" stroke-dasharray="5,2" points="8,-8 8,-455 118,-455 118,-8 8,-8"/>
<text text-anchor="middle" x="63" y="-441.4" font-family="Helvetica Bold" font-size="12.00" fill="#4caf50">CAN REPLACE</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_cannot</title>
<polygon fill="#1a1a2e" stroke="#f44336" stroke-dasharray="5,2" points="126,-8 126,-455 255,-455 255,-8 126,-8"/>
<text text-anchor="middle" x="190.5" y="-441.4" font-family="Helvetica Bold" font-size="12.00" fill="#f44336">CANNOT REPLACE</text>
</g>
<!-- c1 -->
<g id="node1" class="node">
<title>c1</title>
<polygon fill="#2e7d32" stroke="black" points="97.5,-426 28.5,-426 28.5,-390 97.5,-390 97.5,-426"/>
<text text-anchor="middle" x="63" y="-411" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">food trays</text>
<text text-anchor="middle" x="63" y="-400" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">clamshells</text>
</g>
<!-- c2 -->
<g id="node2" class="node">
<title>c2</title>
<polygon fill="#388e3c" stroke="black" points="106.5,-340 19.5,-340 19.5,-304 106.5,-304 106.5,-340"/>
<text text-anchor="middle" x="63" y="-325" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">shopping bags</text>
<text text-anchor="middle" x="63" y="-314" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">produce bags</text>
</g>
<!-- c1&#45;&gt;c2 -->
<!-- c3 -->
<g id="node3" class="node">
<title>c3</title>
<polygon fill="#43a047" stroke="black" points="110,-268 16,-268 16,-232 110,-232 110,-268"/>
<text text-anchor="middle" x="63" y="-253" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">disposable</text>
<text text-anchor="middle" x="63" y="-242" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">cutlery &amp; plates</text>
</g>
<!-- c2&#45;&gt;c3 -->
<!-- c4 -->
<g id="node4" class="node">
<title>c4</title>
<polygon fill="#4caf50" stroke="black" points="97,-196 29,-196 29,-160 97,-160 97,-196"/>
<text text-anchor="middle" x="63" y="-181" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">plant pots</text>
<text text-anchor="middle" x="63" y="-170" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">seed trays</text>
</g>
<!-- c3&#45;&gt;c4 -->
<!-- c5 -->
<g id="node5" class="node">
<title>c5</title>
<polygon fill="#66bb6a" stroke="black" points="96,-124 30,-124 30,-88 96,-88 96,-124"/>
<text text-anchor="middle" x="63" y="-109" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">product</text>
<text text-anchor="middle" x="63" y="-98" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">packaging</text>
</g>
<!-- c4&#45;&gt;c5 -->
<!-- c6 -->
<g id="node6" class="node">
<title>c6</title>
<polygon fill="#81c784" stroke="black" points="98,-52 28,-52 28,-16 98,-16 98,-52"/>
<text text-anchor="middle" x="63" y="-37" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1a1a2e">car interior</text>
<text text-anchor="middle" x="63" y="-26" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1a1a2e">panels</text>
</g>
<!-- c5&#45;&gt;c6 -->
<!-- n1 -->
<g id="node7" class="node">
<title>n1</title>
<polygon fill="#b71c1c" stroke="black" points="221,-426 159,-426 159,-390 221,-390 221,-426"/>
<text text-anchor="middle" x="190" y="-411" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">pipes &amp;</text>
<text text-anchor="middle" x="190" y="-400" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">plumbing</text>
</g>
<!-- n2 -->
<g id="node8" class="node">
<title>n2</title>
<polygon fill="#c62828" stroke="black" points="225,-340 155,-340 155,-304 225,-304 225,-340"/>
<text text-anchor="middle" x="190" y="-325" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">electronics</text>
<text text-anchor="middle" x="190" y="-314" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">housings</text>
</g>
<!-- n1&#45;&gt;n2 -->
<!-- n3 -->
<g id="node9" class="node">
<title>n3</title>
<polygon fill="#d32f2f" stroke="black" points="218,-268 162,-268 162,-232 218,-232 218,-268"/>
<text text-anchor="middle" x="190" y="-253" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">medical</text>
<text text-anchor="middle" x="190" y="-242" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">devices</text>
</g>
<!-- n2&#45;&gt;n3 -->
<!-- n4 -->
<g id="node10" class="node">
<title>n4</title>
<polygon fill="#e53935" stroke="black" points="228.5,-196 151.5,-196 151.5,-160 228.5,-160 228.5,-196"/>
<text text-anchor="middle" x="190" y="-181" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">clear bottles</text>
<text text-anchor="middle" x="190" y="-170" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">&amp; windows</text>
</g>
<!-- n3&#45;&gt;n4 -->
<!-- n5 -->
<g id="node11" class="node">
<title>n5</title>
<polygon fill="#f44336" stroke="black" points="222.5,-124 157.5,-124 157.5,-88 222.5,-88 222.5,-124"/>
<text text-anchor="middle" x="190" y="-109" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">wire</text>
<text text-anchor="middle" x="190" y="-98" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">insulation</text>
</g>
<!-- n4&#45;&gt;n5 -->
<!-- n6 -->
<g id="node12" class="node">
<title>n6</title>
<polygon fill="#ef5350" stroke="black" points="239.5,-52 140.5,-52 140.5,-16 239.5,-16 239.5,-52"/>
<text text-anchor="middle" x="190" y="-37" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">outdoor furniture</text>
<text text-anchor="middle" x="190" y="-26" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">decking, siding</text>
</g>
<!-- n5&#45;&gt;n6 -->
<!-- note -->
<g id="node13" class="node">
<title>note</title>
<polygon fill="#263238" stroke="black" points="445,-440 263,-440 263,-376 451,-376 451,-434 445,-440"/>
<polyline fill="none" stroke="black" points="445,-440 445,-434 "/>
<polyline fill="none" stroke="black" points="451,-434 445,-434 "/>
<text text-anchor="middle" x="357" y="-428" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#cddc39">hemp bioplastic replaces ~20&#45;30%</text>
<text text-anchor="middle" x="357" y="-417" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#cddc39">of household disposable plastic</text>
<text text-anchor="middle" x="357" y="-394" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#cddc39">packaging &amp; single&#45;use items only</text>
<text text-anchor="middle" x="357" y="-383" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#cddc39">not engineering or medical plastics</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.4 KiB

View file

@ -0,0 +1,41 @@
digraph community_scale {
bgcolor="#1a1a2e"
rankdir=TB
node [fontname="Helvetica" fontsize=10 style=filled shape=box]
edge [style=invis]
label=<<B><FONT COLOR="#cccccc" POINT-SIZE="14">how much land to replace disposable plastic?</FONT></B>>
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]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

View file

@ -0,0 +1,119 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: community_scale Pages: 1 -->
<svg width="933pt" height="290pt"
viewBox="0.00 0.00 933.00 290.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 286)">
<title>community_scale</title>
<polygon fill="#1a1a2e" stroke="transparent" points="-4,4 -4,-286 929,-286 929,4 -4,4"/>
<text text-anchor="start" x="285" y="-267.8" font-family="Times,serif" font-weight="bold" font-size="14.00" fill="#cccccc">how much land to replace disposable plastic?</text>
<g id="clust1" class="cluster">
<title>cluster_household</title>
<polygon fill="#1a1a2e" stroke="#cddc39" stroke-dasharray="5,2" points="8,-10.5 8,-251 192,-251 192,-10.5 8,-10.5"/>
<text text-anchor="middle" x="100" y="-238.2" font-family="Helvetica Bold" font-size="11.00" fill="#cddc39">HOUSEHOLD (2.5 people)</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_village</title>
<polygon fill="#1a1a2e" stroke="#4caf50" stroke-dasharray="5,2" points="200,-8 200,-248.5 400,-248.5 400,-8 200,-8"/>
<text text-anchor="middle" x="300" y="-235.7" font-family="Helvetica Bold" font-size="11.00" fill="#4caf50">VILLAGE (100 people)</text>
</g>
<g id="clust3" class="cluster">
<title>cluster_town</title>
<polygon fill="#1a1a2e" stroke="#2196f3" stroke-dasharray="5,2" points="408,-8 408,-248.5 618,-248.5 618,-8 408,-8"/>
<text text-anchor="middle" x="513" y="-235.7" font-family="Helvetica Bold" font-size="11.00" fill="#2196f3">TOWN (10,000 people)</text>
</g>
<!-- h_need -->
<g id="node1" class="node">
<title>h_need</title>
<polygon fill="#37474f" stroke="black" points="184.5,-223 15.5,-223 15.5,-182 184.5,-182 184.5,-223"/>
<text text-anchor="middle" x="100" y="-211" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">plastic consumed: ~200 kg/yr</text>
<text text-anchor="middle" x="100" y="-200" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">replaceable fraction: ~30 kg/yr</text>
<text text-anchor="middle" x="100" y="-189" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">(packaging &amp; disposables only)</text>
</g>
<!-- h_land -->
<g id="node2" class="node">
<title>h_land</title>
<polygon fill="#827717" stroke="black" points="171,-129 29,-129 29,-93 171,-93 171,-129"/>
<text text-anchor="middle" x="100" y="-114" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">hemp needed: 1/40 acre</text>
<text text-anchor="middle" x="100" y="-103" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">(~1,000 sq ft garden plot)</text>
</g>
<!-- h_need&#45;&gt;h_land -->
<!-- h_note -->
<g id="node3" class="node">
<title>h_note</title>
<polygon fill="#263238" stroke="black" points="167,-54.5 27,-54.5 27,-18.5 173,-18.5 173,-48.5 167,-54.5"/>
<polyline fill="none" stroke="black" points="167,-54.5 167,-48.5 "/>
<polyline fill="none" stroke="black" points="173,-48.5 167,-48.5 "/>
<text text-anchor="middle" x="100" y="-39.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#cddc39">one large backyard garden</text>
<text text-anchor="middle" x="100" y="-28.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#cddc39">could cover a household</text>
</g>
<!-- h_land&#45;&gt;h_note -->
<!-- v_need -->
<g id="node4" class="node">
<title>v_need</title>
<polygon fill="#37474f" stroke="black" points="391.5,-220.5 208.5,-220.5 208.5,-184.5 391.5,-184.5 391.5,-220.5"/>
<text text-anchor="middle" x="300" y="-205.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">plastic consumed: ~13,000 kg/yr</text>
<text text-anchor="middle" x="300" y="-194.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">replaceable fraction: ~1,200 kg/yr</text>
</g>
<!-- v_land -->
<g id="node5" class="node">
<title>v_land</title>
<polygon fill="#2e7d32" stroke="black" points="364.5,-129 235.5,-129 235.5,-93 364.5,-93 364.5,-129"/>
<text text-anchor="middle" x="300" y="-114" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">hemp needed: ~1 acre</text>
<text text-anchor="middle" x="300" y="-103" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">plus processing facility</text>
</g>
<!-- v_need&#45;&gt;v_land -->
<!-- v_note -->
<g id="node6" class="node">
<title>v_note</title>
<polygon fill="#263238" stroke="black" points="372.5,-57 221.5,-57 221.5,-16 378.5,-16 378.5,-51 372.5,-57"/>
<polyline fill="none" stroke="black" points="372.5,-57 372.5,-51 "/>
<polyline fill="none" stroke="black" points="378.5,-51 372.5,-51 "/>
<text text-anchor="middle" x="300" y="-45" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">requires shared decorticator</text>
<text text-anchor="middle" x="300" y="-34" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">&amp; chemical processing setup</text>
<text text-anchor="middle" x="300" y="-23" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">~$50,000 startup</text>
</g>
<!-- v_land&#45;&gt;v_note -->
<!-- t_need -->
<g id="node7" class="node">
<title>t_need</title>
<polygon fill="#37474f" stroke="black" points="610.5,-220.5 415.5,-220.5 415.5,-184.5 610.5,-184.5 610.5,-220.5"/>
<text text-anchor="middle" x="513" y="-205.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">plastic consumed: ~1,300,000 kg/yr</text>
<text text-anchor="middle" x="513" y="-194.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">replaceable fraction: ~120,000 kg/yr</text>
</g>
<!-- t_land -->
<g id="node8" class="node">
<title>t_land</title>
<polygon fill="#1565c0" stroke="black" points="590.5,-129 435.5,-129 435.5,-93 590.5,-93 590.5,-129"/>
<text text-anchor="middle" x="513" y="-114" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">hemp needed: ~100 acres</text>
<text text-anchor="middle" x="513" y="-103" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">industrial processing facility</text>
</g>
<!-- t_need&#45;&gt;t_land -->
<!-- t_note -->
<g id="node9" class="node">
<title>t_note</title>
<polygon fill="#263238" stroke="black" points="590.5,-57 429.5,-57 429.5,-16 596.5,-16 596.5,-51 590.5,-57"/>
<polyline fill="none" stroke="black" points="590.5,-57 590.5,-51 "/>
<polyline fill="none" stroke="black" points="596.5,-51 590.5,-51 "/>
<text text-anchor="middle" x="513" y="-45" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2196f3">requires industrial decorticator</text>
<text text-anchor="middle" x="513" y="-34" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2196f3">chemical plant, extruder</text>
<text text-anchor="middle" x="513" y="-23" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2196f3">$500,000+ investment</text>
</g>
<!-- t_land&#45;&gt;t_note -->
<!-- honest -->
<g id="node10" class="node">
<title>honest</title>
<polygon fill="#b71c1c" stroke="black" points="919,-240 629,-240 629,-165 925,-165 925,-234 919,-240"/>
<polyline fill="none" stroke="black" points="919,-240 919,-234 "/>
<polyline fill="none" stroke="black" points="925,-234 919,-234 "/>
<text text-anchor="middle" x="777" y="-228" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">these numbers replace only disposable plastic packaging</text>
<text text-anchor="middle" x="777" y="-217" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">~20&#45;30% of total plastic consumption</text>
<text text-anchor="middle" x="777" y="-194" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">engineering plastics, medical devices,</text>
<text text-anchor="middle" x="777" y="-183" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">electronics, pipes, &amp; wire insulation</text>
<text text-anchor="middle" x="777" y="-172" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">still require petroleum or other solutions</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.9 KiB

View file

@ -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]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

View file

@ -0,0 +1,221 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: cooperative Pages: 1 -->
<svg width="523pt" height="733pt"
viewBox="0.00 0.00 523.00 733.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 729)">
<title>cooperative</title>
<polygon fill="#1a1a2e" stroke="transparent" points="-4,4 -4,-729 519,-729 519,4 -4,4"/>
<g id="clust1" class="cluster">
<title>cluster_growers</title>
<polygon fill="#1a1a2e" stroke="#4caf50" stroke-dasharray="5,2" points="29,-639 29,-717 341,-717 341,-639 29,-639"/>
<text text-anchor="middle" x="185" y="-703.4" font-family="Helvetica Bold" font-size="12.00" fill="#4caf50">GROWERS</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_collect</title>
<polygon fill="#1a1a2e" stroke="#ff9800" stroke-dasharray="5,2" points="120,-474 120,-620 214,-620 214,-474 120,-474"/>
<text text-anchor="middle" x="167" y="-606.4" font-family="Helvetica Bold" font-size="12.00" fill="#ff9800">COLLECTION</text>
</g>
<g id="clust3" class="cluster">
<title>cluster_process</title>
<polygon fill="#1a1a2e" stroke="#2196f3" stroke-dasharray="5,2" points="83,-202 83,-455 234,-455 234,-202 83,-202"/>
<text text-anchor="middle" x="158.5" y="-441.4" font-family="Helvetica Bold" font-size="12.00" fill="#2196f3">SHARED PROCESSING</text>
</g>
<g id="clust4" class="cluster">
<title>cluster_output</title>
<polygon fill="#1a1a2e" stroke="#9c27b0" stroke-dasharray="5,2" points="93,-105 93,-183 323,-183 323,-105 93,-105"/>
<text text-anchor="middle" x="208" y="-169.4" font-family="Helvetica Bold" font-size="12.00" fill="#9c27b0">OUTPUT</text>
</g>
<g id="clust5" class="cluster">
<title>cluster_distribute</title>
<polygon fill="#1a1a2e" stroke="#e91e63" stroke-dasharray="5,2" points="8,-8 8,-86 250,-86 250,-8 8,-8"/>
<text text-anchor="middle" x="129" y="-72.4" font-family="Helvetica Bold" font-size="12.00" fill="#e91e63">DISTRIBUTE</text>
</g>
<!-- f1 -->
<g id="node1" class="node">
<title>f1</title>
<polygon fill="#2e7d32" stroke="black" points="93,-685.5 37,-685.5 37,-649.5 93,-649.5 93,-685.5"/>
<text text-anchor="middle" x="65" y="-670.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">farm A</text>
<text text-anchor="middle" x="65" y="-659.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">1/3 acre</text>
</g>
<!-- harvest -->
<g id="node5" class="node">
<title>harvest</title>
<polygon fill="#e65100" stroke="black" points="199.5,-591 134.5,-591 134.5,-555 199.5,-555 199.5,-591"/>
<text text-anchor="middle" x="167" y="-576" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">harvest &amp;</text>
<text text-anchor="middle" x="167" y="-565" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">dry stalks</text>
</g>
<!-- f1&#45;&gt;harvest -->
<g id="edge1" class="edge">
<title>f1&#45;&gt;harvest</title>
<path fill="none" stroke="#888888" d="M84.19,-649.1C100.1,-634.67 122.89,-614 140.54,-597.99"/>
<polygon fill="#888888" stroke="#888888" points="143.19,-600.32 148.25,-591.01 138.49,-595.13 143.19,-600.32"/>
</g>
<!-- f2 -->
<g id="node2" class="node">
<title>f2</title>
<polygon fill="#388e3c" stroke="black" points="165,-685.5 111,-685.5 111,-649.5 165,-649.5 165,-685.5"/>
<text text-anchor="middle" x="138" y="-670.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">farm B</text>
<text text-anchor="middle" x="138" y="-659.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">1 acre</text>
</g>
<!-- f2&#45;&gt;harvest -->
<g id="edge2" class="edge">
<title>f2&#45;&gt;harvest</title>
<path fill="none" stroke="#888888" d="M143.45,-649.1C147.73,-635.45 153.77,-616.21 158.65,-600.63"/>
<polygon fill="#888888" stroke="#888888" points="162.02,-601.6 161.67,-591.01 155.34,-599.5 162.02,-601.6"/>
</g>
<!-- f3 -->
<g id="node3" class="node">
<title>f3</title>
<polygon fill="#43a047" stroke="black" points="237,-685.5 183,-685.5 183,-649.5 237,-649.5 237,-685.5"/>
<text text-anchor="middle" x="210" y="-670.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">farm C</text>
<text text-anchor="middle" x="210" y="-659.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">1 acre</text>
</g>
<!-- f3&#45;&gt;harvest -->
<g id="edge3" class="edge">
<title>f3&#45;&gt;harvest</title>
<path fill="none" stroke="#888888" d="M201.91,-649.1C195.51,-635.32 186.45,-615.85 179.17,-600.18"/>
<polygon fill="#888888" stroke="#888888" points="182.3,-598.6 174.91,-591.01 175.95,-601.55 182.3,-598.6"/>
</g>
<!-- f4 -->
<g id="node4" class="node">
<title>f4</title>
<polygon fill="#66bb6a" stroke="black" points="332.5,-688 255.5,-688 255.5,-647 332.5,-647 332.5,-688"/>
<text text-anchor="middle" x="294" y="-676" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">garden plots</text>
<text text-anchor="middle" x="294" y="-665" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">backyards</text>
<text text-anchor="middle" x="294" y="-654" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">&amp; more</text>
</g>
<!-- f4&#45;&gt;harvest -->
<g id="edge4" class="edge">
<title>f4&#45;&gt;harvest</title>
<path fill="none" stroke="#888888" d="M267.07,-646.88C247.1,-632.34 219.82,-612.47 198.78,-597.15"/>
<polygon fill="#888888" stroke="#888888" points="200.62,-594.16 190.48,-591.1 196.5,-599.82 200.62,-594.16"/>
</g>
<!-- store -->
<g id="node6" class="node">
<title>store</title>
<polygon fill="#f57c00" stroke="black" points="206,-518 128,-518 128,-482 206,-482 206,-518"/>
<text text-anchor="middle" x="167" y="-503" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">central</text>
<text text-anchor="middle" x="167" y="-492" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">storage barn</text>
</g>
<!-- harvest&#45;&gt;store -->
<g id="edge5" class="edge">
<title>harvest&#45;&gt;store</title>
<path fill="none" stroke="#888888" d="M167,-554.81C167,-546.79 167,-537.05 167,-528.07"/>
<polygon fill="#888888" stroke="#888888" points="170.5,-528.03 167,-518.03 163.5,-528.03 170.5,-528.03"/>
</g>
<!-- decorticator -->
<g id="node7" class="node">
<title>decorticator</title>
<polygon fill="#1565c0" stroke="black" points="210,-426 124,-426 124,-385 210,-385 210,-426"/>
<text text-anchor="middle" x="167" y="-414" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">decorticator</text>
<text text-anchor="middle" x="167" y="-403" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">$5,000&#45;60,000</text>
<text text-anchor="middle" x="167" y="-392" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">shared asset</text>
</g>
<!-- store&#45;&gt;decorticator -->
<g id="edge6" class="edge">
<title>store&#45;&gt;decorticator</title>
<path fill="none" stroke="#888888" d="M167,-481.6C167,-468.88 167,-451.32 167,-436.37"/>
<polygon fill="#888888" stroke="#888888" points="170.5,-436.06 167,-426.06 163.5,-436.06 170.5,-436.06"/>
</g>
<!-- chem -->
<g id="node8" class="node">
<title>chem</title>
<polygon fill="#1976d2" stroke="black" points="206.5,-348 93.5,-348 93.5,-307 206.5,-307 206.5,-348"/>
<text text-anchor="middle" x="150" y="-336" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">chemical extraction</text>
<text text-anchor="middle" x="150" y="-325" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">NaOH + acid wash</text>
<text text-anchor="middle" x="150" y="-314" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">shared facility</text>
</g>
<!-- decorticator&#45;&gt;chem -->
<g id="edge7" class="edge">
<title>decorticator&#45;&gt;chem</title>
<path fill="none" stroke="#888888" d="M162.62,-384.93C160.78,-376.68 158.59,-366.91 156.56,-357.84"/>
<polygon fill="#888888" stroke="#888888" points="159.96,-357 154.36,-348.01 153.13,-358.53 159.96,-357"/>
</g>
<!-- byproducts -->
<g id="node11" class="node">
<title>byproducts</title>
<polygon fill="#6a1b9a" stroke="black" points="315,-154 187,-154 187,-113 315,-113 315,-154"/>
<text text-anchor="middle" x="251" y="-142" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">hurd → animal bedding</text>
<text text-anchor="middle" x="251" y="-131" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">lignin → compost</text>
<text text-anchor="middle" x="251" y="-120" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">fiber → textiles</text>
</g>
<!-- decorticator&#45;&gt;byproducts -->
<g id="edge8" class="edge">
<title>decorticator&#45;&gt;byproducts</title>
<path fill="none" stroke="#888888" stroke-dasharray="5,2" d="M188.95,-384.78C198.76,-374.74 209.55,-361.75 216,-348 244.53,-287.15 250.28,-207.07 251.15,-164.36"/>
<polygon fill="#888888" stroke="#888888" points="254.65,-164.14 251.28,-154.09 247.65,-164.05 254.65,-164.14"/>
<text text-anchor="middle" x="270.5" y="-281.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">hurd</text>
<text text-anchor="middle" x="270.5" y="-271.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">&amp; waste fiber</text>
</g>
<!-- press -->
<g id="node9" class="node">
<title>press</title>
<polygon fill="#1e88e5" stroke="black" points="179.5,-251 102.5,-251 102.5,-210 179.5,-210 179.5,-251"/>
<text text-anchor="middle" x="141" y="-239" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">hot press</text>
<text text-anchor="middle" x="141" y="-228" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">&amp; molds</text>
<text text-anchor="middle" x="141" y="-217" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">shared tools</text>
</g>
<!-- chem&#45;&gt;press -->
<g id="edge9" class="edge">
<title>chem&#45;&gt;press</title>
<path fill="none" stroke="#888888" d="M148.14,-306.82C146.89,-293.7 145.24,-276.2 143.83,-261.38"/>
<polygon fill="#888888" stroke="#888888" points="147.29,-260.78 142.86,-251.16 140.32,-261.44 147.29,-260.78"/>
</g>
<!-- products -->
<g id="node10" class="node">
<title>products</title>
<polygon fill="#7b1fa2" stroke="black" points="169,-154 101,-154 101,-113 169,-113 169,-154"/>
<text text-anchor="middle" x="135" y="-142" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">containers</text>
<text text-anchor="middle" x="135" y="-131" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">trays, pots</text>
<text text-anchor="middle" x="135" y="-120" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">packaging</text>
</g>
<!-- press&#45;&gt;products -->
<g id="edge10" class="edge">
<title>press&#45;&gt;products</title>
<path fill="none" stroke="#888888" d="M139.76,-209.82C138.93,-196.7 137.82,-179.2 136.89,-164.38"/>
<polygon fill="#888888" stroke="#888888" points="140.37,-163.92 136.24,-154.16 133.38,-164.36 140.37,-163.92"/>
</g>
<!-- local -->
<g id="node12" class="node">
<title>local</title>
<polygon fill="#ad1457" stroke="black" points="108,-57 16,-57 16,-16 108,-16 108,-57"/>
<text text-anchor="middle" x="62" y="-45" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">farmers market</text>
<text text-anchor="middle" x="62" y="-34" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">farm stands</text>
<text text-anchor="middle" x="62" y="-23" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">local shops</text>
</g>
<!-- products&#45;&gt;local -->
<g id="edge11" class="edge">
<title>products&#45;&gt;local</title>
<path fill="none" stroke="#888888" d="M119.87,-112.82C109.3,-99.06 95.04,-80.5 83.32,-65.24"/>
<polygon fill="#888888" stroke="#888888" points="85.97,-62.96 77.11,-57.16 80.42,-67.22 85.97,-62.96"/>
</g>
<!-- members -->
<g id="node13" class="node">
<title>members</title>
<polygon fill="#c2185b" stroke="black" points="242,-57 126,-57 126,-16 242,-16 242,-57"/>
<text text-anchor="middle" x="184" y="-45" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">member households</text>
<text text-anchor="middle" x="184" y="-34" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">get allocation</text>
<text text-anchor="middle" x="184" y="-23" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">at cost</text>
</g>
<!-- products&#45;&gt;members -->
<g id="edge12" class="edge">
<title>products&#45;&gt;members</title>
<path fill="none" stroke="#888888" d="M145.15,-112.82C152.12,-99.31 161.47,-81.18 169.25,-66.09"/>
<polygon fill="#888888" stroke="#888888" points="172.39,-67.65 173.86,-57.16 166.17,-64.44 172.39,-67.65"/>
</g>
<!-- cost -->
<g id="node14" class="node">
<title>cost</title>
<polygon fill="#263238" stroke="black" points="509,-688 351,-688 351,-647 515,-647 515,-682 509,-688"/>
<polyline fill="none" stroke="black" points="509,-688 509,-682 "/>
<polyline fill="none" stroke="black" points="515,-682 509,-682 "/>
<text text-anchor="middle" x="433" y="-676" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#cddc39">startup: $50,000&#45;100,000</text>
<text text-anchor="middle" x="433" y="-665" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#cddc39">shared across 10&#45;20 members</text>
<text text-anchor="middle" x="433" y="-654" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#cddc39">$2,500&#45;10,000 per member</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

View file

@ -0,0 +1,31 @@
digraph cost_reality {
bgcolor="#1a1a2e"
rankdir=LR
node [fontname="Helvetica" fontsize=10 style=filled shape=box]
edge [style=invis]
label=<<B><FONT COLOR="#cccccc" POINT-SIZE="14">cost per kg: petroleum vs hemp</FONT></B>>
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]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View file

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: cost_reality Pages: 1 -->
<svg width="442pt" height="297pt"
viewBox="0.00 0.00 442.00 297.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 293)">
<title>cost_reality</title>
<polygon fill="#1a1a2e" stroke="transparent" points="-4,4 -4,-293 438,-293 438,4 -4,4"/>
<text text-anchor="start" x="92.5" y="-274.8" font-family="Times,serif" font-weight="bold" font-size="14.00" fill="#cccccc">cost per kg: petroleum vs hemp</text>
<g id="clust1" class="cluster">
<title>cluster_petro</title>
<polygon fill="#1a1a2e" stroke="#f44336" stroke-dasharray="5,2" points="29.5,-8 29.5,-80 421,-80 421,-8 29.5,-8"/>
<text text-anchor="middle" x="225.25" y="-67.2" font-family="Helvetica Bold" font-size="11.00" fill="#f44336">PETROLEUM PLASTIC</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_bio</title>
<polygon fill="#1a1a2e" stroke="#4caf50" stroke-dasharray="5,2" points="29.5,-88 29.5,-160 426,-160 426,-88 29.5,-88"/>
<text text-anchor="middle" x="227.75" y="-147.2" font-family="Helvetica Bold" font-size="11.00" fill="#4caf50">BIOPLASTIC</text>
</g>
<!-- hdpe -->
<g id="node1" class="node">
<title>hdpe</title>
<polygon fill="#b71c1c" stroke="black" points="120.5,-52 37.5,-52 37.5,-16 120.5,-16 120.5,-52"/>
<text text-anchor="middle" x="79" y="-37" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">HDPE</text>
<text text-anchor="middle" x="79" y="-26" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">$0.90&#45;1.40/kg</text>
</g>
<!-- pp -->
<g id="node2" class="node">
<title>pp</title>
<polygon fill="#c62828" stroke="black" points="284.5,-52 198.5,-52 198.5,-16 284.5,-16 284.5,-52"/>
<text text-anchor="middle" x="241.5" y="-37" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">polypropylene</text>
<text text-anchor="middle" x="241.5" y="-26" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">$2.20&#45;2.53/kg</text>
</g>
<!-- hdpe&#45;&gt;pp -->
<!-- pet -->
<g id="node3" class="node">
<title>pet</title>
<polygon fill="#d32f2f" stroke="black" points="413,-52 330,-52 330,-16 413,-16 413,-52"/>
<text text-anchor="middle" x="371.5" y="-37" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">PET</text>
<text text-anchor="middle" x="371.5" y="-26" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">$1.00&#45;1.50/kg</text>
</g>
<!-- pp&#45;&gt;pet -->
<!-- pla -->
<g id="node4" class="node">
<title>pla</title>
<polygon fill="#2e7d32" stroke="black" points="120.5,-132 37.5,-132 37.5,-96 120.5,-96 120.5,-132"/>
<text text-anchor="middle" x="79" y="-117" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">PLA (corn)</text>
<text text-anchor="middle" x="79" y="-106" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">$2.00&#45;3.00/kg</text>
</g>
<!-- hemp -->
<g id="node5" class="node">
<title>hemp</title>
<polygon fill="#388e3c" stroke="black" points="289,-132 194,-132 194,-96 289,-96 289,-132"/>
<text text-anchor="middle" x="241.5" y="-117" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">hemp bioplastic</text>
<text text-anchor="middle" x="241.5" y="-106" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">$5.00&#45;5.20/kg</text>
</g>
<!-- pla&#45;&gt;hemp -->
<!-- pha -->
<g id="node6" class="node">
<title>pha</title>
<polygon fill="#43a047" stroke="black" points="418,-132 325,-132 325,-96 418,-96 418,-132"/>
<text text-anchor="middle" x="371.5" y="-117" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">PHA (microbial)</text>
<text text-anchor="middle" x="371.5" y="-106" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">$4.00&#45;9.00/kg</text>
</g>
<!-- hemp&#45;&gt;pha -->
<!-- gap -->
<g id="node7" class="node">
<title>gap</title>
<polygon fill="#263238" stroke="black" points="152,-266 0,-266 0,-168 158,-168 158,-260 152,-266"/>
<polyline fill="none" stroke="black" points="152,-266 152,-260 "/>
<polyline fill="none" stroke="black" points="158,-260 152,-260 "/>
<text text-anchor="middle" x="79" y="-254" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#cddc39">hemp bioplastic costs</text>
<text text-anchor="middle" x="79" y="-243" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#cddc39">2&#45;3x petroleum plastic today</text>
<text text-anchor="middle" x="79" y="-220" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#cddc39">no subsidies, no scale,</text>
<text text-anchor="middle" x="79" y="-209" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#cddc39">no infrastructure yet</text>
<text text-anchor="middle" x="79" y="-186" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#cddc39">price drops with volume</text>
<text text-anchor="middle" x="79" y="-175" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#cddc39">PLA fell 50% since 2007</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB

View file

@ -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]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

View file

@ -0,0 +1,153 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: harmony_cycle Pages: 1 -->
<svg width="497pt" height="684pt"
viewBox="0.00 0.00 497.00 683.58" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 679.58)">
<title>harmony_cycle</title>
<polygon fill="#1a1a2e" stroke="transparent" points="-4,4 -4,-679.58 493,-679.58 493,4 -4,4"/>
<!-- sun -->
<g id="node1" class="node">
<title>sun</title>
<ellipse fill="#ffc107" stroke="black" cx="271.5" cy="-644.46" rx="42.35" ry="31.23"/>
<text text-anchor="middle" x="271.5" y="-653.66" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#1a1a2e">sunlight</text>
<text text-anchor="middle" x="271.5" y="-641.66" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#1a1a2e">water</text>
<text text-anchor="middle" x="271.5" y="-629.66" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#1a1a2e">CO2</text>
</g>
<!-- hemp -->
<g id="node2" class="node">
<title>hemp</title>
<polygon fill="#2e7d32" stroke="black" points="316,-567.35 227,-567.35 227,-523.35 316,-523.35 316,-567.35"/>
<text text-anchor="middle" x="271.5" y="-554.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">hemp</text>
<text text-anchor="middle" x="271.5" y="-542.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">120 day crop</text>
<text text-anchor="middle" x="271.5" y="-530.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">no pesticides</text>
</g>
<!-- sun&#45;&gt;hemp -->
<g id="edge1" class="edge">
<title>sun&#45;&gt;hemp</title>
<path fill="none" stroke="#4caf50" stroke-width="2" d="M271.5,-613.27C271.5,-602.05 271.5,-589.29 271.5,-577.94"/>
<polygon fill="#4caf50" stroke="#4caf50" stroke-width="2" points="275,-577.59 271.5,-567.59 268,-577.59 275,-577.59"/>
<text text-anchor="middle" x="283" y="-588.15" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">grow</text>
</g>
<!-- stalk -->
<g id="node3" class="node">
<title>stalk</title>
<polygon fill="#388e3c" stroke="black" points="269.5,-477.35 215.5,-477.35 215.5,-441.35 269.5,-441.35 269.5,-477.35"/>
<text text-anchor="middle" x="242.5" y="-462.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">stalk</text>
<text text-anchor="middle" x="242.5" y="-450.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">&amp; fiber</text>
</g>
<!-- hemp&#45;&gt;stalk -->
<g id="edge2" class="edge">
<title>hemp&#45;&gt;stalk</title>
<path fill="none" stroke="#4caf50" stroke-width="2" d="M259.19,-522.96C256.35,-517.36 253.56,-511.24 251.5,-505.35 249.56,-499.8 248,-493.72 246.75,-487.86"/>
<polygon fill="#4caf50" stroke="#4caf50" stroke-width="2" points="250.13,-486.92 244.83,-477.75 243.25,-488.22 250.13,-486.92"/>
<text text-anchor="middle" x="268.5" y="-498.15" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">harvest</text>
</g>
<!-- cellulose -->
<g id="node4" class="node">
<title>cellulose</title>
<polygon fill="#43a047" stroke="black" points="270,-395.35 197,-395.35 197,-359.35 270,-359.35 270,-395.35"/>
<text text-anchor="middle" x="233.5" y="-380.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">cellulose</text>
<text text-anchor="middle" x="233.5" y="-368.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">extraction</text>
</g>
<!-- stalk&#45;&gt;cellulose -->
<g id="edge3" class="edge">
<title>stalk&#45;&gt;cellulose</title>
<path fill="none" stroke="#4caf50" stroke-width="2" d="M240.55,-440.99C239.38,-430.65 237.88,-417.29 236.56,-405.57"/>
<polygon fill="#4caf50" stroke="#4caf50" stroke-width="2" points="240.01,-404.95 235.42,-395.4 233.06,-405.73 240.01,-404.95"/>
<text text-anchor="middle" x="256" y="-416.15" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">process</text>
</g>
<!-- bioplastic -->
<g id="node5" class="node">
<title>bioplastic</title>
<polygon fill="#7b1fa2" stroke="black" points="252,-313.35 183,-313.35 183,-277.35 252,-277.35 252,-313.35"/>
<text text-anchor="middle" x="217.5" y="-298.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">bioplastic</text>
<text text-anchor="middle" x="217.5" y="-286.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">container</text>
</g>
<!-- cellulose&#45;&gt;bioplastic -->
<g id="edge4" class="edge">
<title>cellulose&#45;&gt;bioplastic</title>
<path fill="none" stroke="#4caf50" stroke-width="2" d="M230.03,-358.99C227.94,-348.54 225.23,-335.02 222.87,-323.21"/>
<polygon fill="#4caf50" stroke="#4caf50" stroke-width="2" points="226.3,-322.52 220.91,-313.4 219.44,-323.89 226.3,-322.52"/>
<text text-anchor="middle" x="238" y="-334.15" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">press</text>
</g>
<!-- use -->
<g id="node6" class="node">
<title>use</title>
<polygon fill="#ff9800" stroke="black" points="212.5,-231.35 156.5,-231.35 156.5,-195.35 212.5,-195.35 212.5,-231.35"/>
<text text-anchor="middle" x="184.5" y="-216.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">use &amp;</text>
<text text-anchor="middle" x="184.5" y="-204.55" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">discard</text>
</g>
<!-- bioplastic&#45;&gt;use -->
<g id="edge5" class="edge">
<title>bioplastic&#45;&gt;use</title>
<path fill="none" stroke="#4caf50" stroke-width="2" d="M210.34,-276.99C205.99,-266.44 200.34,-252.75 195.43,-240.86"/>
<polygon fill="#4caf50" stroke="#4caf50" stroke-width="2" points="198.58,-239.31 191.53,-231.4 192.11,-241.98 198.58,-239.31"/>
<text text-anchor="middle" x="215" y="-252.15" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">serve</text>
</g>
<!-- compost -->
<g id="node7" class="node">
<title>compost</title>
<polygon fill="#795548" stroke="black" points="79,-133.68 0,-133.68 0,-97.68 79,-97.68 79,-133.68"/>
<text text-anchor="middle" x="39.5" y="-118.88" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">compost</text>
<text text-anchor="middle" x="39.5" y="-106.88" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">3&#45;6 months</text>
</g>
<!-- use&#45;&gt;compost -->
<g id="edge6" class="edge">
<title>use&#45;&gt;compost</title>
<path fill="none" stroke="#4caf50" stroke-width="2" d="M158.39,-195.29C139.06,-182.65 112.11,-164.97 88.5,-149.35 83.76,-146.21 78.76,-142.9 73.85,-139.63"/>
<polygon fill="#4caf50" stroke="#4caf50" stroke-width="2" points="75.42,-136.47 65.16,-133.84 71.54,-142.3 75.42,-136.47"/>
<text text-anchor="middle" x="146" y="-170.15" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">return</text>
</g>
<!-- petro -->
<g id="node9" class="node">
<title>petro</title>
<polygon fill="#b71c1c" stroke="black" points="271.5,-101.65 271.5,-129.7 220.54,-149.53 148.46,-149.53 97.5,-129.7 97.5,-101.65 148.46,-81.82 220.54,-81.82 271.5,-101.65"/>
<text text-anchor="middle" x="184.5" y="-124.88" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">petroleum plastic</text>
<text text-anchor="middle" x="184.5" y="-112.88" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">cycle breaks here</text>
<text text-anchor="middle" x="184.5" y="-100.88" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">→ landfill forever</text>
</g>
<!-- use&#45;&gt;petro -->
<g id="edge9" class="edge">
<title>use&#45;&gt;petro</title>
<path fill="none" stroke="#f44336" stroke-dasharray="5,2" d="M184.5,-195.25C184.5,-185.34 184.5,-172.38 184.5,-159.85"/>
<polygon fill="#f44336" stroke="#f44336" points="188,-159.5 184.5,-149.5 181,-159.5 188,-159.5"/>
<text text-anchor="middle" x="189.5" y="-170.15" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">vs</text>
</g>
<!-- soil -->
<g id="node8" class="node">
<title>soil</title>
<polygon fill="#4e342e" stroke="black" points="202.5,-36 136.5,-36 136.5,0 202.5,0 202.5,-36"/>
<text text-anchor="middle" x="169.5" y="-21.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">soil</text>
<text text-anchor="middle" x="169.5" y="-9.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">nutrients</text>
</g>
<!-- compost&#45;&gt;soil -->
<g id="edge7" class="edge">
<title>compost&#45;&gt;soil</title>
<path fill="none" stroke="#4caf50" stroke-width="2" d="M62.74,-97.57C83.69,-82.16 114.66,-59.36 137.86,-42.29"/>
<polygon fill="#4caf50" stroke="#4caf50" stroke-width="2" points="140.04,-45.03 146.02,-36.28 135.89,-39.39 140.04,-45.03"/>
<text text-anchor="middle" x="146.5" y="-56.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">decompose</text>
</g>
<!-- soil&#45;&gt;hemp -->
<g id="edge8" class="edge">
<title>soil&#45;&gt;hemp</title>
<path fill="none" stroke="#4caf50" stroke-width="2" d="M202.64,-27.68C241.16,-40.01 299.5,-66.62 299.5,-114.68 299.5,-460.35 299.5,-460.35 299.5,-460.35 299.5,-478.81 293.34,-498.43 286.8,-514.07"/>
<polygon fill="#4caf50" stroke="#4caf50" stroke-width="2" points="283.58,-512.68 282.73,-523.24 289.98,-515.52 283.58,-512.68"/>
<text text-anchor="middle" x="309.5" y="-293.15" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">feed</text>
</g>
<!-- note -->
<g id="node10" class="node">
<title>note</title>
<polygon fill="#263238" stroke="black" points="483,-673.46 332,-673.46 332,-615.46 489,-615.46 489,-667.46 483,-673.46"/>
<polyline fill="none" stroke="black" points="483,-673.46 483,-667.46 "/>
<polyline fill="none" stroke="black" points="489,-667.46 483,-667.46 "/>
<text text-anchor="middle" x="410.5" y="-662.26" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">hemp bioplastic closes a cycle</text>
<text text-anchor="middle" x="410.5" y="-652.26" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">petroleum plastic breaks it</text>
<text text-anchor="middle" x="410.5" y="-632.26" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">both require energy to process</text>
<text text-anchor="middle" x="410.5" y="-622.26" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">but only one returns to earth</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -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"]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

View file

@ -0,0 +1,214 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: stalk_to_plastic Pages: 1 -->
<svg width="358pt" height="1008pt"
viewBox="0.00 0.00 357.51 1008.23" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1004.23)">
<title>stalk_to_plastic</title>
<polygon fill="#1a1a2e" stroke="transparent" points="-4,4 -4,-1004.23 353.51,-1004.23 353.51,4 -4,4"/>
<g id="clust1" class="cluster">
<title>cluster_grow</title>
<polygon fill="#1a1a2e" stroke="#4caf50" stroke-dasharray="5,2" points="72,-755.23 72,-992.23 166,-992.23 166,-755.23 72,-755.23"/>
<text text-anchor="middle" x="119" y="-978.63" font-family="Helvetica Bold" font-size="12.00" fill="#4caf50">GROW</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_strip</title>
<polygon fill="#1a1a2e" stroke="#ff9800" stroke-dasharray="5,2" points="8,-573.23 8,-727.23 230,-727.23 230,-573.23 8,-573.23"/>
<text text-anchor="middle" x="119" y="-713.63" font-family="Helvetica Bold" font-size="12.00" fill="#ff9800">STRIP</text>
</g>
<g id="clust3" class="cluster">
<title>cluster_extract</title>
<polygon fill="#1a1a2e" stroke="#2196f3" stroke-dasharray="5,2" points="44,-259.11 44,-545.23 158,-545.23 158,-259.11 44,-259.11"/>
<text text-anchor="middle" x="101" y="-531.63" font-family="Helvetica Bold" font-size="12.00" fill="#2196f3">EXTRACT</text>
</g>
<g id="clust4" class="cluster">
<title>cluster_form</title>
<polygon fill="#1a1a2e" stroke="#9c27b0" stroke-dasharray="5,2" points="41,-8 41,-227 161,-227 161,-8 41,-8"/>
<text text-anchor="middle" x="101" y="-213.4" font-family="Helvetica Bold" font-size="12.00" fill="#9c27b0">FORM</text>
</g>
<!-- seed -->
<g id="node1" class="node">
<title>seed</title>
<polygon fill="#2e7d32" stroke="black" points="157.5,-963.23 80.5,-963.23 80.5,-927.23 157.5,-927.23 157.5,-963.23"/>
<text text-anchor="middle" x="119" y="-942.43" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">hemp seed</text>
</g>
<!-- field -->
<g id="node2" class="node">
<title>field</title>
<polygon fill="#388e3c" stroke="black" points="152.5,-881.23 85.5,-881.23 85.5,-845.23 152.5,-845.23 152.5,-881.23"/>
<text text-anchor="middle" x="119" y="-866.43" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">1 acre</text>
<text text-anchor="middle" x="119" y="-854.43" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">120 days</text>
</g>
<!-- seed&#45;&gt;field -->
<g id="edge1" class="edge">
<title>seed&#45;&gt;field</title>
<path fill="none" stroke="#888888" d="M119,-926.87C119,-916.52 119,-903.17 119,-891.45"/>
<polygon fill="#888888" stroke="#888888" points="122.5,-891.28 119,-881.28 115.5,-891.28 122.5,-891.28"/>
<text text-anchor="middle" x="131" y="-902.03" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">plant</text>
</g>
<!-- stalk -->
<g id="node3" class="node">
<title>stalk</title>
<polygon fill="#43a047" stroke="black" points="151.5,-799.23 86.5,-799.23 86.5,-763.23 151.5,-763.23 151.5,-799.23"/>
<text text-anchor="middle" x="119" y="-784.43" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">4 tons</text>
<text text-anchor="middle" x="119" y="-772.43" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">dry stalk</text>
</g>
<!-- field&#45;&gt;stalk -->
<g id="edge2" class="edge">
<title>field&#45;&gt;stalk</title>
<path fill="none" stroke="#888888" d="M119,-844.87C119,-834.52 119,-821.17 119,-809.45"/>
<polygon fill="#888888" stroke="#888888" points="122.5,-809.28 119,-799.28 115.5,-809.28 122.5,-809.28"/>
<text text-anchor="middle" x="136" y="-820.03" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">harvest</text>
</g>
<!-- dec -->
<g id="node4" class="node">
<title>dec</title>
<polygon fill="#e65100" stroke="black" points="186,-698.23 52,-698.23 52,-662.23 186,-662.23 186,-698.23"/>
<text text-anchor="middle" x="119" y="-683.43" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">decorticate</text>
<text text-anchor="middle" x="119" y="-671.43" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">separate bast &amp; hurd</text>
</g>
<!-- stalk&#45;&gt;dec -->
<g id="edge3" class="edge">
<title>stalk&#45;&gt;dec</title>
<path fill="none" stroke="#888888" d="M119,-762.98C119,-747.93 119,-725.84 119,-708.42"/>
<polygon fill="#888888" stroke="#888888" points="122.5,-708.27 119,-698.27 115.5,-708.27 122.5,-708.27"/>
<text text-anchor="middle" x="136.5" y="-738.03" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">process</text>
</g>
<!-- bast -->
<g id="node5" class="node">
<title>bast</title>
<polygon fill="#f57c00" stroke="black" points="110,-625.23 16,-625.23 16,-581.23 110,-581.23 110,-625.23"/>
<text text-anchor="middle" x="63" y="-612.43" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">bast fiber</text>
<text text-anchor="middle" x="63" y="-600.43" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">~30% of stalk</text>
<text text-anchor="middle" x="63" y="-588.43" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">77% cellulose</text>
</g>
<!-- dec&#45;&gt;bast -->
<g id="edge4" class="edge">
<title>dec&#45;&gt;bast</title>
<path fill="none" stroke="#888888" d="M106.29,-662.21C100,-653.78 92.23,-643.37 85.01,-633.7"/>
<polygon fill="#888888" stroke="#888888" points="87.65,-631.39 78.86,-625.47 82.04,-635.58 87.65,-631.39"/>
</g>
<!-- hurd -->
<g id="node6" class="node">
<title>hurd</title>
<polygon fill="#795548" stroke="black" points="222,-625.23 128,-625.23 128,-581.23 222,-581.23 222,-625.23"/>
<text text-anchor="middle" x="175" y="-612.43" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">hurd (core)</text>
<text text-anchor="middle" x="175" y="-600.43" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">~70% of stalk</text>
<text text-anchor="middle" x="175" y="-588.43" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">44% cellulose</text>
</g>
<!-- dec&#45;&gt;hurd -->
<g id="edge5" class="edge">
<title>dec&#45;&gt;hurd</title>
<path fill="none" stroke="#888888" d="M131.71,-662.21C138,-653.78 145.77,-643.37 152.99,-633.7"/>
<polygon fill="#888888" stroke="#888888" points="155.96,-635.58 159.14,-625.47 150.35,-631.39 155.96,-635.58"/>
</g>
<!-- naoh -->
<g id="node7" class="node">
<title>naoh</title>
<polygon fill="#1565c0" stroke="black" points="146.5,-516.23 69.5,-516.23 69.5,-472.23 146.5,-472.23 146.5,-516.23"/>
<text text-anchor="middle" x="108" y="-503.43" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">NaOH bath</text>
<text text-anchor="middle" x="108" y="-491.43" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">80&#45;90°C</text>
<text text-anchor="middle" x="108" y="-479.43" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">2&#45;5 hours</text>
</g>
<!-- bast&#45;&gt;naoh -->
<g id="edge6" class="edge">
<title>bast&#45;&gt;naoh</title>
<path fill="none" stroke="#888888" d="M71.89,-581.09C78.55,-565.26 87.75,-543.38 95.2,-525.67"/>
<polygon fill="#888888" stroke="#888888" points="98.48,-526.9 99.13,-516.32 92.02,-524.18 98.48,-526.9"/>
</g>
<!-- hurd&#45;&gt;naoh -->
<g id="edge7" class="edge">
<title>hurd&#45;&gt;naoh</title>
<path fill="none" stroke="#888888" stroke-dasharray="5,2" d="M161.76,-581.09C151.76,-565.11 137.9,-542.97 126.75,-525.18"/>
<polygon fill="#888888" stroke="#888888" points="129.48,-522.94 121.21,-516.32 123.55,-526.65 129.48,-522.94"/>
<text text-anchor="middle" x="173.5" y="-556.03" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">lower yield</text>
</g>
<!-- wash -->
<g id="node8" class="node">
<title>wash</title>
<polygon fill="#1976d2" stroke="black" points="143.5,-416.23 72.5,-416.23 72.5,-372.23 143.5,-372.23 143.5,-416.23"/>
<text text-anchor="middle" x="108" y="-403.43" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">acid wash</text>
<text text-anchor="middle" x="108" y="-391.43" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">bleach</text>
<text text-anchor="middle" x="108" y="-379.43" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">filter</text>
</g>
<!-- naoh&#45;&gt;wash -->
<g id="edge8" class="edge">
<title>naoh&#45;&gt;wash</title>
<path fill="none" stroke="#888888" d="M108,-471.96C108,-458.73 108,-441.49 108,-426.69"/>
<polygon fill="#888888" stroke="#888888" points="111.5,-426.45 108,-416.45 104.5,-426.45 111.5,-426.45"/>
<text text-anchor="middle" x="126" y="-447.03" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">dissolve</text>
<text text-anchor="middle" x="126" y="-437.03" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">lignin</text>
</g>
<!-- cellulose -->
<g id="node9" class="node">
<title>cellulose</title>
<polygon fill="#1e88e5" stroke="black" points="150,-303.11 52,-303.11 52,-267.11 150,-267.11 150,-303.11"/>
<text text-anchor="middle" x="101" y="-288.31" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">~420 kg</text>
<text text-anchor="middle" x="101" y="-276.31" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">clean cellulose</text>
</g>
<!-- wash&#45;&gt;cellulose -->
<g id="edge9" class="edge">
<title>wash&#45;&gt;cellulose</title>
<path fill="none" stroke="#888888" d="M106.62,-372.06C105.52,-355.24 103.97,-331.6 102.78,-313.36"/>
<polygon fill="#888888" stroke="#888888" points="106.27,-313.1 102.13,-303.35 99.29,-313.55 106.27,-313.1"/>
<text text-anchor="middle" x="125" y="-347.03" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">~42%</text>
<text text-anchor="middle" x="125" y="-337.03" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">recovery</text>
</g>
<!-- loss -->
<g id="node13" class="node">
<title>loss</title>
<ellipse fill="#37474f" stroke="black" cx="259" cy="-285.11" rx="90.52" ry="31.23"/>
<text text-anchor="middle" x="259" y="-294.31" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#aaaaaa">~60% lost</text>
<text text-anchor="middle" x="259" y="-282.31" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#aaaaaa">lignin, hemicellulose</text>
<text text-anchor="middle" x="259" y="-270.31" font-family="Helvetica,sans-Serif" font-size="11.00" fill="#aaaaaa">wash water</text>
</g>
<!-- wash&#45;&gt;loss -->
<g id="edge13" class="edge">
<title>wash&#45;&gt;loss</title>
<path fill="none" stroke="#555555" stroke-dasharray="5,2" d="M137.83,-372.06C159.05,-357.01 187.98,-336.49 212.25,-319.27"/>
<polygon fill="#555555" stroke="#555555" points="214.49,-321.98 220.62,-313.34 210.44,-316.27 214.49,-321.98"/>
</g>
<!-- mix -->
<g id="node10" class="node">
<title>mix</title>
<polygon fill="#6a1b9a" stroke="black" points="149.5,-198 52.5,-198 52.5,-162 149.5,-162 149.5,-198"/>
<text text-anchor="middle" x="101" y="-183.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">mix with</text>
<text text-anchor="middle" x="101" y="-171.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">glycerol (15%)</text>
</g>
<!-- cellulose&#45;&gt;mix -->
<g id="edge10" class="edge">
<title>cellulose&#45;&gt;mix</title>
<path fill="none" stroke="#888888" d="M101,-267.09C101,-251.12 101,-226.96 101,-208.3"/>
<polygon fill="#888888" stroke="#888888" points="104.5,-208.05 101,-198.05 97.5,-208.05 104.5,-208.05"/>
</g>
<!-- press -->
<g id="node11" class="node">
<title>press</title>
<polygon fill="#7b1fa2" stroke="black" points="138,-125 64,-125 64,-89 138,-89 138,-125"/>
<text text-anchor="middle" x="101" y="-110.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">hot press</text>
<text text-anchor="middle" x="101" y="-98.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">150&#45;240°C</text>
</g>
<!-- mix&#45;&gt;press -->
<g id="edge11" class="edge">
<title>mix&#45;&gt;press</title>
<path fill="none" stroke="#888888" d="M101,-161.81C101,-153.79 101,-144.05 101,-135.07"/>
<polygon fill="#888888" stroke="#888888" points="104.5,-135.03 101,-125.03 97.5,-135.03 104.5,-135.03"/>
</g>
<!-- plastic -->
<g id="node12" class="node">
<title>plastic</title>
<polygon fill="#8e24aa" stroke="black" points="153,-52 49,-52 49,-16 153,-16 153,-52"/>
<text text-anchor="middle" x="101" y="-37.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">~400 kg</text>
<text text-anchor="middle" x="101" y="-25.2" font-family="Helvetica,sans-Serif" font-size="11.00" fill="white">hemp bioplastic</text>
</g>
<!-- press&#45;&gt;plastic -->
<g id="edge12" class="edge">
<title>press&#45;&gt;plastic</title>
<path fill="none" stroke="#888888" d="M101,-88.81C101,-80.79 101,-71.05 101,-62.07"/>
<polygon fill="#888888" stroke="#888888" points="104.5,-62.03 101,-52.03 97.5,-62.03 104.5,-62.03"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

365
hemp-bioplastic/index.html Normal file
View file

@ -0,0 +1,365 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>hemp bioplastic &#8212; unturf.</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#5871ad">
<meta charset="utf-8">
<link rel="stylesheet" href="/css/chunkfive/stylesheet.css" type="text/css" charset="utf-8" />
<link rel="stylesheet" href="/css/pico.classless.min.css">
<link rel="stylesheet" href="/css/unturf.css">
</head>
<body>
<main class="content-wide">
<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="/let-us-define-a-permacomputer/">manifesto</a> · <a href="/eight-forms-of-capital/">eight forms of capital</a> · <a href="/single-use-plastics/">single-use plastics</a> · <a href="/hemp-bioplastic/" aria-current="page">hemp bioplastic</a> · <a href="/hemp-bioplastic/process/">recipe</a> · <a href="/software/">free software</a></small></center>
<h2>Hemp Bioplastic</h2>
<p>
<span class="unturf-brand">unturf.</span> <a href="/single-use-plastics/">rejects single-use petroleum plastic</a>. 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.
</p>
<div class="honest-box">
<b>No smoke.</b> 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.
</div>
<!-- ============================================================ -->
<!-- THE CYCLE -->
<!-- ============================================================ -->
<span class="step-label">STEP 1</span>
<h3>A Cycle That Closes</h3>
<p>
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.<sup id="ref4"><a href="#fn4">[4]</a></sup> Compost feeds soil. Soil grows hemp. Every output becomes an input.
</p>
<figure class="diagram">
<img src="img/harmony-cycle.svg" alt="Hemp bioplastic lifecycle: sun to hemp to cellulose to plastic to compost to soil to hemp again">
<figcaption>hemp bioplastic closes a cycle. petroleum plastic breaks it.</figcaption>
</figure>
<p>
This cycle passes a <a href="/single-use-plastics/">harmony test</a>. Appropriate inputs for all outputs. But growing a plant & pressing it into plastic requires real work, real chemistry, & real land. How much?
</p>
<!-- ============================================================ -->
<!-- STALK TO PLASTIC -->
<!-- ============================================================ -->
<span class="step-label">STEP 2</span>
<h3>Stalk to Plastic</h3>
<p>
Hemp grows in 120 days. One acre yields roughly 4 tons of dry stalk<sup id="ref1"><a href="#fn1">[1]</a></sup> (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).<sup id="ref2"><a href="#fn2">[2]</a></sup> Both contain cellulose. Getting it out requires chemistry.
</p>
<figure class="diagram">
<img src="img/stalk-to-plastic.svg" alt="Process flow from hemp seed to bioplastic: grow, strip, extract, form">
<figcaption>4 tons of stalk yields roughly 400 kg of bioplastic. 60% lost in processing.</figcaption>
</figure>
<p>
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.<sup id="ref12"><a href="#fn12">[12]</a></sup> 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.
</p>
<p>
From 4,000 kg of dry stalk, expect roughly 1,680 kg of extractable cellulose,<sup id="ref3"><a href="#fn3">[3]</a></sup> 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).
</p>
<div class="honest-box">
<b>Chemical reality.</b> 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.
</div>
<!-- ============================================================ -->
<!-- WHAT IT REPLACES -->
<!-- ============================================================ -->
<span class="step-label">STEP 3</span>
<h3>What It Can & Cannot Replace</h3>
<p>
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.
</p>
<figure class="diagram">
<img src="img/can-vs-cannot.svg" alt="What hemp bioplastic can replace versus what it cannot">
<figcaption>~20-30% of household disposable plastic. not engineering or medical plastics.</figcaption>
</figure>
<p>
Pure cellulose bioplastic stays brittle & water-sensitive. It biodegrades in 3-6 months<sup id="ref4b"><a href="#fn4">[4]</a></sup> — 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.<sup id="ref5"><a href="#fn5">[5]</a></sup>
</p>
<!-- ============================================================ -->
<!-- THE MINIMUM QUESTION -->
<!-- ============================================================ -->
<span class="step-label">STEP 4</span>
<h3>Minimum Bioplastic to Fill a Void</h3>
<p>
An average American household consumes roughly 200 kg of plastic per year.<sup id="ref6"><a href="#fn6">[6]</a></sup> 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?
</p>
<p>
Packaging & disposable containers account for roughly 100-115 kg per household per year.<sup id="ref7"><a href="#fn7">[7]</a></sup> 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 <b>30-50 kg per household per year</b>.
</p>
<p>
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.
</p>
<table>
<thead>
<tr><th>Category</th><th>kg/yr per household</th><th>Replacement</th></tr>
</thead>
<tbody>
<tr><td>Food packaging trays</td><td>~15</td><td>hemp bioplastic</td></tr>
<tr><td>Disposable cutlery & plates</td><td>~5</td><td>hemp bioplastic or bamboo</td></tr>
<tr><td>Shopping & produce bags</td><td>~5</td><td>hemp bioplastic or cloth</td></tr>
<tr><td>Plant pots & garden</td><td>~5</td><td>hemp bioplastic</td></tr>
<tr><td>Bottles & jars</td><td>~25</td><td>glass & steel</td></tr>
<tr><td>Cling wrap & barrier films</td><td>~10</td><td>beeswax wrap & paper</td></tr>
<tr><td>Cleaning product bottles</td><td>~10</td><td>glass, refill stations</td></tr>
<tr><td>Synthetic textiles</td><td>~25</td><td>cotton, hemp, wool</td></tr>
<tr><td>Durable goods & electronics</td><td>~80</td><td>no direct substitute yet</td></tr>
<tr><td>Plumbing & infrastructure</td><td>~20</td><td>copper, steel, clay</td></tr>
</tbody>
</table>
<p>
<b>Minimum hemp bioplastic per household: ~30 kg/year.</b> 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.
</p>
<!-- ============================================================ -->
<!-- ACRE YIELDS -->
<!-- ============================================================ -->
<span class="step-label">STEP 5</span>
<h3>Land: 1/3 Acre, 1 Acre, 3 Acres</h3>
<p>
Conservative baseline: 4 tons of dry stalk per acre, 30% conversion to bioplastic = 1,200 kg bioplastic per acre.
</p>
<figure class="diagram">
<img src="img/acre-yields.svg" alt="Bioplastic yield from 1/3 acre, 1 acre, and 3 acres of hemp">
<figcaption>conservative estimates. optimized growing could double these numbers.</figcaption>
</figure>
<table>
<thead>
<tr><th>Land</th><th>Dry Stalk</th><th>Bioplastic</th><th>Serves (packaging)</th><th>Serves (all replaceable)</th></tr>
</thead>
<tbody>
<tr><td>1/3 acre</td><td>~1,333 kg</td><td>~400 kg</td><td>~33 people</td><td>~2 households</td></tr>
<tr><td>1 acre</td><td>~4,000 kg</td><td>~1,200 kg</td><td>~100 people</td><td>~6 households</td></tr>
<tr><td>3 acres</td><td>~12,000 kg</td><td>~3,600 kg</td><td>~300 people</td><td>~18 households</td></tr>
</tbody>
</table>
<p>
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.
</p>
<!-- ============================================================ -->
<!-- COMMUNITY SCALE -->
<!-- ============================================================ -->
<span class="step-label">STEP 6</span>
<h3>Household, Village, Town</h3>
<p>
How much hemp land does a community need to refuse petroleum-based disposable plastic entirely?
</p>
<figure class="diagram">
<img src="img/community-scale.svg" alt="Hemp land needed for a household, village, and town">
<figcaption>these numbers cover disposable plastic packaging only. ~20-30% of total plastic consumption.</figcaption>
</figure>
<table>
<thead>
<tr><th>Scale</th><th>People</th><th>Replaceable Plastic</th><th>Hemp Land Needed</th><th>Infrastructure</th></tr>
</thead>
<tbody>
<tr><td>Household</td><td>2.5</td><td>~30 kg/yr</td><td>~1,000 sq ft garden</td><td>workshop tools</td></tr>
<tr><td>Village</td><td>100</td><td>~1,200 kg/yr</td><td>~1 acre</td><td>shared decorticator & press ($42k)</td></tr>
<tr><td>Small town</td><td>1,000</td><td>~12,000 kg/yr</td><td>~10 acres</td><td>cooperative facility ($420k)</td></tr>
<tr><td>Town</td><td>10,000</td><td>~120,000 kg/yr</td><td>~100 acres</td><td>industrial facility ($4.20M)</td></tr>
</tbody>
</table>
<p>
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.
</p>
<!-- ============================================================ -->
<!-- COOPERATIVE MODEL -->
<!-- ============================================================ -->
<span class="step-label">STEP 7</span>
<h3>A Cooperative Model</h3>
<p>
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.
</p>
<figure class="diagram">
<img src="img/cooperative-model.svg" alt="Community cooperative model: growers, collection, shared processing, distribution">
<figcaption>growers pool harvest, shared facility processes, members get bioplastic at cost.</figcaption>
</figure>
<p>
<b>Heartland Hemp Cooperative</b> (Indiana/Ohio/Kentucky) — farmer-owned co-op, $500/share, pooling resources to purchase a shared decorticator. 20-40 member-farmers within 150-mile radius.<sup id="ref9"><a href="#fn9">[9]</a></sup>
</p>
<p>
<b>Western Fiber</b> (California) — converted a cooperative cotton gin to process hemp in off-season. Existing infrastructure, shared costs. Achieved ~8 tons/acre from irrigated fields.<sup id="ref10"><a href="#fn10">[10]</a></sup>
</p>
<p>
<b>Winona's Hemp</b> (White Earth, Minnesota) — Indigenous-led initiative building decortication on tribal land across northern plains. Partners with tribes across multiple reservations.<sup id="ref11"><a href="#fn11">[11]</a></sup>
</p>
<div class="honest-box">
<b>Infrastructure gap.</b> 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.
</div>
<!-- ============================================================ -->
<!-- COST REALITY -->
<!-- ============================================================ -->
<span class="step-label">STEP 8</span>
<h3>Cost Reality</h3>
<p>
Hemp bioplastic costs 2-3x more than petroleum plastic today.<sup id="ref8"><a href="#fn8">[8]</a></sup> No subsidies, no infrastructure, no scale.
</p>
<figure class="diagram">
<img src="img/cost-reality.svg" alt="Cost comparison: petroleum plastic vs hemp bioplastic per kg">
<figcaption>hemp bioplastic pellets: ~$5.18/kg. polypropylene: ~$2.20-2.53/kg.</figcaption>
</figure>
<p>
Corn-based PLA (another bioplastic) costs $2-3/kg & fell 50% in price since 2007 as infrastructure scaled.<sup id="ref13"><a href="#fn13">[13]</a></sup> 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.
</p>
<p>
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.
</p>
<!-- ============================================================ -->
<!-- WHAT A HOUSEHOLD ACTUALLY DOES -->
<!-- ============================================================ -->
<span class="step-label">STEP 9</span>
<h3>What a Household Actually Does</h3>
<p>
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.
</p>
<p>
<b>Step 1: Eliminate.</b> 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.
</p>
<p>
<b>Step 2: Grow.</b> 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.
</p>
<p>
<b>Step 3: Process cooperatively.</b> 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.
</p>
<p>
<b>Step 4: Compost.</b> 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.
</p>
<p>
Minimum bioplastic needed per household after eliminating everything else: <b>~30 kg/year</b>. Roughly one large backyard garden's worth of hemp.
</p>
<!-- ============================================================ -->
<!-- THE HONEST SUMMARY -->
<!-- ============================================================ -->
<hr>
<h3>Honest Summary</h3>
<p>
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.
</p>
<p>
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.
</p>
<p>
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.
</p>
<p>
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.
</p>
<p>
Grow food not lawn. Grow hemp not petroleum. Grow what cycles.
</p>
<hr>
<h3>Sources</h3>
<div class="footnotes">
<ol>
<li id="fn1">SARE Project <a href="https://projects.sare.org/project-reports/one22-410/" target="_blank">ONE22-410</a>, University of Vermont fiber variety trials: 4.9-12.1 tons dry matter/acre. <a href="https://hemp.ucdavis.edu/" target="_blank">UC Davis</a> field trials: 1.2-3.4 tons/acre. <a href="https://www.biomassconnect.org/technical-articles/hemp-as-a-biomass-crop/" target="_blank">Biomass Connect</a>: 12-15 tonnes/hectare in Europe. Conservative U.S. baseline of 3-5 tons/acre from Portland State University review (2022) &amp; <a href="http://www.hempfarm.org/Papers/Market_Analysis_for_Hemp.html" target="_blank">University of Wisconsin market analysis</a>. <a href="#ref1">&#8617;</a></li>
<li id="fn2">Bast fiber: 70-77% cellulose. Hurd: 40-48% cellulose. Whole stem: 47-55%. <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC8819531/" target="_blank">PMC 8819531</a>, "Hemp as a potential raw material toward a sustainable world." <a href="#ref2">&#8617;</a></li>
<li id="fn3">Liao (2022), <a href="https://escholarship.mcgill.ca/downloads/cz30pz65p.pdf" target="_blank">McGill University thesis</a>: 49.6% yield from bast, 23.9% from hurd. ITJFS (2024): 38.4% from whole hemp. <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC12073554/" target="_blank">PMC 12073554</a> (2025): 47% after sequential NaOH &amp; HCl treatments. <a href="#ref3">&#8617;</a></li>
<li id="fn4">Cellulose-based bioplastics decompose in 3-6 months under composting conditions. European Bioplastics certification standards (EN 13432). <a href="#ref4">&#8617;</a></li>
<li id="fn5">Lampoon Magazine / Western University: "100% hemp-derived polymer has been successfully developed at laboratory level but has yet to become commercially viable." <a href="#ref5">&#8617;</a></li>
<li id="fn6">U.S. EPA, <a href="https://www.epa.gov/facts-and-figures-about-materials-waste-and-recycling" target="_blank"><i>Advancing Sustainable Materials Management</i></a>: 35.7 million tons plastic in MSW (2018). <a href="https://www.oecd.org/en/publications/global-plastics-outlook_de747aef-en.html" target="_blank">OECD</a>: 221 kg/capita/year (2019). Law et al.: 130 kg/capita/year (2016). <a href="#ref6">&#8617;</a></li>
<li id="fn7">EPA packaging fraction: 14.5 million tons nationally (~113 kg/household/year). <a href="https://www.epa.gov/facts-and-figures-about-materials-waste-and-recycling" target="_blank">EPA Facts &amp; Figures</a>, 2018 data. <a href="#ref7">&#8617;</a></li>
<li id="fn8"><a href="https://cannatechtoday.com/" target="_blank">CannaTech Today</a> (2018): ~$2.35/lb ($5.18/kg) for hemp plastic pellets vs. $1.00-1.15/lb for polypropylene. <a href="https://www.plasticsengineering.org/" target="_blank">Plastics Engineering</a> (2025): bioplastics general range $2.50-15.00/kg. <a href="#ref8">&#8617;</a></li>
<li id="fn9">Heartland Hemp Cooperative. <a href="https://www.farmprogress.com/hemp/hemp-fiber-co-op-opens-for-business" target="_blank">Farm Progress</a> (Dec 2020), <a href="https://www.cannabisbusinesstimes.com/" target="_blank">Cannabis Business Times</a> (Nov 2020). Farmer-owned co-op, $500/share, 20-40 member-farmers within 150-mile radius of Louisville, KY. <a href="#ref9">&#8617;</a></li>
<li id="fn10">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. <a href="#ref10">&#8617;</a></li>
<li id="fn11">Winona's Hemp / Anishinaabe Agriculture Institute, White Earth, Minnesota. <a href="https://www.oneearth.org/projects/restoring-a-hemp-fiber-economy/" target="_blank">One Earth</a> (2022). Indigenous-led decortication facility across northern plains tribal land. <a href="#ref11">&#8617;</a></li>
<li id="fn12"><a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC7356019/" target="_blank">PMC 7356019</a>, <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC7362229/" target="_blank">PMC 7362229</a>: 2-17.5% NaOH solutions, 50-90°C, 2-5 hours. Above 10% concentration risks fiber damage. <a href="#ref12">&#8617;</a></li>
<li id="fn13">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. <a href="#ref13">&#8617;</a></li>
</ol>
</div>
<hr>
<p><a href="/single-use-plastics/">&#8592; single-use plastics</a> · <a href="/let-us-define-a-permacomputer/">manifesto</a></p>
</main>
<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>
<script src="/js/diagram-zoom.js"></script>
<script src="https://uncloseai.com/uncloseai.js" type="module"></script>
</body>
</html>

View file

@ -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=<<B><FONT COLOR="#cccccc" POINT-SIZE="14">distributed hub replication model</FONT></B>>
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 &amp; 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]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

View file

@ -0,0 +1,192 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: distributed_hub Pages: 1 -->
<svg width="702pt" height="489pt"
viewBox="0.00 0.00 702.00 489.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 485)">
<title>distributed_hub</title>
<polygon fill="#1a1a2e" stroke="transparent" points="-4,4 -4,-485 698,-485 698,4 -4,4"/>
<text text-anchor="start" x="213.5" y="-466.8" font-family="Times,serif" font-weight="bold" font-size="14.00" fill="#cccccc">distributed hub replication model</text>
<g id="clust1" class="cluster">
<title>cluster_model</title>
<polygon fill="#1a1a2e" stroke="#555555" stroke-dasharray="5,2" points="8,-103 8,-450 408,-450 408,-103 8,-103"/>
<text text-anchor="middle" x="208" y="-437.2" font-family="Helvetica Bold" font-size="11.00" fill="#cccccc">LOCAL FIBER, STANDARDIZED PROCESS, LOCAL PRODUCTS</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_local_in</title>
<polygon fill="#1a1a2e" stroke="#4caf50" stroke-dasharray="5,2" points="30,-351 30,-422 364,-422 364,-351 30,-351"/>
<text text-anchor="middle" x="197" y="-410" font-family="Helvetica Bold" font-size="10.00" fill="#4caf50">LOCAL INPUTS</text>
</g>
<g id="clust3" class="cluster">
<title>cluster_standard</title>
<polygon fill="#1a1a2e" stroke="#2196f3" stroke-dasharray="5,2" points="118,-220 118,-307 284,-307 284,-220 118,-220"/>
<text text-anchor="middle" x="201" y="-295" font-family="Helvetica Bold" font-size="10.00" fill="#2196f3">STANDARDIZED PROCESSING</text>
</g>
<g id="clust4" class="cluster">
<title>cluster_local_out</title>
<polygon fill="#1a1a2e" stroke="#ff9800" stroke-dasharray="5,2" points="16,-111 16,-182 400,-182 400,-111 16,-111"/>
<text text-anchor="middle" x="208" y="-170" font-family="Helvetica Bold" font-size="10.00" fill="#ff9800">LOCAL PRODUCTS</text>
</g>
<g id="clust5" class="cluster">
<title>cluster_hubs</title>
<polygon fill="#1a1a2e" stroke="#8e24aa" stroke-dasharray="5,2" points="416,-8 416,-425.5 538,-425.5 538,-8 416,-8"/>
<text text-anchor="middle" x="477" y="-412.7" font-family="Helvetica Bold" font-size="11.00" fill="#8e24aa">HUB NETWORK</text>
</g>
<!-- farm1 -->
<g id="node1" class="node">
<title>farm1</title>
<polygon fill="#2e7d32" stroke="black" points="134.5,-395 37.5,-395 37.5,-359 134.5,-359 134.5,-395"/>
<text text-anchor="middle" x="86" y="-374.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">local hemp farm</text>
</g>
<!-- process -->
<g id="node4" class="node">
<title>process</title>
<polygon fill="#1565c0" stroke="black" points="267.5,-280 134.5,-280 134.5,-228 267.5,-228 267.5,-280"/>
<text text-anchor="middle" x="201" y="-268" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">7&#45;station factory</text>
<text text-anchor="middle" x="201" y="-257" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">standard equipment</text>
<text text-anchor="middle" x="201" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">standard recipes</text>
<text text-anchor="middle" x="201" y="-235" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">standard quality checks</text>
</g>
<!-- farm1&#45;&gt;process -->
<g id="edge1" class="edge">
<title>farm1&#45;&gt;process</title>
<path fill="none" stroke="#888888" d="M102.23,-358.92C119.7,-340.54 147.9,-310.87 169.71,-287.92"/>
<polygon fill="#888888" stroke="#888888" points="172.48,-290.09 176.83,-280.43 167.41,-285.26 172.48,-290.09"/>
</g>
<!-- farm2 -->
<g id="node2" class="node">
<title>farm2</title>
<polygon fill="#388e3c" stroke="black" points="249,-395 153,-395 153,-359 249,-359 249,-395"/>
<text text-anchor="middle" x="201" y="-380" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">nettle foraging</text>
<text text-anchor="middle" x="201" y="-369" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">community land</text>
</g>
<!-- farm2&#45;&gt;process -->
<g id="edge2" class="edge">
<title>farm2&#45;&gt;process</title>
<path fill="none" stroke="#888888" d="M201,-358.92C201,-341.26 201,-313.17 201,-290.65"/>
<polygon fill="#888888" stroke="#888888" points="204.5,-290.43 201,-280.43 197.5,-290.43 204.5,-290.43"/>
</g>
<!-- farm3 -->
<g id="node3" class="node">
<title>farm3</title>
<polygon fill="#4e342e" stroke="black" points="356.5,-395 267.5,-395 267.5,-359 356.5,-359 356.5,-395"/>
<text text-anchor="middle" x="312" y="-380" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">sawmill refuse</text>
<text text-anchor="middle" x="312" y="-369" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">local timber</text>
</g>
<!-- farm3&#45;&gt;process -->
<g id="edge3" class="edge">
<title>farm3&#45;&gt;process</title>
<path fill="none" stroke="#888888" d="M296.33,-358.92C279.47,-340.54 252.25,-310.87 231.2,-287.92"/>
<polygon fill="#888888" stroke="#888888" points="233.66,-285.43 224.33,-280.43 228.51,-290.16 233.66,-285.43"/>
</g>
<!-- market -->
<g id="node5" class="node">
<title>market</title>
<polygon fill="#e65100" stroke="black" points="132,-155 24,-155 24,-119 132,-119 132,-155"/>
<text text-anchor="middle" x="78" y="-140" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">local farm market</text>
<text text-anchor="middle" x="78" y="-129" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">direct to consumer</text>
</g>
<!-- process&#45;&gt;market -->
<g id="edge4" class="edge">
<title>process&#45;&gt;market</title>
<path fill="none" stroke="#888888" d="M174.01,-227.76C153.19,-208.3 124.57,-181.54 104,-162.31"/>
<polygon fill="#888888" stroke="#888888" points="106.24,-159.62 96.55,-155.34 101.46,-164.73 106.24,-159.62"/>
</g>
<!-- coop -->
<g id="node6" class="node">
<title>coop</title>
<polygon fill="#f57c00" stroke="black" points="251.5,-155 150.5,-155 150.5,-119 251.5,-119 251.5,-155"/>
<text text-anchor="middle" x="201" y="-140" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">food co&#45;ops</text>
<text text-anchor="middle" x="201" y="-129" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">zero waste shops</text>
</g>
<!-- process&#45;&gt;coop -->
<g id="edge5" class="edge">
<title>process&#45;&gt;coop</title>
<path fill="none" stroke="#888888" d="M201,-227.76C201,-209.33 201,-184.35 201,-165.42"/>
<polygon fill="#888888" stroke="#888888" points="204.5,-165.34 201,-155.34 197.5,-165.34 204.5,-165.34"/>
</g>
<!-- school -->
<g id="node7" class="node">
<title>school</title>
<polygon fill="#ff9800" stroke="black" points="392,-155 270,-155 270,-119 392,-119 392,-155"/>
<text text-anchor="middle" x="331" y="-140" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">schools &amp; community</text>
<text text-anchor="middle" x="331" y="-129" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">education programs</text>
</g>
<!-- process&#45;&gt;school -->
<g id="edge6" class="edge">
<title>process&#45;&gt;school</title>
<path fill="none" stroke="#888888" d="M229.53,-227.76C251.63,-208.21 282.05,-181.31 303.8,-162.06"/>
<polygon fill="#888888" stroke="#888888" points="306.22,-164.59 311.39,-155.34 301.59,-159.35 306.22,-164.59"/>
</g>
<!-- hub1 -->
<g id="node8" class="node">
<title>hub1</title>
<polygon fill="#6a1b9a" stroke="black" points="514.5,-397.5 439.5,-397.5 439.5,-356.5 514.5,-356.5 514.5,-397.5"/>
<text text-anchor="middle" x="477" y="-385.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">Hub A</text>
<text text-anchor="middle" x="477" y="-374.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">rural village</text>
<text text-anchor="middle" x="477" y="-363.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">hemp focus</text>
</g>
<!-- hub2 -->
<g id="node9" class="node">
<title>hub2</title>
<polygon fill="#7b1fa2" stroke="black" points="516.5,-274.5 437.5,-274.5 437.5,-233.5 516.5,-233.5 516.5,-274.5"/>
<text text-anchor="middle" x="477" y="-262.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">Hub B</text>
<text text-anchor="middle" x="477" y="-251.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">coastal town</text>
<text text-anchor="middle" x="477" y="-240.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">nettle focus</text>
</g>
<!-- hub1&#45;&gt;hub2 -->
<g id="edge7" class="edge">
<title>hub1&#45;&gt;hub2</title>
<path fill="none" stroke="#8e24aa" stroke-dasharray="5,2" d="M477,-356.29C477,-336.95 477,-307.21 477,-284.95"/>
<polygon fill="#8e24aa" stroke="#8e24aa" points="480.5,-284.7 477,-274.7 473.5,-284.7 480.5,-284.7"/>
<text text-anchor="middle" x="501.5" y="-327.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">shared</text>
<text text-anchor="middle" x="501.5" y="-317.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">knowledge</text>
</g>
<!-- hub3 -->
<g id="node10" class="node">
<title>hub3</title>
<polygon fill="#8e24aa" stroke="black" points="530,-157.5 424,-157.5 424,-116.5 530,-116.5 530,-157.5"/>
<text text-anchor="middle" x="477" y="-145.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">Hub C</text>
<text text-anchor="middle" x="477" y="-134.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">forest region</text>
<text text-anchor="middle" x="477" y="-123.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">wood refuse focus</text>
</g>
<!-- hub2&#45;&gt;hub3 -->
<g id="edge8" class="edge">
<title>hub2&#45;&gt;hub3</title>
<path fill="none" stroke="#8e24aa" stroke-dasharray="5,2" d="M477,-233.49C477,-215.48 477,-188.48 477,-167.77"/>
<polygon fill="#8e24aa" stroke="#8e24aa" points="480.5,-167.6 477,-157.6 473.5,-167.6 480.5,-167.6"/>
<text text-anchor="middle" x="501.5" y="-202.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">shared</text>
<text text-anchor="middle" x="501.5" y="-192.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">knowledge</text>
</g>
<!-- hub4 -->
<g id="node11" class="node">
<title>hub4</title>
<polygon fill="#9c27b0" stroke="black" points="525.5,-57 428.5,-57 428.5,-16 525.5,-16 525.5,-57"/>
<text text-anchor="middle" x="477" y="-45" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">Hub D</text>
<text text-anchor="middle" x="477" y="-34" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">your community</text>
<text text-anchor="middle" x="477" y="-23" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">?</text>
</g>
<!-- hub3&#45;&gt;hub4 -->
<g id="edge9" class="edge">
<title>hub3&#45;&gt;hub4</title>
<path fill="none" stroke="#8e24aa" stroke-dasharray="5,2" d="M477,-116.07C477,-102.09 477,-83.16 477,-67.39"/>
<polygon fill="#8e24aa" stroke="#8e24aa" points="480.5,-67.07 477,-57.07 473.5,-67.07 480.5,-67.07"/>
<text text-anchor="middle" x="501.5" y="-87.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">shared</text>
<text text-anchor="middle" x="501.5" y="-77.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">knowledge</text>
</g>
<!-- replicate -->
<g id="node12" class="node">
<title>replicate</title>
<polygon fill="#263238" stroke="black" points="688,-401 546,-401 546,-353 694,-353 694,-395 688,-401"/>
<polyline fill="none" stroke="black" points="688,-401 688,-395 "/>
<polyline fill="none" stroke="black" points="694,-395 688,-395 "/>
<text text-anchor="middle" x="620" y="-389.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">each hub adapts</text>
<text text-anchor="middle" x="620" y="-379.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">fiber sources to local ecology</text>
<text text-anchor="middle" x="620" y="-369.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">products to local demand</text>
<text text-anchor="middle" x="620" y="-359.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">pricing to local economy</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -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=<<B><FONT COLOR="#cccccc" POINT-SIZE="14">station 2: extraction (two paths)</FONT></B>>
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 &amp; 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&amp; 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]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

View file

@ -0,0 +1,167 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: extraction_station Pages: 1 -->
<svg width="632pt" height="427pt"
viewBox="0.00 0.00 631.50 427.35" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 423.35)">
<title>extraction_station</title>
<polygon fill="#1a1a2e" stroke="transparent" points="-4,4 -4,-423.35 627.5,-423.35 627.5,4 -4,4"/>
<text text-anchor="start" x="184.25" y="-405.15" font-family="Times,serif" font-weight="bold" font-size="14.00" fill="#cccccc">station 2: extraction (two paths)</text>
<g id="clust1" class="cluster">
<title>cluster_naoh</title>
<polygon fill="#1a1a2e" stroke="#2196f3" stroke-dasharray="5,2" points="8,-86.14 8,-312.35 177,-312.35 177,-86.14 8,-86.14"/>
<text text-anchor="middle" x="92.5" y="-299.55" font-family="Helvetica Bold" font-size="11.00" fill="#2196f3">PATH A: NaOH EXTRACTION</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_citric</title>
<polygon fill="#1a1a2e" stroke="#ff9800" stroke-dasharray="5,2" points="395,-86.14 395,-312.35 594,-312.35 594,-86.14 395,-86.14"/>
<text text-anchor="middle" x="494.5" y="-299.55" font-family="Helvetica Bold" font-size="11.00" fill="#ff9800">PATH B: CITRIC ACID CROSSLINK</text>
</g>
<!-- fiber_in -->
<g id="node1" class="node">
<title>fiber_in</title>
<polygon fill="#66bb6a" stroke="black" points="339.5,-395.35 240.5,-395.35 240.5,-359.35 339.5,-359.35 339.5,-395.35"/>
<text text-anchor="middle" x="290" y="-380.35" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">PREPARED FIBER</text>
<text text-anchor="middle" x="290" y="-369.35" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">from Station 1</text>
</g>
<!-- naoh_dissolve -->
<g id="node2" class="node">
<title>naoh_dissolve</title>
<polygon fill="#1565c0" stroke="black" points="165,-284.35 75,-284.35 75,-248.35 165,-248.35 165,-284.35"/>
<text text-anchor="middle" x="120" y="-269.35" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">dissolve NaOH</text>
<text text-anchor="middle" x="120" y="-258.35" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">5&#45;12% solution</text>
</g>
<!-- fiber_in&#45;&gt;naoh_dissolve -->
<g id="edge5" class="edge">
<title>fiber_in&#45;&gt;naoh_dissolve</title>
<path fill="none" stroke="#888888" d="M263.44,-359.32C234.33,-340.65 187.5,-310.63 155.32,-289.99"/>
<polygon fill="#888888" stroke="#888888" points="156.96,-286.89 146.66,-284.44 153.19,-292.78 156.96,-286.89"/>
<text text-anchor="middle" x="260" y="-333.15" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">higher purity</text>
<text text-anchor="middle" x="260" y="-323.15" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">more waste</text>
</g>
<!-- citric_paper -->
<g id="node5" class="node">
<title>citric_paper</title>
<polygon fill="#e65100" stroke="black" points="507,-284.35 407,-284.35 407,-248.35 507,-248.35 507,-284.35"/>
<text text-anchor="middle" x="457" y="-269.35" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">spread fiber</text>
<text text-anchor="middle" x="457" y="-258.35" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">press into sheets</text>
</g>
<!-- fiber_in&#45;&gt;citric_paper -->
<g id="edge6" class="edge">
<title>fiber_in&#45;&gt;citric_paper</title>
<path fill="none" stroke="#888888" d="M316.09,-359.32C344.69,-340.65 390.69,-310.63 422.3,-289.99"/>
<polygon fill="#888888" stroke="#888888" points="424.35,-292.84 430.81,-284.44 420.53,-286.97 424.35,-292.84"/>
<text text-anchor="middle" x="404" y="-333.15" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">less waste</text>
<text text-anchor="middle" x="404" y="-323.15" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">simpler setup</text>
</g>
<!-- naoh_soak -->
<g id="node3" class="node">
<title>naoh_soak</title>
<polygon fill="#1976d2" stroke="black" points="169,-211.35 47,-211.35 47,-170.35 169,-170.35 169,-211.35"/>
<text text-anchor="middle" x="108" y="-199.35" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">soak fiber</text>
<text text-anchor="middle" x="108" y="-188.35" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">80C for 2&#45;3 hours</text>
<text text-anchor="middle" x="108" y="-177.35" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">or room temp 4 hours</text>
</g>
<!-- naoh_dissolve&#45;&gt;naoh_soak -->
<g id="edge1" class="edge">
<title>naoh_dissolve&#45;&gt;naoh_soak</title>
<path fill="none" stroke="#888888" d="M117.22,-248.3C115.91,-240.29 114.31,-230.51 112.82,-221.35"/>
<polygon fill="#888888" stroke="#888888" points="116.26,-220.71 111.19,-211.4 109.35,-221.83 116.26,-220.71"/>
</g>
<!-- naoh_filter -->
<g id="node4" class="node">
<title>naoh_filter</title>
<polygon fill="#1e88e5" stroke="black" points="163,-130.14 71,-130.14 71,-94.14 163,-94.14 163,-130.14"/>
<text text-anchor="middle" x="117" y="-115.14" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">filter &amp; wash</text>
<text text-anchor="middle" x="117" y="-104.14" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">until pH neutral</text>
</g>
<!-- naoh_soak&#45;&gt;naoh_filter -->
<g id="edge2" class="edge">
<title>naoh_soak&#45;&gt;naoh_filter</title>
<path fill="none" stroke="#888888" d="M110.32,-170.09C111.38,-161.03 112.66,-150.14 113.81,-140.32"/>
<polygon fill="#888888" stroke="#888888" points="117.31,-140.56 115,-130.22 110.35,-139.74 117.31,-140.56"/>
</g>
<!-- waste_a -->
<g id="node9" class="node">
<title>waste_a</title>
<ellipse fill="#37474f" stroke="black" cx="286" cy="-112.14" rx="101.23" ry="21.43"/>
<text text-anchor="middle" x="286" y="-115.14" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#aaaaaa">NaOH waste liquor</text>
<text text-anchor="middle" x="286" y="-104.14" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#aaaaaa">neutralize before disposal</text>
</g>
<!-- naoh_soak&#45;&gt;waste_a -->
<g id="edge9" class="edge">
<title>naoh_soak&#45;&gt;waste_a</title>
<path fill="none" stroke="#555555" stroke-dasharray="5,2" d="M153.38,-170.29C178.05,-159.66 208.68,-146.46 234.28,-135.43"/>
<polygon fill="#555555" stroke="#555555" points="235.66,-138.64 243.46,-131.47 232.89,-132.21 235.66,-138.64"/>
</g>
<!-- cellulose_out -->
<g id="node8" class="node">
<title>cellulose_out</title>
<polygon fill="#64b5f6" stroke="black" points="365.01,-17.46 365.01,-36.46 321.07,-49.89 258.93,-49.89 214.99,-36.46 214.99,-17.46 258.93,-4.03 321.07,-4.03 365.01,-17.46"/>
<polygon fill="none" stroke="black" points="369.01,-14.51 369.01,-39.41 321.67,-53.88 258.33,-53.88 210.99,-39.41 210.99,-14.51 258.33,-0.04 321.67,-0.04 369.01,-14.51"/>
<text text-anchor="middle" x="290" y="-29.96" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1a1a2e">RAW CELLULOSE</text>
<text text-anchor="middle" x="290" y="-18.96" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1a1a2e">to Station 3</text>
</g>
<!-- naoh_filter&#45;&gt;cellulose_out -->
<g id="edge7" class="edge">
<title>naoh_filter&#45;&gt;cellulose_out</title>
<path fill="none" stroke="#888888" d="M152.43,-94.1C176.21,-82.67 208.03,-67.37 235.07,-54.37"/>
<polygon fill="#888888" stroke="#888888" points="236.92,-57.36 244.42,-49.88 233.89,-51.05 236.92,-57.36"/>
</g>
<!-- citric_soak -->
<g id="node6" class="node">
<title>citric_soak</title>
<polygon fill="#f57c00" stroke="black" points="520.5,-208.85 403.5,-208.85 403.5,-172.85 520.5,-172.85 520.5,-208.85"/>
<text text-anchor="middle" x="462" y="-193.85" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">soak in</text>
<text text-anchor="middle" x="462" y="-182.85" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">citric acid + glycerol</text>
</g>
<!-- citric_paper&#45;&gt;citric_soak -->
<g id="edge3" class="edge">
<title>citric_paper&#45;&gt;citric_soak</title>
<path fill="none" stroke="#888888" d="M458.16,-248.3C458.75,-239.64 459.48,-228.91 460.14,-219.14"/>
<polygon fill="#888888" stroke="#888888" points="463.64,-219.27 460.83,-209.06 456.66,-218.8 463.64,-219.27"/>
</g>
<!-- citric_cure -->
<g id="node7" class="node">
<title>citric_cure</title>
<polygon fill="#ff9800" stroke="black" points="500.5,-130.14 411.5,-130.14 411.5,-94.14 500.5,-94.14 500.5,-130.14"/>
<text text-anchor="middle" x="456" y="-115.14" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">cure at 140C</text>
<text text-anchor="middle" x="456" y="-104.14" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">under pressure</text>
</g>
<!-- citric_soak&#45;&gt;citric_cure -->
<g id="edge4" class="edge">
<title>citric_soak&#45;&gt;citric_cure</title>
<path fill="none" stroke="#888888" d="M460.67,-172.82C459.93,-163.35 458.99,-151.34 458.15,-140.58"/>
<polygon fill="#888888" stroke="#888888" points="461.62,-140.07 457.35,-130.38 454.64,-140.62 461.62,-140.07"/>
</g>
<!-- citric_cure&#45;&gt;cellulose_out -->
<g id="edge8" class="edge">
<title>citric_cure&#45;&gt;cellulose_out</title>
<path fill="none" stroke="#888888" d="M422.01,-94.1C399.45,-82.8 369.37,-67.73 343.62,-54.83"/>
<polygon fill="#888888" stroke="#888888" points="344.86,-51.54 334.35,-50.18 341.73,-57.79 344.86,-51.54"/>
</g>
<!-- note_citric -->
<g id="node10" class="node">
<title>note_citric</title>
<polygon fill="#263238" stroke="black" points="474,-396.35 358,-396.35 358,-358.35 480,-358.35 480,-390.35 474,-396.35"/>
<polyline fill="none" stroke="black" points="474,-396.35 474,-390.35 "/>
<polyline fill="none" stroke="black" points="480,-390.35 474,-390.35 "/>
<text text-anchor="middle" x="419" y="-385.15" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">citric acid path</text>
<text text-anchor="middle" x="419" y="-375.15" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">produces less waste</text>
<text text-anchor="middle" x="419" y="-365.15" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">&amp; avoids NaOH hazards</text>
</g>
<!-- rotation -->
<g id="node11" class="node">
<title>rotation</title>
<polygon fill="#263238" stroke="black" points="617.5,-396.35 498.5,-396.35 498.5,-358.35 623.5,-358.35 623.5,-390.35 617.5,-396.35"/>
<polyline fill="none" stroke="black" points="617.5,-396.35 617.5,-390.35 "/>
<polyline fill="none" stroke="black" points="623.5,-390.35 617.5,-390.35 "/>
<text text-anchor="middle" x="561" y="-385.15" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">continuous operation:</text>
<text text-anchor="middle" x="561" y="-375.15" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">3&#45;4 reaction vessels</text>
<text text-anchor="middle" x="561" y="-365.15" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">rotating through stages</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View file

@ -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=<<B><FONT COLOR="#cccccc" POINT-SIZE="14">continuous-flow bioplastic factory: 7 stations</FONT></B>>
labelloc=t
s1 [label="STATION 1\nFiber Intake &amp; 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 &amp; 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 &amp; 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"]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

View file

@ -0,0 +1,165 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: factory_flow Pages: 1 -->
<svg width="379pt" height="802pt"
viewBox="0.00 0.00 379.00 802.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 798)">
<title>factory_flow</title>
<polygon fill="#1a1a2e" stroke="transparent" points="-4,4 -4,-798 375,-798 375,4 -4,4"/>
<text text-anchor="start" x="8" y="-779.8" font-family="Times,serif" font-weight="bold" font-size="14.00" fill="#cccccc">continuous&#45;flow bioplastic factory: 7 stations</text>
<!-- s1 -->
<g id="node1" class="node">
<title>s1</title>
<polygon fill="#2e7d32" stroke="black" points="259.25,-698 114.25,-698 114.25,-657 259.25,-657 259.25,-698"/>
<text text-anchor="middle" x="186.75" y="-686" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">STATION 1</text>
<text text-anchor="middle" x="186.75" y="-675" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">Fiber Intake &amp; Prep</text>
<text text-anchor="middle" x="186.75" y="-664" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">hemp, nettle, wood refuse</text>
</g>
<!-- s2 -->
<g id="node2" class="node">
<title>s2</title>
<polygon fill="#1565c0" stroke="black" points="240.75,-601 132.75,-601 132.75,-560 240.75,-560 240.75,-601"/>
<text text-anchor="middle" x="186.75" y="-589" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">STATION 2</text>
<text text-anchor="middle" x="186.75" y="-578" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">Extraction</text>
<text text-anchor="middle" x="186.75" y="-567" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">NaOH or citric acid</text>
</g>
<!-- s1&#45;&gt;s2 -->
<g id="edge1" class="edge">
<title>s1&#45;&gt;s2</title>
<path fill="none" stroke="#888888" d="M186.75,-656.82C186.75,-643.7 186.75,-626.2 186.75,-611.38"/>
<polygon fill="#888888" stroke="#888888" points="190.25,-611.16 186.75,-601.16 183.25,-611.16 190.25,-611.16"/>
<text text-anchor="middle" x="207.75" y="-631.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">prepared</text>
<text text-anchor="middle" x="207.75" y="-621.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">fiber</text>
</g>
<!-- s3 -->
<g id="node3" class="node">
<title>s3</title>
<polygon fill="#1976d2" stroke="black" points="246.75,-504 126.75,-504 126.75,-463 246.75,-463 246.75,-504"/>
<text text-anchor="middle" x="186.75" y="-492" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">STATION 3</text>
<text text-anchor="middle" x="186.75" y="-481" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">Washing &amp; Drying</text>
<text text-anchor="middle" x="186.75" y="-470" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">counter&#45;current wash</text>
</g>
<!-- s2&#45;&gt;s3 -->
<g id="edge2" class="edge">
<title>s2&#45;&gt;s3</title>
<path fill="none" stroke="#888888" d="M186.75,-559.82C186.75,-546.7 186.75,-529.2 186.75,-514.38"/>
<polygon fill="#888888" stroke="#888888" points="190.25,-514.16 186.75,-504.16 183.25,-514.16 190.25,-514.16"/>
<text text-anchor="middle" x="206.25" y="-534.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">raw</text>
<text text-anchor="middle" x="206.25" y="-524.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">cellulose</text>
</g>
<!-- s4 -->
<g id="node4" class="node">
<title>s4</title>
<polygon fill="#7b1fa2" stroke="black" points="270.75,-407 102.75,-407 102.75,-366 270.75,-366 270.75,-407"/>
<text text-anchor="middle" x="186.75" y="-395" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">STATION 4</text>
<text text-anchor="middle" x="186.75" y="-384" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">Mixing</text>
<text text-anchor="middle" x="186.75" y="-373" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">cellulose + glycerol + pigment</text>
</g>
<!-- s3&#45;&gt;s4 -->
<g id="edge3" class="edge">
<title>s3&#45;&gt;s4</title>
<path fill="none" stroke="#888888" d="M186.75,-462.82C186.75,-449.7 186.75,-432.2 186.75,-417.38"/>
<polygon fill="#888888" stroke="#888888" points="190.25,-417.16 186.75,-407.16 183.25,-417.16 190.25,-417.16"/>
<text text-anchor="middle" x="206.25" y="-437.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">dry</text>
<text text-anchor="middle" x="206.25" y="-427.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">cellulose</text>
</g>
<!-- s5 -->
<g id="node5" class="node">
<title>s5</title>
<polygon fill="#e65100" stroke="black" points="242.25,-310 131.25,-310 131.25,-269 242.25,-269 242.25,-310"/>
<text text-anchor="middle" x="186.75" y="-298" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">STATION 5</text>
<text text-anchor="middle" x="186.75" y="-287" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">Pressing &amp; Molding</text>
<text text-anchor="middle" x="186.75" y="-276" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">hot press 150&#45;240C</text>
</g>
<!-- s4&#45;&gt;s5 -->
<g id="edge4" class="edge">
<title>s4&#45;&gt;s5</title>
<path fill="none" stroke="#888888" d="M186.75,-365.82C186.75,-352.7 186.75,-335.2 186.75,-320.38"/>
<polygon fill="#888888" stroke="#888888" points="190.25,-320.16 186.75,-310.16 183.25,-320.16 190.25,-320.16"/>
<text text-anchor="middle" x="211.25" y="-340.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">mixed</text>
<text text-anchor="middle" x="211.25" y="-330.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">compound</text>
</g>
<!-- s6 -->
<g id="node6" class="node">
<title>s6</title>
<polygon fill="#ff9800" stroke="black" points="244.25,-213 129.25,-213 129.25,-172 244.25,-172 244.25,-213"/>
<text text-anchor="middle" x="186.75" y="-201" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">STATION 6</text>
<text text-anchor="middle" x="186.75" y="-190" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">Finishing</text>
<text text-anchor="middle" x="186.75" y="-179" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">trim, inspect, stamp</text>
</g>
<!-- s5&#45;&gt;s6 -->
<g id="edge5" class="edge">
<title>s5&#45;&gt;s6</title>
<path fill="none" stroke="#888888" d="M186.75,-268.82C186.75,-255.7 186.75,-238.2 186.75,-223.38"/>
<polygon fill="#888888" stroke="#888888" points="190.25,-223.16 186.75,-213.16 183.25,-223.16 190.25,-223.16"/>
<text text-anchor="middle" x="207.25" y="-243.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">pressed</text>
<text text-anchor="middle" x="207.25" y="-233.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">products</text>
</g>
<!-- s7 -->
<g id="node7" class="node">
<title>s7</title>
<polygon fill="#795548" stroke="black" points="172.25,-116 63.25,-116 63.25,-75 172.25,-75 172.25,-116"/>
<text text-anchor="middle" x="117.75" y="-104" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">COMPOST DEMO</text>
<text text-anchor="middle" x="117.75" y="-93" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">display only</text>
<text text-anchor="middle" x="117.75" y="-82" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">hot aerobic 60&#45;70C</text>
</g>
<!-- s6&#45;&gt;s7 -->
<g id="edge6" class="edge">
<title>s6&#45;&gt;s7</title>
<path fill="none" stroke="#888888" d="M172.45,-171.82C162.55,-158.19 149.23,-139.84 138.21,-124.67"/>
<polygon fill="#888888" stroke="#888888" points="140.74,-122.19 132.03,-116.16 135.07,-126.31 140.74,-122.19"/>
<text text-anchor="middle" x="177.25" y="-146.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">demo</text>
<text text-anchor="middle" x="177.25" y="-136.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">samples</text>
</g>
<!-- products -->
<g id="node9" class="node">
<title>products</title>
<polygon fill="#263238" stroke="black" points="312.75,-114.5 190.75,-114.5 190.75,-76.5 318.75,-76.5 318.75,-108.5 312.75,-114.5"/>
<polyline fill="none" stroke="black" points="312.75,-114.5 312.75,-108.5 "/>
<polyline fill="none" stroke="black" points="318.75,-108.5 312.75,-108.5 "/>
<text text-anchor="middle" x="254.75" y="-103.3" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">durable products</text>
<text text-anchor="middle" x="254.75" y="-93.3" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">kitchen, garden, storage</text>
<text text-anchor="middle" x="254.75" y="-83.3" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">years of daily use</text>
</g>
<!-- s6&#45;&gt;products -->
<g id="edge8" class="edge">
<title>s6&#45;&gt;products</title>
<path fill="none" stroke="#ffc107" stroke-dasharray="5,2" d="M200.84,-171.82C211.01,-157.6 224.86,-138.25 235.98,-122.73"/>
<polygon fill="#ffc107" stroke="#ffc107" points="238.85,-124.72 241.83,-114.55 233.16,-120.65 238.85,-124.72"/>
</g>
<!-- compost -->
<g id="node10" class="node">
<title>compost</title>
<polygon fill="#263238" stroke="black" points="177.25,-38 52.25,-38 52.25,0 183.25,0 183.25,-32 177.25,-38"/>
<polyline fill="none" stroke="black" points="177.25,-38 177.25,-32 "/>
<polyline fill="none" stroke="black" points="183.25,-32 177.25,-32 "/>
<text text-anchor="middle" x="117.75" y="-26.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">end of life</text>
<text text-anchor="middle" x="117.75" y="-16.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">hot aerobic compost only</text>
<text text-anchor="middle" x="117.75" y="-6.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">60&#45;70C, 12&#45;24 weeks</text>
</g>
<!-- s7&#45;&gt;compost -->
<g id="edge9" class="edge">
<title>s7&#45;&gt;compost</title>
<path fill="none" stroke="#795548" stroke-dasharray="5,2" d="M117.75,-74.93C117.75,-66.83 117.75,-57.29 117.75,-48.46"/>
<polygon fill="#795548" stroke="#795548" points="121.25,-48.17 117.75,-38.17 114.25,-48.17 121.25,-48.17"/>
</g>
<!-- fiber -->
<g id="node8" class="node">
<title>fiber</title>
<polygon fill="#263238" stroke="black" points="248.75,-771 118.75,-771 118.75,-735 254.75,-735 254.75,-765 248.75,-771"/>
<polyline fill="none" stroke="black" points="248.75,-771 248.75,-765 "/>
<polyline fill="none" stroke="black" points="254.75,-765 248.75,-765 "/>
<text text-anchor="middle" x="186.75" y="-755.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">local fiber sources</text>
<text text-anchor="middle" x="186.75" y="-745.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">hemp, nettle, wood refuse</text>
</g>
<!-- fiber&#45;&gt;s1 -->
<g id="edge7" class="edge">
<title>fiber&#45;&gt;s1</title>
<path fill="none" stroke="#66bb6a" stroke-dasharray="5,2" d="M186.75,-734.95C186.75,-727.03 186.75,-717.37 186.75,-708.29"/>
<polygon fill="#66bb6a" stroke="#66bb6a" points="190.25,-708.05 186.75,-698.05 183.25,-708.05 190.25,-708.05"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View file

@ -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=<<B><FONT COLOR="#cccccc" POINT-SIZE="14">station 1: fiber intake &amp; prep</FONT></B>>
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 &amp; 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]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

View file

@ -0,0 +1,191 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: fiber_intake Pages: 1 -->
<svg width="624pt" height="487pt"
viewBox="0.00 0.00 624.00 486.92" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 482.92)">
<title>fiber_intake</title>
<polygon fill="#1a1a2e" stroke="transparent" points="-4,4 -4,-482.92 620,-482.92 620,4 -4,4"/>
<text text-anchor="start" x="193.5" y="-464.72" font-family="Times,serif" font-weight="bold" font-size="14.00" fill="#cccccc">station 1: fiber intake &amp; prep</text>
<g id="clust1" class="cluster">
<title>cluster_hemp</title>
<polygon fill="#1a1a2e" stroke="#4caf50" stroke-dasharray="5,2" points="8,-225.92 8,-447.92 162,-447.92 162,-225.92 8,-225.92"/>
<text text-anchor="middle" x="85" y="-435.12" font-family="Helvetica Bold" font-size="11.00" fill="#4caf50">HEMP</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_nettle</title>
<polygon fill="#1a1a2e" stroke="#66bb6a" stroke-dasharray="5,2" points="170,-225.92 170,-447.92 324,-447.92 324,-225.92 170,-225.92"/>
<text text-anchor="middle" x="247" y="-435.12" font-family="Helvetica Bold" font-size="11.00" fill="#66bb6a">NETTLE</text>
</g>
<g id="clust3" class="cluster">
<title>cluster_wood</title>
<polygon fill="#1a1a2e" stroke="#8d6e63" stroke-dasharray="5,2" points="332,-225.92 332,-447.92 468,-447.92 468,-225.92 332,-225.92"/>
<text text-anchor="middle" x="400" y="-435.12" font-family="Helvetica Bold" font-size="11.00" fill="#8d6e63">WOOD REFUSE</text>
</g>
<!-- hemp_in -->
<g id="node1" class="node">
<title>hemp_in</title>
<polygon fill="#2e7d32" stroke="black" points="153.5,-419.92 16.5,-419.92 16.5,-383.92 153.5,-383.92 153.5,-419.92"/>
<text text-anchor="middle" x="85" y="-404.92" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">hemp stalks</text>
<text text-anchor="middle" x="85" y="-393.92" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">bast fiber, 77% cellulose</text>
</g>
<!-- hemp_ret -->
<g id="node2" class="node">
<title>hemp_ret</title>
<polygon fill="#388e3c" stroke="black" points="142.5,-341.92 27.5,-341.92 27.5,-305.92 142.5,-305.92 142.5,-341.92"/>
<text text-anchor="middle" x="85" y="-326.92" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">ret 3&#45;45 days</text>
<text text-anchor="middle" x="85" y="-315.92" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">or water ret 10 days</text>
</g>
<!-- hemp_in&#45;&gt;hemp_ret -->
<g id="edge1" class="edge">
<title>hemp_in&#45;&gt;hemp_ret</title>
<path fill="none" stroke="#888888" d="M85,-383.68C85,-374.45 85,-362.86 85,-352.42"/>
<polygon fill="#888888" stroke="#888888" points="88.5,-352.1 85,-342.1 81.5,-352.1 88.5,-352.1"/>
</g>
<!-- hemp_dec -->
<g id="node3" class="node">
<title>hemp_dec</title>
<polygon fill="#43a047" stroke="black" points="153,-269.92 19,-269.92 19,-233.92 153,-233.92 153,-269.92"/>
<text text-anchor="middle" x="86" y="-254.92" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">decorticate</text>
<text text-anchor="middle" x="86" y="-243.92" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">separate bast from hurd</text>
</g>
<!-- hemp_ret&#45;&gt;hemp_dec -->
<g id="edge2" class="edge">
<title>hemp_ret&#45;&gt;hemp_dec</title>
<path fill="none" stroke="#888888" d="M85.25,-305.62C85.36,-297.9 85.49,-288.63 85.61,-280.03"/>
<polygon fill="#888888" stroke="#888888" points="89.11,-280.08 85.76,-270.03 82.11,-279.98 89.11,-280.08"/>
</g>
<!-- chop -->
<g id="node10" class="node">
<title>chop</title>
<polygon fill="#66bb6a" stroke="black" points="303.5,-197.92 190.5,-197.92 190.5,-161.92 303.5,-161.92 303.5,-197.92"/>
<text text-anchor="middle" x="247" y="-182.92" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">chop to 2&#45;3 cm</text>
<text text-anchor="middle" x="247" y="-171.92" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">uniform fiber length</text>
</g>
<!-- hemp_dec&#45;&gt;chop -->
<g id="edge7" class="edge">
<title>hemp_dec&#45;&gt;chop</title>
<path fill="none" stroke="#888888" d="M125.39,-233.8C147.39,-224.23 175.01,-212.22 198.36,-202.07"/>
<polygon fill="#888888" stroke="#888888" points="199.97,-205.19 207.74,-197.99 197.18,-198.77 199.97,-205.19"/>
</g>
<!-- nettle_in -->
<g id="node4" class="node">
<title>nettle_in</title>
<polygon fill="#2e7d32" stroke="black" points="315.5,-419.92 178.5,-419.92 178.5,-383.92 315.5,-383.92 315.5,-419.92"/>
<text text-anchor="middle" x="247" y="-404.92" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">nettle stalks</text>
<text text-anchor="middle" x="247" y="-393.92" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">bast fiber, 65% cellulose</text>
</g>
<!-- nettle_ret -->
<g id="node5" class="node">
<title>nettle_ret</title>
<polygon fill="#388e3c" stroke="black" points="303,-341.92 191,-341.92 191,-305.92 303,-305.92 303,-341.92"/>
<text text-anchor="middle" x="247" y="-326.92" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">water ret 7&#45;14 days</text>
<text text-anchor="middle" x="247" y="-315.92" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">faster than hemp</text>
</g>
<!-- nettle_in&#45;&gt;nettle_ret -->
<g id="edge3" class="edge">
<title>nettle_in&#45;&gt;nettle_ret</title>
<path fill="none" stroke="#888888" d="M247,-383.68C247,-374.45 247,-362.86 247,-352.42"/>
<polygon fill="#888888" stroke="#888888" points="250.5,-352.1 247,-342.1 243.5,-352.1 250.5,-352.1"/>
</g>
<!-- nettle_dec -->
<g id="node6" class="node">
<title>nettle_dec</title>
<polygon fill="#43a047" stroke="black" points="303.5,-269.92 190.5,-269.92 190.5,-233.92 303.5,-233.92 303.5,-269.92"/>
<text text-anchor="middle" x="247" y="-254.92" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">strip bast fiber</text>
<text text-anchor="middle" x="247" y="-243.92" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">by hand or machine</text>
</g>
<!-- nettle_ret&#45;&gt;nettle_dec -->
<g id="edge4" class="edge">
<title>nettle_ret&#45;&gt;nettle_dec</title>
<path fill="none" stroke="#888888" d="M247,-305.62C247,-297.9 247,-288.63 247,-280.03"/>
<polygon fill="#888888" stroke="#888888" points="250.5,-280.03 247,-270.03 243.5,-280.03 250.5,-280.03"/>
</g>
<!-- nettle_dec&#45;&gt;chop -->
<g id="edge8" class="edge">
<title>nettle_dec&#45;&gt;chop</title>
<path fill="none" stroke="#888888" d="M247,-233.62C247,-225.9 247,-216.63 247,-208.03"/>
<polygon fill="#888888" stroke="#888888" points="250.5,-208.03 247,-198.03 243.5,-208.03 250.5,-208.03"/>
</g>
<!-- wood_in -->
<g id="node7" class="node">
<title>wood_in</title>
<polygon fill="#4e342e" stroke="black" points="459.5,-419.92 340.5,-419.92 340.5,-383.92 459.5,-383.92 459.5,-419.92"/>
<text text-anchor="middle" x="400" y="-404.92" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">sawmill offcuts</text>
<text text-anchor="middle" x="400" y="-393.92" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">chips, shavings, dust</text>
</g>
<!-- wood_chip -->
<g id="node8" class="node">
<title>wood_chip</title>
<polygon fill="#5d4037" stroke="black" points="454.5,-341.92 341.5,-341.92 341.5,-305.92 454.5,-305.92 454.5,-341.92"/>
<text text-anchor="middle" x="398" y="-326.92" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">chip to uniform size</text>
<text text-anchor="middle" x="398" y="-315.92" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">2&#45;5 mm pieces</text>
</g>
<!-- wood_in&#45;&gt;wood_chip -->
<g id="edge5" class="edge">
<title>wood_in&#45;&gt;wood_chip</title>
<path fill="none" stroke="#888888" d="M399.55,-383.68C399.3,-374.45 399,-362.86 398.72,-352.42"/>
<polygon fill="#888888" stroke="#888888" points="402.21,-352 398.45,-342.1 395.22,-352.19 402.21,-352"/>
</g>
<!-- wood_sort -->
<g id="node9" class="node">
<title>wood_sort</title>
<polygon fill="#6d4c41" stroke="black" points="453,-269.92 341,-269.92 341,-233.92 453,-233.92 453,-269.92"/>
<text text-anchor="middle" x="397" y="-254.92" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">remove bark, knots</text>
<text text-anchor="middle" x="397" y="-243.92" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">sort by species</text>
</g>
<!-- wood_chip&#45;&gt;wood_sort -->
<g id="edge6" class="edge">
<title>wood_chip&#45;&gt;wood_sort</title>
<path fill="none" stroke="#888888" d="M397.75,-305.62C397.64,-297.9 397.51,-288.63 397.39,-280.03"/>
<polygon fill="#888888" stroke="#888888" points="400.89,-279.98 397.24,-270.03 393.89,-280.08 400.89,-279.98"/>
</g>
<!-- wood_sort&#45;&gt;chop -->
<g id="edge9" class="edge">
<title>wood_sort&#45;&gt;chop</title>
<path fill="none" stroke="#888888" d="M360.31,-233.8C339.98,-224.31 314.53,-212.44 292.9,-202.34"/>
<polygon fill="#888888" stroke="#888888" points="294.12,-199.05 283.57,-197.99 291.16,-205.39 294.12,-199.05"/>
</g>
<!-- weigh -->
<g id="node11" class="node">
<title>weigh</title>
<polygon fill="#81c784" stroke="black" points="313.5,-125.92 180.5,-125.92 180.5,-89.92 313.5,-89.92 313.5,-125.92"/>
<text text-anchor="middle" x="247" y="-110.92" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1a1a2e">weigh &amp; batch</text>
<text text-anchor="middle" x="247" y="-99.92" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1a1a2e">record fiber source ratio</text>
</g>
<!-- chop&#45;&gt;weigh -->
<g id="edge10" class="edge">
<title>chop&#45;&gt;weigh</title>
<path fill="none" stroke="#888888" d="M247,-161.62C247,-153.9 247,-144.63 247,-136.03"/>
<polygon fill="#888888" stroke="#888888" points="250.5,-136.03 247,-126.03 243.5,-136.03 250.5,-136.03"/>
</g>
<!-- prepared -->
<g id="node12" class="node">
<title>prepared</title>
<polygon fill="#a5d6a7" stroke="black" points="333.47,-17.46 333.47,-36.46 282.82,-49.89 211.18,-49.89 160.53,-36.46 160.53,-17.46 211.18,-4.03 282.82,-4.03 333.47,-17.46"/>
<polygon fill="none" stroke="black" points="337.47,-14.39 337.47,-39.53 283.34,-53.88 210.66,-53.88 156.53,-39.53 156.53,-14.39 210.66,-0.04 283.34,-0.04 337.47,-14.39"/>
<text text-anchor="middle" x="247" y="-29.96" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1a1a2e">PREPARED FIBER</text>
<text text-anchor="middle" x="247" y="-18.96" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1a1a2e">ready for extraction</text>
</g>
<!-- weigh&#45;&gt;prepared -->
<g id="edge11" class="edge">
<title>weigh&#45;&gt;prepared</title>
<path fill="none" stroke="#888888" d="M247,-89.79C247,-82.29 247,-73.19 247,-64.3"/>
<polygon fill="#888888" stroke="#888888" points="250.5,-64.07 247,-54.07 243.5,-64.07 250.5,-64.07"/>
</g>
<!-- equip -->
<g id="node13" class="node">
<title>equip</title>
<polygon fill="#263238" stroke="black" points="610,-425.92 478,-425.92 478,-377.92 616,-377.92 616,-419.92 610,-425.92"/>
<polyline fill="none" stroke="black" points="610,-425.92 610,-419.92 "/>
<polyline fill="none" stroke="black" points="616,-419.92 610,-419.92 "/>
<text text-anchor="middle" x="547" y="-414.72" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">equipment:</text>
<text text-anchor="middle" x="547" y="-404.72" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">decorticator, chopper</text>
<text text-anchor="middle" x="547" y="-394.72" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">retting tanks, sorting table</text>
<text text-anchor="middle" x="547" y="-384.72" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">scale</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -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=<<B><FONT COLOR="#cccccc" POINT-SIZE="14">station 5: pressing &amp; mold rotation</FONT></B>>
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 &amp; 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]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

View file

@ -0,0 +1,141 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: pressing_station Pages: 1 -->
<svg width="1058pt" height="347pt"
viewBox="0.00 0.00 1057.63 347.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 343)">
<title>pressing_station</title>
<polygon fill="#1a1a2e" stroke="transparent" points="-4,4 -4,-343 1053.63,-343 1053.63,4 -4,4"/>
<text text-anchor="start" x="386.31" y="-324.8" font-family="Times,serif" font-weight="bold" font-size="14.00" fill="#cccccc">station 5: pressing &amp; mold rotation</text>
<g id="clust1" class="cluster">
<title>cluster_rotation</title>
<polygon fill="#1a1a2e" stroke="#ff9800" stroke-dasharray="5,2" points="152,-8 152,-106 832,-106 832,-8 152,-8"/>
<text text-anchor="middle" x="492" y="-93.2" font-family="Helvetica Bold" font-size="11.00" fill="#ff9800">MOLD ROTATION CYCLE</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_molds</title>
<polygon fill="#1a1a2e" stroke="#555555" stroke-dasharray="5,2" points="8,-80 8,-260 127,-260 127,-80 8,-80"/>
<text text-anchor="middle" x="67.5" y="-247.2" font-family="Helvetica Bold" font-size="11.00" fill="#aaaaaa">PRODUCT MOLDS</text>
</g>
<!-- compound -->
<g id="node1" class="node">
<title>compound</title>
<polygon fill="#7b1fa2" stroke="black" points="123,-70 12,-70 12,-34 123,-34 123,-70"/>
<text text-anchor="middle" x="67.5" y="-55" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">MIXED COMPOUND</text>
<text text-anchor="middle" x="67.5" y="-44" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">from Station 4</text>
</g>
<!-- load -->
<g id="node2" class="node">
<title>load</title>
<polygon fill="#e65100" stroke="black" points="294,-72.5 160,-72.5 160,-31.5 294,-31.5 294,-72.5"/>
<text text-anchor="middle" x="227" y="-60.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">LOAD</text>
<text text-anchor="middle" x="227" y="-49.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">fill mold with compound</text>
<text text-anchor="middle" x="227" y="-38.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">compress, add lid</text>
</g>
<!-- compound&#45;&gt;load -->
<g id="edge5" class="edge">
<title>compound&#45;&gt;load</title>
<path fill="none" stroke="#888888" d="M123.14,-52C131.73,-52 140.74,-52 149.7,-52"/>
<polygon fill="#888888" stroke="#888888" points="149.78,-55.5 159.78,-52 149.78,-48.5 149.78,-55.5"/>
</g>
<!-- cure -->
<g id="node3" class="node">
<title>cure</title>
<polygon fill="#ff6f00" stroke="black" points="473,-57.5 331,-57.5 331,-16.5 473,-16.5 473,-57.5"/>
<text text-anchor="middle" x="402" y="-45.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">CURE</text>
<text text-anchor="middle" x="402" y="-34.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">hot press 150&#45;240C</text>
<text text-anchor="middle" x="402" y="-23.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">10&#45;30 min under pressure</text>
</g>
<!-- load&#45;&gt;cure -->
<g id="edge1" class="edge">
<title>load&#45;&gt;cure</title>
<path fill="none" stroke="#888888" d="M294.39,-46.24C302.95,-45.5 311.79,-44.73 320.55,-43.98"/>
<polygon fill="#888888" stroke="#888888" points="321.11,-47.44 330.77,-43.09 320.5,-40.47 321.11,-47.44"/>
</g>
<!-- cool -->
<g id="node4" class="node">
<title>cool</title>
<polygon fill="#ff9800" stroke="black" points="670,-57.5 568,-57.5 568,-16.5 670,-16.5 670,-57.5"/>
<text text-anchor="middle" x="619" y="-45.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">COOL</text>
<text text-anchor="middle" x="619" y="-34.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">slow cool in mold</text>
<text text-anchor="middle" x="619" y="-23.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">prevent cracking</text>
</g>
<!-- cure&#45;&gt;cool -->
<g id="edge2" class="edge">
<title>cure&#45;&gt;cool</title>
<path fill="none" stroke="#888888" d="M473.1,-37C500.36,-37 531.29,-37 557.55,-37"/>
<polygon fill="#888888" stroke="#888888" points="557.74,-40.5 567.74,-37 557.74,-33.5 557.74,-40.5"/>
</g>
<!-- demold -->
<g id="node5" class="node">
<title>demold</title>
<polygon fill="#ffc107" stroke="black" points="824,-67.5 707,-67.5 707,-26.5 824,-26.5 824,-67.5"/>
<text text-anchor="middle" x="765.5" y="-55.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1a1a2e">DEMOLD</text>
<text text-anchor="middle" x="765.5" y="-44.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1a1a2e">release product</text>
<text text-anchor="middle" x="765.5" y="-33.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1a1a2e">clean mold for reuse</text>
</g>
<!-- cool&#45;&gt;demold -->
<g id="edge3" class="edge">
<title>cool&#45;&gt;demold</title>
<path fill="none" stroke="#888888" d="M670.13,-40.47C678.72,-41.06 687.77,-41.69 696.73,-42.31"/>
<polygon fill="#888888" stroke="#888888" points="696.55,-45.81 706.77,-43 697.04,-38.82 696.55,-45.81"/>
</g>
<!-- demold&#45;&gt;load -->
<g id="edge4" class="edge">
<title>demold&#45;&gt;load</title>
<path fill="none" stroke="#ffc107" stroke-dasharray="5,2" d="M706.8,-60.49C694.71,-62.78 681.99,-64.81 670,-66 520.07,-80.92 481.32,-76.17 331,-66 322.3,-65.41 313.22,-64.55 304.2,-63.53"/>
<polygon fill="#ffc107" stroke="#ffc107" points="304.42,-60.03 294.08,-62.33 303.59,-66.98 304.42,-60.03"/>
<text text-anchor="middle" x="520.5" y="-87.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">mold returns</text>
<text text-anchor="middle" x="520.5" y="-77.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">to loading</text>
</g>
<!-- products -->
<g id="node6" class="node">
<title>products</title>
<polygon fill="#ffc107" stroke="black" points="1045.45,-37.5 1045.45,-56.5 992.65,-69.93 917.98,-69.93 865.18,-56.5 865.18,-37.5 917.98,-24.07 992.65,-24.07 1045.45,-37.5"/>
<polygon fill="none" stroke="black" points="1049.44,-34.4 1049.44,-59.6 993.15,-73.92 917.48,-73.92 861.19,-59.6 861.19,-34.4 917.48,-20.08 993.15,-20.08 1049.44,-34.4"/>
<text text-anchor="middle" x="955.31" y="-50" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1a1a2e">PRESSED PRODUCTS</text>
<text text-anchor="middle" x="955.31" y="-39" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1a1a2e">to Station 6</text>
</g>
<!-- demold&#45;&gt;products -->
<g id="edge6" class="edge">
<title>demold&#45;&gt;products</title>
<path fill="none" stroke="#888888" d="M824.13,-47C832.76,-47 841.87,-47 851.11,-47"/>
<polygon fill="#888888" stroke="#888888" points="851.16,-50.5 861.16,-47 851.16,-43.5 851.16,-50.5"/>
</g>
<!-- bowls -->
<g id="node7" class="node">
<title>bowls</title>
<polygon fill="#e65100" stroke="black" points="119,-232 16,-232 16,-196 119,-196 119,-232"/>
<text text-anchor="middle" x="67.5" y="-217" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">bowls &amp; plates</text>
<text text-anchor="middle" x="67.5" y="-206" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">150&#45;180C, 20 min</text>
</g>
<!-- pots -->
<g id="node8" class="node">
<title>pots</title>
<polygon fill="#f57c00" stroke="black" points="119,-178 16,-178 16,-142 119,-142 119,-178"/>
<text text-anchor="middle" x="67.5" y="-163" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">garden pots</text>
<text text-anchor="middle" x="67.5" y="-152" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">160&#45;200C, 25 min</text>
</g>
<!-- boxes -->
<g id="node9" class="node">
<title>boxes</title>
<polygon fill="#ff9800" stroke="black" points="119,-124 16,-124 16,-88 119,-88 119,-124"/>
<text text-anchor="middle" x="67.5" y="-109" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">storage boxes</text>
<text text-anchor="middle" x="67.5" y="-98" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">180&#45;240C, 30 min</text>
</g>
<!-- note -->
<g id="node10" class="node">
<title>note</title>
<polygon fill="#263238" stroke="black" points="116.5,-316 12.5,-316 12.5,-268 122.5,-268 122.5,-310 116.5,-316"/>
<polyline fill="none" stroke="black" points="116.5,-316 116.5,-310 "/>
<polyline fill="none" stroke="black" points="122.5,-310 116.5,-310 "/>
<text text-anchor="middle" x="67.5" y="-304.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">multiple mold sets</text>
<text text-anchor="middle" x="67.5" y="-294.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">rotate through cycle</text>
<text text-anchor="middle" x="67.5" y="-284.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">4&#45;6 presses per day</text>
<text text-anchor="middle" x="67.5" y="-274.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">per mold</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.9 KiB

View file

@ -0,0 +1,43 @@
digraph product_catalog {
bgcolor="#1a1a2e"
rankdir=TB
node [fontname="Helvetica" fontsize=10 style=filled shape=box]
edge [style=invis]
label=<<B><FONT COLOR="#cccccc" POINT-SIZE="14">product catalog: three categories</FONT></B>>
labelloc=t
subgraph cluster_kitchen {
label="KITCHEN &amp; 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 &amp; 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 &amp; 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]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

View file

@ -0,0 +1,129 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: product_catalog Pages: 1 -->
<svg width="752pt" height="359pt"
viewBox="0.00 0.00 752.00 358.50" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 354.5)">
<title>product_catalog</title>
<polygon fill="#1a1a2e" stroke="transparent" points="-4,4 -4,-354.5 748,-354.5 748,4 -4,4"/>
<text text-anchor="start" x="241" y="-336.3" font-family="Times,serif" font-weight="bold" font-size="14.00" fill="#cccccc">product catalog: three categories</text>
<g id="clust1" class="cluster">
<title>cluster_kitchen</title>
<polygon fill="#1a1a2e" stroke="#ff9800" stroke-dasharray="5,2" points="8,-8 8,-319.5 128,-319.5 128,-8 8,-8"/>
<text text-anchor="middle" x="68" y="-306.7" font-family="Helvetica Bold" font-size="11.00" fill="#ff9800">KITCHEN &amp; DINING</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_garden</title>
<polygon fill="#1a1a2e" stroke="#4caf50" stroke-dasharray="5,2" points="136,-85 136,-319.5 270,-319.5 270,-85 136,-85"/>
<text text-anchor="middle" x="203" y="-306.7" font-family="Helvetica Bold" font-size="11.00" fill="#4caf50">GARDEN &amp; GROWING</text>
</g>
<g id="clust3" class="cluster">
<title>cluster_storage</title>
<polygon fill="#1a1a2e" stroke="#8e24aa" stroke-dasharray="5,2" points="278,-162 278,-319.5 446,-319.5 446,-162 278,-162"/>
<text text-anchor="middle" x="362" y="-306.7" font-family="Helvetica Bold" font-size="11.00" fill="#8e24aa">STORAGE &amp; ORGANIZATION</text>
</g>
<!-- bowls -->
<g id="node1" class="node">
<title>bowls</title>
<polygon fill="#e65100" stroke="black" points="108,-291.5 28,-291.5 28,-250.5 108,-250.5 108,-291.5"/>
<text text-anchor="middle" x="68" y="-279.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">bowls</text>
<text text-anchor="middle" x="68" y="-268.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">15 cm, 80g</text>
<text text-anchor="middle" x="68" y="-257.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">20% glycerol</text>
</g>
<!-- plates -->
<g id="node2" class="node">
<title>plates</title>
<polygon fill="#f57c00" stroke="black" points="108,-211 28,-211 28,-170 108,-170 108,-211"/>
<text text-anchor="middle" x="68" y="-199" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">plates</text>
<text text-anchor="middle" x="68" y="-188" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">22 cm, 120g</text>
<text text-anchor="middle" x="68" y="-177" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">15% glycerol</text>
</g>
<!-- bowls&#45;&gt;plates -->
<!-- cups -->
<g id="node3" class="node">
<title>cups</title>
<polygon fill="#ff9800" stroke="black" points="108,-134 28,-134 28,-93 108,-93 108,-134"/>
<text text-anchor="middle" x="68" y="-122" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">cups</text>
<text text-anchor="middle" x="68" y="-111" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">250 mL, 60g</text>
<text text-anchor="middle" x="68" y="-100" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">20% glycerol</text>
</g>
<!-- plates&#45;&gt;cups -->
<!-- trivets -->
<g id="node4" class="node">
<title>trivets</title>
<polygon fill="#ffa726" stroke="black" points="108,-57 28,-57 28,-16 108,-16 108,-57"/>
<text text-anchor="middle" x="68" y="-45" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">trivets</text>
<text text-anchor="middle" x="68" y="-34" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">18 cm, 150g</text>
<text text-anchor="middle" x="68" y="-23" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">15% glycerol</text>
</g>
<!-- cups&#45;&gt;trivets -->
<!-- pots -->
<g id="node5" class="node">
<title>pots</title>
<polygon fill="#2e7d32" stroke="black" points="246,-291.5 160,-291.5 160,-250.5 246,-250.5 246,-291.5"/>
<text text-anchor="middle" x="203" y="-279.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">plant pots</text>
<text text-anchor="middle" x="203" y="-268.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">10&#45;15 cm, 90g</text>
<text text-anchor="middle" x="203" y="-257.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">15% glycerol</text>
</g>
<!-- trays -->
<g id="node6" class="node">
<title>trays</title>
<polygon fill="#388e3c" stroke="black" points="250.5,-211 155.5,-211 155.5,-170 250.5,-170 250.5,-211"/>
<text text-anchor="middle" x="203" y="-199" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">seed trays</text>
<text text-anchor="middle" x="203" y="-188" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">30x20 cm, 200g</text>
<text text-anchor="middle" x="203" y="-177" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">15% glycerol</text>
</g>
<!-- pots&#45;&gt;trays -->
<!-- labels -->
<g id="node7" class="node">
<title>labels</title>
<polygon fill="#43a047" stroke="black" points="244.5,-134 161.5,-134 161.5,-93 244.5,-93 244.5,-134"/>
<text text-anchor="middle" x="203" y="-122" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">plant labels</text>
<text text-anchor="middle" x="203" y="-111" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">12x3 cm, 10g</text>
<text text-anchor="middle" x="203" y="-100" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">15% glycerol</text>
</g>
<!-- trays&#45;&gt;labels -->
<!-- lidbox -->
<g id="node8" class="node">
<title>lidbox</title>
<polygon fill="#6a1b9a" stroke="black" points="414.5,-291.5 307.5,-291.5 307.5,-250.5 414.5,-250.5 414.5,-291.5"/>
<text text-anchor="middle" x="361" y="-279.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">lidded boxes</text>
<text text-anchor="middle" x="361" y="-268.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">15x15x8 cm, 180g</text>
<text text-anchor="middle" x="361" y="-257.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">20% glycerol</text>
</g>
<!-- organizer -->
<g id="node9" class="node">
<title>organizer</title>
<polygon fill="#7b1fa2" stroke="black" points="414.5,-211 307.5,-211 307.5,-170 414.5,-170 414.5,-211"/>
<text text-anchor="middle" x="361" y="-199" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">desk organizers</text>
<text text-anchor="middle" x="361" y="-188" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">25x10x8 cm, 160g</text>
<text text-anchor="middle" x="361" y="-177" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">15% glycerol</text>
</g>
<!-- lidbox&#45;&gt;organizer -->
<!-- lifespan -->
<g id="node10" class="node">
<title>lifespan</title>
<polygon fill="#263238" stroke="black" points="587.5,-295 454.5,-295 454.5,-247 593.5,-247 593.5,-289 587.5,-295"/>
<polyline fill="none" stroke="black" points="587.5,-295 587.5,-289 "/>
<polyline fill="none" stroke="black" points="593.5,-289 587.5,-289 "/>
<text text-anchor="middle" x="524" y="-283.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">all products:</text>
<text text-anchor="middle" x="524" y="-273.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">3&#45;5 years daily use</text>
<text text-anchor="middle" x="524" y="-263.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">biodegrade in hot compost</text>
<text text-anchor="middle" x="524" y="-253.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">60&#45;70C, 12&#45;24 weeks</text>
</g>
<!-- care -->
<g id="node11" class="node">
<title>care</title>
<polygon fill="#263238" stroke="black" points="738,-295 612,-295 612,-247 744,-247 744,-289 738,-295"/>
<polyline fill="none" stroke="black" points="738,-295 738,-289 "/>
<polyline fill="none" stroke="black" points="744,-289 738,-289 "/>
<text text-anchor="middle" x="678" y="-283.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">care: hand wash</text>
<text text-anchor="middle" x="678" y="-273.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">do NOT dishwasher &gt;60C</text>
<text text-anchor="middle" x="678" y="-263.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">do NOT microwave</text>
<text text-anchor="middle" x="678" y="-253.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">do NOT soak overnight</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.5 KiB

View file

@ -0,0 +1,554 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>bioplastic factory &#8212; unturf.</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#5871ad">
<meta charset="utf-8">
<link rel="stylesheet" href="/css/chunkfive/stylesheet.css" type="text/css" charset="utf-8" />
<link rel="stylesheet" href="/css/pico.classless.min.css">
<link rel="stylesheet" href="/css/unturf.css">
</head>
<body>
<main class="content-wide">
<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="/let-us-define-a-permacomputer/">manifesto</a> · <a href="/eight-forms-of-capital/">eight forms of capital</a> · <a href="/single-use-plastics/">single-use plastics</a> · <a href="/hemp-bioplastic/">hemp bioplastic</a> · <a href="/hemp-bioplastic/process/">recipe</a> · <a href="/hemp-bioplastic/process/homeschool/">homeschool</a> · <a href="/hemp-bioplastic/process/factory/" aria-current="page">factory</a> · <a href="/software/">free software</a></small></center>
<h2>Bioplastic Factory</h2>
<p>
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, &amp; wood refuse. Designed for replication as distributed hubs worldwide.
</p>
<p>
This page describes a complete 7-station production line. <a href="/hemp-bioplastic/process/">Batch recipes live on a process page</a>. <a href="/hemp-bioplastic/process/homeschool/">A 4-day homeschool curriculum lives on a homeschool page</a>. This factory page covers continuous production at community scale.
</p>
<!-- ============================================================ -->
<!-- STATION OVERVIEW -->
<!-- ============================================================ -->
<span class="step-label">OVERVIEW</span>
<h3>7-Station Flow</h3>
<figure class="diagram">
<img src="img/factory-flow.svg" alt="7-station continuous-flow bioplastic factory overview">
<figcaption>fiber enters at station 1, finished products leave at station 6, compost demo runs at station 7.</figcaption>
</figure>
<table>
<thead>
<tr><th>Station</th><th>Name</th><th>Input</th><th>Output</th><th>Equipment</th><th>Cycle Time</th></tr>
</thead>
<tbody>
<tr><td>1</td><td>Fiber Intake &amp; Prep</td><td>Raw stalks &amp; wood refuse</td><td>Prepared fiber (chopped, sorted)</td><td>Decorticator, chopper, retting tanks, scale</td><td>Continuous intake</td></tr>
<tr><td>2</td><td>Extraction</td><td>Prepared fiber</td><td>Raw cellulose</td><td>Reaction vessels (3-4), filtration, pH meter</td><td>2-4 hours per vessel</td></tr>
<tr><td>3</td><td>Washing &amp; Drying</td><td>Raw cellulose</td><td>Dry cellulose</td><td>Counter-current wash line, convection dryer</td><td>4-8 hours</td></tr>
<tr><td>4</td><td>Mixing</td><td>Dry cellulose</td><td>Mixed compound</td><td>Heated mixer, scale, pigment dispensers</td><td>60-90 minutes</td></tr>
<tr><td>5</td><td>Pressing &amp; Molding</td><td>Mixed compound</td><td>Pressed products</td><td>Hot press, mold sets, temperature controller</td><td>30-60 min per press</td></tr>
<tr><td>6</td><td>Finishing</td><td>Pressed products</td><td>Finished goods</td><td>Trim station, inspection table, stamp press</td><td>5-10 min per product</td></tr>
<tr><td>7</td><td>Compost Demo</td><td>Demo samples</td><td>Display &amp; education</td><td>Hot compost bin (60-70C), timeline display</td><td>Ongoing display</td></tr>
</tbody>
</table>
<!-- ============================================================ -->
<!-- STATION 1: FIBER INTAKE -->
<!-- ============================================================ -->
<span class="step-label">STATION 1</span>
<h3>Fiber Intake &amp; Prep</h3>
<p>
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 &amp; weighing.
</p>
<figure class="diagram">
<img src="img/fiber-intake.svg" alt="Three fiber sources converging: hemp, nettle, wood refuse">
<figcaption>hemp, nettle, &amp; wood refuse follow parallel prep paths before merging.</figcaption>
</figure>
<h4>Hemp (primary source)</h4>
<ul>
<li>Bast fiber from stalks, 77% cellulose content</li>
<li>Ret 3-45 days (depending on temperature) or water ret 10 days</li>
<li>Decorticate: separate bast from hurd using decorticator or by hand</li>
</ul>
<h4>Nettle (secondary source)</h4>
<ul>
<li>Bast fiber from stalks, ~65% cellulose content<sup id="ref1"><a href="#fn1">[1]</a></sup></li>
<li>Water ret 7-14 days, faster breakdown than hemp</li>
<li>Strip bast fiber by hand or small decorticator</li>
<li>Grows wild on marginal land, requires no cultivation</li>
</ul>
<h4>Wood Refuse (supplementary source)</h4>
<ul>
<li>Sawmill offcuts, chips, shavings from local timber operations</li>
<li>Chip to uniform 2-5 mm pieces</li>
<li>Sort: remove bark, knots, &amp; resinous species (pine, cedar)</li>
<li>Hardwoods preferred: beech, birch, poplar offer 40-50% cellulose<sup id="ref2"><a href="#fn2">[2]</a></sup></li>
</ul>
<h4>Convergence</h4>
<ol>
<li>Chop all prepared fiber to uniform 2-3 cm lengths</li>
<li>Weigh &amp; record source ratio per batch (enables quality tracking)</li>
<li>Output: prepared fiber, ready for extraction</li>
</ol>
<div class="recipe-box">
<b>Equipment list:</b> 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.
</div>
<!-- ============================================================ -->
<!-- STATION 2: EXTRACTION -->
<!-- ============================================================ -->
<span class="step-label">STATION 2</span>
<h3>Extraction</h3>
<p>
Two extraction paths run as factory alternatives. A hub selects one path based on local chemistry comfort, waste handling capacity, &amp; product goals. Both paths accept the same prepared fiber from Station 1 &amp; output raw cellulose to Station 3.
</p>
<figure class="diagram">
<img src="img/extraction-station.svg" alt="NaOH extraction path versus citric acid crosslinking path">
<figcaption>each hub chooses one path. both produce usable cellulose for pressing.</figcaption>
</figure>
<h4>Path A: NaOH Extraction</h4>
<div class="recipe-box">
<b>Process:</b><br>
1. Dissolve NaOH in water (5-12% solution depending on fiber source)<br>
2. Add prepared fiber. Heat to 80C with stirring for 2-3 hours (or soak at room temperature for 4 hours using 5% NaOH)<sup id="ref3"><a href="#fn3">[3]</a></sup><br>
3. Filter. Wash 4-6 times until pH neutral<br>
4. Output: purified cellulose (removes lignin, hemicellulose, pectin)<br><br>
<b>Continuous operation:</b> rotate 3-4 reaction vessels through stages. While vessel A soaks, vessel B gets filtered, vessel C gets loaded. No downtime.
</div>
<h4>Path B: Citric Acid Crosslinking</h4>
<div class="recipe-box">
<b>Process:</b><br>
1. Spread prepared fiber onto screens, press into sheets<br>
2. Soak sheets in citric acid + glycerol solution<br>
3. Cure at 140C under pressure<sup id="ref4"><a href="#fn4">[4]</a></sup><br>
4. Output: crosslinked cellulose material (up to 70 MPa tensile strength)<br><br>
<b>Continuous operation:</b> stagger sheet production. While batch A cures, batch B soaks, batch C gets pressed into sheets.
</div>
<div class="honest-box">
<b>Honest comparison:</b> citric acid path produces less chemical waste, avoids NaOH safety hazards, &amp; requires simpler equipment. NaOH path achieves purer cellulose isolation &amp; works better with mixed or lower-quality fiber sources. Neither path stays universally superior.
</div>
<!-- ============================================================ -->
<!-- STATION 3: WASHING & DRYING -->
<!-- ============================================================ -->
<span class="step-label">STATION 3</span>
<h3>Washing &amp; Drying</h3>
<p>
Buffer station between extraction &amp; pressing. Removes residual chemicals, reduces moisture to pressing readiness.
</p>
<h4>Counter-Current Washing</h4>
<p>
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.<sup id="ref5"><a href="#fn5">[5]</a></sup>
</p>
<div class="recipe-box">
<b>Wash stages:</b><br>
1. First rinse (receives used water from stage 2, removes bulk chemicals)<br>
2. Second rinse (receives used water from stage 3)<br>
3. Third rinse (receives used water from stage 4)<br>
4. Final rinse (receives fresh water only, output at pH 7)<br><br>
<b>pH check:</b> test wash water after each stage. Final output must read pH 7 (neutral). Residual NaOH weakens finished products.
</div>
<h4>Drying</h4>
<ul>
<li><b>Convection dryer:</b> forced hot air at 60-80C, 4-6 hours to bone dry</li>
<li><b>Solar tunnel (warm climates):</b> passive solar heat, 8-12 hours, zero energy cost</li>
<li><b>Critical check:</b> weigh before &amp; after drying. Weight must stabilize. Wet cellulose produces spongy, voided products when pressed.<sup id="ref6"><a href="#fn6">[6]</a></sup></li>
</ul>
<div class="warning-box">
<b>Moisture kills quality.</b> 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.
</div>
<!-- ============================================================ -->
<!-- STATION 4: MIXING -->
<!-- ============================================================ -->
<span class="step-label">STATION 4</span>
<h3>Mixing</h3>
<p>
Dried cellulose gets combined with glycerol (plasticizer), optional citric acid (water resistance), &amp; optional natural pigments. Glycerol ratio determines product flexibility.
</p>
<h4>Glycerol Ratios</h4>
<table>
<thead>
<tr><th>Glycerol %</th><th>Result</th><th>Products</th></tr>
</thead>
<tbody>
<tr><td>15%</td><td>Rigid</td><td>Plates, trivets, plant labels, seed trays</td></tr>
<tr><td>20%</td><td>Semi-flexible</td><td>Bowls, cups, plant pots, lidded boxes</td></tr>
<tr><td>30%</td><td>Flexible</td><td>Lids, gaskets, protective wraps</td></tr>
</tbody>
</table>
<h4>Optional Additives</h4>
<ul>
<li><b>Citric acid (5% by weight):</b> improves water resistance 7-fold<sup id="ref4b"><a href="#fn4">[4]</a></sup></li>
<li><b>Natural pigments:</b> turmeric (yellow), spirulina (green), charcoal (black), beetroot powder (red)</li>
</ul>
<div class="recipe-box">
<b>Mixing process:</b><br>
1. Weigh dried cellulose<br>
2. Calculate glycerol by target ratio (e.g., 100g cellulose + 20g glycerol for 20% semi-flex)<br>
3. Add water to form a workable slurry<br>
4. Heat to 80C &amp; stir for 60 minutes until homogeneous<sup id="ref7"><a href="#fn7">[7]</a></sup><br>
5. Add citric acid &amp; pigments during last 10 minutes<br>
6. Spread on trays, dry at 60C until weight stabilizes<br>
7. Grind to breadcrumb consistency<br>
8. Output: mixed compound, ready for pressing
</div>
<!-- ============================================================ -->
<!-- STATION 5: PRESSING & MOLDING -->
<!-- ============================================================ -->
<span class="step-label">STATION 5</span>
<h3>Pressing &amp; Molding</h3>
<p>
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.
</p>
<figure class="diagram">
<img src="img/pressing-station.svg" alt="Mold rotation cycle: load, cure, cool, demold">
<figcaption>mold rotation enables 4-6 press cycles per day per mold set.</figcaption>
</figure>
<h4>Product Mold Catalog</h4>
<table>
<thead>
<tr><th>Product</th><th>Mold Type</th><th>Temp (C)</th><th>Pressure</th><th>Time</th><th>Weight</th></tr>
</thead>
<tbody>
<tr><td>Bowl (15 cm)</td><td>Two-part concave</td><td>160</td><td>Medium</td><td>20 min</td><td>80g</td></tr>
<tr><td>Plate (22 cm)</td><td>Flat with rim</td><td>150</td><td>High</td><td>15 min</td><td>120g</td></tr>
<tr><td>Cup (250 mL)</td><td>Two-part cylinder</td><td>170</td><td>Medium</td><td>20 min</td><td>60g</td></tr>
<tr><td>Trivet (18 cm)</td><td>Flat solid</td><td>180</td><td>High</td><td>25 min</td><td>150g</td></tr>
<tr><td>Plant pot (12 cm)</td><td>Two-part tapered</td><td>160</td><td>Medium</td><td>20 min</td><td>90g</td></tr>
<tr><td>Seed tray (30x20 cm)</td><td>Multi-cavity</td><td>170</td><td>High</td><td>25 min</td><td>200g</td></tr>
<tr><td>Lidded box (15 cm)</td><td>Three-part (base+lid+walls)</td><td>180</td><td>High</td><td>30 min</td><td>180g</td></tr>
<tr><td>Desk organizer</td><td>Multi-compartment</td><td>180</td><td>High</td><td>30 min</td><td>160g</td></tr>
</tbody>
</table>
<div class="recipe-box">
<b>Press cycle:</b><br>
1. Coat mold interior with thin vegetable oil layer<br>
2. Fill with dry compound, compress lightly by hand, add lid<br>
3. Load into hot press at target temperature<br>
4. Apply full pressure &amp; hold for target time<br>
5. Release pressure<br>
6. Remove mold, set on cooling rack<br>
7. Slow cool (minimum 30 minutes, longer for thick products)<br>
8. Demold when cool to touch<br>
9. Clean mold &amp; return to loading station
</div>
<!-- ============================================================ -->
<!-- STATION 6: FINISHING -->
<!-- ============================================================ -->
<span class="step-label">STATION 6</span>
<h3>Finishing</h3>
<p>
Final quality gate before products leave the factory. Three substations run in sequence.
</p>
<h4>Trimming</h4>
<ul>
<li>Remove flash (excess material squeezed from mold edges)</li>
<li>Sand any rough surfaces or mold lines</li>
<li>File edges smooth</li>
</ul>
<h4>Inspection</h4>
<table>
<thead>
<tr><th>Check</th><th>Pass</th><th>Fail (regrind)</th></tr>
</thead>
<tbody>
<tr><td>Surface</td><td>Smooth, uniform color</td><td>Bubbled, porous, discolored</td></tr>
<tr><td>Sound (tap test)</td><td>Solid "click"</td><td>Hollow "thud" (internal voids)</td></tr>
<tr><td>Flex</td><td>Appropriate for glycerol ratio</td><td>Brittle cracks or too soft</td></tr>
<tr><td>Weight</td><td>Within 10% of target</td><td>Under (voids) or over (wet)</td></tr>
<tr><td>Water drop</td><td>Beads or absorbs slowly</td><td>Absorbs instantly (needs more citric acid)</td></tr>
</tbody>
</table>
<p>
Failed products get reground &amp; returned to Station 4 for remixing. Nothing gets wasted.
</p>
<h4>Stamping</h4>
<ul>
<li>Production date (month/year)</li>
<li>Fiber source (H = hemp, N = nettle, W = wood, or combo)</li>
<li>Compost instructions: "HOT COMPOST 60C+ ONLY"</li>
<li>Hub identifier code</li>
</ul>
<!-- ============================================================ -->
<!-- STATION 7: COMPOST DEMO -->
<!-- ============================================================ -->
<span class="step-label">STATION 7</span>
<h3>Compost Demo Station</h3>
<p>
Display, not production. Shows customers &amp; 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.
</p>
<div class="honest-box">
<b>Composting requires specific conditions.</b> 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 &amp; it vanishes."
</div>
<h4>Decomposition Timeline (Hot Aerobic Compost, 60-70C)</h4>
<table>
<thead>
<tr><th>Week</th><th>Observation</th></tr>
</thead>
<tbody>
<tr><td>0-2</td><td>No visible change. Product retains shape &amp; strength.</td></tr>
<tr><td>2-4</td><td>Surface softening begins. Color shifts darker.</td></tr>
<tr><td>4-8</td><td>Product deforms under compost weight. Surface texture becomes rough.</td></tr>
<tr><td>8-12</td><td>Fragmentation begins. Product breaks into large pieces when handled.</td></tr>
<tr><td>12-16</td><td>Pieces fragment further. Material becomes indistinguishable from surrounding compost.</td></tr>
<tr><td>16-24</td><td>Full decomposition. Only cellulose fibers remain, fully integrated into compost.</td></tr>
</tbody>
</table>
<div class="warning-box">
<b>NOT cold pile. NOT landfill. NOT water.</b> 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.
</div>
<!-- ============================================================ -->
<!-- PRODUCT CATALOG -->
<!-- ============================================================ -->
<span class="step-label">PRODUCTS</span>
<h3>Product Catalog</h3>
<figure class="diagram">
<img src="img/product-catalog.svg" alt="Three product categories: kitchen, garden, storage">
<figcaption>all products share the same base material. glycerol ratio &amp; mold shape create variety.</figcaption>
</figure>
<h4>Kitchen &amp; Dining</h4>
<table>
<thead>
<tr><th>Product</th><th>Dimensions</th><th>Weight</th><th>Glycerol</th><th>Lifespan</th><th>Care</th></tr>
</thead>
<tbody>
<tr><td>Bowl</td><td>15 cm diameter, 7 cm deep</td><td>80g</td><td>20%</td><td>3-5 years</td><td>Hand wash, dry promptly</td></tr>
<tr><td>Plate</td><td>22 cm diameter</td><td>120g</td><td>15%</td><td>3-5 years</td><td>Hand wash, dry promptly</td></tr>
<tr><td>Cup</td><td>250 mL, 9 cm tall</td><td>60g</td><td>20%</td><td>2-3 years</td><td>Hand wash, no hot liquids above 80C</td></tr>
<tr><td>Trivet</td><td>18 cm diameter, 1 cm thick</td><td>150g</td><td>15%</td><td>5+ years</td><td>Wipe clean</td></tr>
</tbody>
</table>
<h4>Garden &amp; Growing</h4>
<table>
<thead>
<tr><th>Product</th><th>Dimensions</th><th>Weight</th><th>Glycerol</th><th>Lifespan</th><th>Care</th></tr>
</thead>
<tbody>
<tr><td>Plant pot</td><td>10-15 cm diameter</td><td>90g</td><td>15%</td><td>2-3 seasons outdoors</td><td>None needed (degrades slowly in soil contact)</td></tr>
<tr><td>Seed tray</td><td>30x20 cm, 6 cells</td><td>200g</td><td>15%</td><td>3-5 seasons</td><td>Rinse between uses, dry before storing</td></tr>
<tr><td>Plant label</td><td>12x3 cm</td><td>10g</td><td>15%</td><td>1-2 seasons</td><td>Write with pencil (survives weathering)</td></tr>
</tbody>
</table>
<h4>Storage &amp; Organization</h4>
<table>
<thead>
<tr><th>Product</th><th>Dimensions</th><th>Weight</th><th>Glycerol</th><th>Lifespan</th><th>Care</th></tr>
</thead>
<tbody>
<tr><td>Lidded box</td><td>15x15x8 cm</td><td>180g</td><td>20%</td><td>5+ years</td><td>Wipe clean, keep dry</td></tr>
<tr><td>Desk organizer</td><td>25x10x8 cm</td><td>160g</td><td>15%</td><td>5+ years</td><td>Wipe clean</td></tr>
</tbody>
</table>
<div class="warning-box">
<b>Dishwasher temperatures above 60C soften products.</b> 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.
</div>
<!-- ============================================================ -->
<!-- FACTORY ECONOMICS -->
<!-- ============================================================ -->
<span class="step-label">ECONOMICS</span>
<h3>Factory Economics</h3>
<h4>Throughput</h4>
<table>
<thead>
<tr><th>Metric</th><th>Daily</th><th>Weekly (5 days)</th><th>Annual (250 days)</th></tr>
</thead>
<tbody>
<tr><td>Fiber processed</td><td>20-30 kg</td><td>100-150 kg</td><td>5,000-7,500 kg</td></tr>
<tr><td>Products pressed</td><td>40-80 pieces</td><td>200-400 pieces</td><td>10,000-20,000 pieces</td></tr>
<tr><td>Revenue (at $5-15 avg)</td><td>$200-1,200</td><td>$1,000-6,000</td><td>$50,000-300,000</td></tr>
</tbody>
</table>
<h4>Equipment Startup Costs</h4>
<table>
<thead>
<tr><th>Item</th><th>Minimum (used/DIY)</th><th>Mid-range</th><th>Professional</th></tr>
</thead>
<tbody>
<tr><td>Decorticator (hand-crank)</td><td>$500</td><td>$2,000</td><td>$8,000</td></tr>
<tr><td>Fiber chopper</td><td>$200</td><td>$800</td><td>$3,000</td></tr>
<tr><td>Retting tanks (3-4)</td><td>$300</td><td>$1,000</td><td>$4,000</td></tr>
<tr><td>Reaction vessels (3-4)</td><td>$600</td><td>$2,500</td><td>$10,000</td></tr>
<tr><td>Filtration &amp; wash line</td><td>$400</td><td>$1,500</td><td>$6,000</td></tr>
<tr><td>Convection dryer</td><td>$800</td><td>$3,000</td><td>$12,000</td></tr>
<tr><td>Heated mixer</td><td>$300</td><td>$1,200</td><td>$5,000</td></tr>
<tr><td>Hot press (hydraulic)</td><td>$2,000</td><td>$8,000</td><td>$25,000</td></tr>
<tr><td>Mold sets (8 products)</td><td>$1,500</td><td>$4,000</td><td>$12,000</td></tr>
<tr><td>Finishing station</td><td>$200</td><td>$500</td><td>$2,000</td></tr>
<tr><td>Safety equipment</td><td>$300</td><td>$500</td><td>$1,000</td></tr>
<tr><td>Workspace setup</td><td>$5,000</td><td>$10,000</td><td>$25,000</td></tr>
<tr><td><b>Total</b></td><td><b>$12,100</b></td><td><b>$35,000</b></td><td><b>$113,000</b></td></tr>
</tbody>
</table>
<h4>Labor</h4>
<ul>
<li><b>Minimum crew:</b> 2 people run all 6 production stations</li>
<li><b>Comfortable crew:</b> 3 people (fiber prep, chemistry, pressing)</li>
<li><b>Training time:</b> 2-4 weeks from novice to independent operation</li>
</ul>
<!-- ============================================================ -->
<!-- DISTRIBUTED HUB MODEL -->
<!-- ============================================================ -->
<span class="step-label">HUBS</span>
<h3>Distributed Hub Model</h3>
<p>
One factory proves the concept. Many factories change material culture. Each hub adapts fiber sources to local ecology &amp; product mix to local demand while following a standardized process for quality consistency.
</p>
<figure class="diagram">
<img src="img/distributed-hub.svg" alt="Hub replication model: local fiber, standardized process, local products">
<figcaption>each hub sources locally, processes consistently, sells locally.</figcaption>
</figure>
<h4>Hub Specification</h4>
<table>
<thead>
<tr><th>Component</th><th>Standardized</th><th>Localized</th></tr>
</thead>
<tbody>
<tr><td>Equipment</td><td>Same specs, same layout</td><td>Sourced from local suppliers where possible</td></tr>
<tr><td>Recipes</td><td>Same ratios, temps, times</td><td>Adjusted for local fiber cellulose content</td></tr>
<tr><td>Quality checks</td><td>Same inspection criteria</td><td>Same pass/fail thresholds</td></tr>
<tr><td>Fiber sources</td><td>Same prep standards</td><td>Whatever grows locally (hemp, nettle, kenaf, jute, wood)</td></tr>
<tr><td>Products</td><td>Same mold designs available</td><td>Hub selects product mix based on local demand</td></tr>
<tr><td>Pricing</td><td>Cost-plus formula</td><td>Adjusted to local purchasing power</td></tr>
<tr><td>Training</td><td>Same curriculum &amp; certification</td><td>Delivered in local language by local trainers</td></tr>
<tr><td>Branding</td><td>Shared quality mark</td><td>Hub name &amp; local identity</td></tr>
</tbody>
</table>
<div class="recipe-box">
<b>Replication Checklist</b><br><br>
&#9744; Identify local fiber sources (minimum 2 for supply resilience)<br>
&#9744; Secure workspace: 80-150 m2, ventilated, water access, 3-phase power<br>
&#9744; Source or build equipment (see startup cost table)<br>
&#9744; Recruit &amp; train crew of 2-3 people (2-4 week training program)<br>
&#9744; Run 50 test batches before selling (refine recipes for local fiber)<br>
&#9744; Establish local fiber supply agreements with farmers or foragers<br>
&#9744; Set up composting partnership (municipal or dedicated facility)<br>
&#9744; Launch with 3-4 products, expand based on demand<br>
&#9744; Document local adaptations &amp; share with hub network
</div>
<!-- ============================================================ -->
<!-- HONEST SUMMARY -->
<!-- ============================================================ -->
<hr>
<h3>Honest Summary</h3>
<p>
A bioplastic factory at community scale requires real investment ($12k-113k), real labor (2-3 full-time people), &amp; real fiber supply chains. Products compete on durability &amp; compostability, not on price. A bowl that lasts 5 years &amp; composts afterward occupies a different market than a $1 petroleum plastic bowl that persists for centuries.
</p>
<p>
The distributed hub model works only if each hub achieves consistent quality. Standardized recipes &amp; 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 &amp; economy.
</p>
<p>
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 &amp; composting it locally closes a cycle that petroleum never can.
</p>
<!-- ============================================================ -->
<!-- SOURCES -->
<!-- ============================================================ -->
<hr>
<h3>Sources</h3>
<div class="footnotes">
<ol>
<li id="fn1">Bodros &amp; Baley (2008), "Study of the tensile properties of stinging nettle fibres (<i>Urtica dioica</i>)," <i>Materials Letters</i>. Nettle bast fiber composition &amp; mechanical properties. <a href="#ref1">&#8617;</a></li>
<li id="fn2">Rowell et al. (2005), "Cell Wall Chemistry," in <i>Handbook of Wood Chemistry and Wood Composites</i>. Hardwood cellulose content ranges 40-50%. <a href="#ref2">&#8617;</a></li>
<li id="fn3">Dhakal et al. (2022), <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC9182753/" target="_blank">PMC 9182753</a>. 5% NaOH treatment of hemp at room temperature for 1-4 hours. Gentlest effective protocol. <a href="#ref3">&#8617;</a></li>
<li id="fn4">Beluns et al. (2023), "Sustainable hemp-based bioplastics with tunable properties via reversible thermal crosslinking of cellulose," <a href="https://pubmed.ncbi.nlm.nih.gov/37245763/" target="_blank"><i>Int J Biol Macromol</i></a>. Citric acid crosslinking at 140C, up to 70 MPa tensile strength, 7-fold water uptake reduction. <a href="#ref4">&#8617;</a></li>
<li id="fn5">Geankoplis (2003), <i>Transport Processes and Separation Process Principles</i>. Counter-current washing principles &amp; water reduction factors. <a href="#ref5">&#8617;</a></li>
<li id="fn6">Robert Murray-Smith, <a href="https://www.youtube.com/watch?v=REqqJOaE30U" target="_blank">"Hot Press Molding Hemp Casein Plastic"</a> (2020). On moisture &amp; 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." <a href="#ref6">&#8617;</a></li>
<li id="fn7"><a href="https://bio-protocol.org/exchange/minidetail?id=21294617&type=30" target="_blank">Bio-protocol</a> (2025). Hemp cellulose + glycerol + NaOH, stirred 60 min at 80C, hot pressed at 240C for 10 min. <a href="#ref7">&#8617;</a></li>
</ol>
</div>
<hr>
<p><a href="/hemp-bioplastic/process/">&#8592; recipe (full process)</a> · <a href="/hemp-bioplastic/process/homeschool/">homeschool recipe</a> · <a href="/hemp-bioplastic/">hemp bioplastic overview</a> · <a href="/single-use-plastics/">single-use plastics</a> · <a href="/hemp-bioplastic/process/factory/password">change password</a></p>
</main>
<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>
<script src="/js/diagram-zoom.js"></script>
<script src="https://uncloseai.com/uncloseai.js" type="module"></script>
</body>
</html>

View file

@ -0,0 +1,522 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>homeschool hemp bioplastic &#8212; unturf.</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#5871ad">
<meta charset="utf-8">
<link rel="stylesheet" href="/css/chunkfive/stylesheet.css" type="text/css" charset="utf-8" />
<link rel="stylesheet" href="/css/pico.classless.min.css">
<link rel="stylesheet" href="/css/unturf.css">
</head>
<body>
<main class="content-wide">
<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="/let-us-define-a-permacomputer/">manifesto</a> · <a href="/eight-forms-of-capital/">eight forms of capital</a> · <a href="/single-use-plastics/">single-use plastics</a> · <a href="/hemp-bioplastic/">hemp bioplastic</a> · <a href="/hemp-bioplastic/process/">recipe</a> · <a href="/hemp-bioplastic/process/homeschool/" aria-current="page">homeschool</a> · <a href="/software/">free software</a></small></center>
<h2>Homeschool Hemp Bioplastic</h2>
<p>
Three age-appropriate recipes for turning hemp fiber into a physical object you take home. Each recipe uses a different approach from <a href="/hemp-bioplastic/process/">a full process guide</a>, 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.
</p>
<div class="recipe-box">
<b>All three tiers run on the same 4-day schedule.</b> Mixed-age groups work side by side, each at their own level.<br><br>
<b>Sprouts</b> (ages 3-7): explore, measure, mix & mold, demold & decorate. Adult handles stove & oven only.<br>
<b>Shoots</b> (ages 8-12): gather & chop, make hemp paper, crosslink & cure, wash & cut. Adult handles oven only.<br>
<b>Stalks</b> (ages 13-18): safety & gather, extract cellulose, dry & mix, press & demold. Students handle all chemistry. Adult supervises & handles oven.
</div>
<h3>4-Day Overview</h3>
<table>
<thead>
<tr><th>Day</th><th>Theme</th><th>Sprouts (3-7)</th><th>Shoots (8-12)</th><th>Stalks (13-18)</th></tr>
</thead>
<tbody>
<tr><td>1</td><td>Explore & Gather</td><td>Touch, smell, explore hemp fiber. Collect ingredients.</td><td>Examine fiber. Chop & measure crosslinking solution.</td><td>Safety briefing. Chop fiber & weigh chemicals.</td></tr>
<tr><td>2</td><td>Prepare</td><td>Weigh & bag dry ingredients. Tear fiber. Pick molds.</td><td>Soak fiber. Spread & press into hemp paper.</td><td>Dissolve NaOH, soak 2 hours, wash to pH 7.</td></tr>
<tr><td>3</td><td>Transform</td><td>Cook bioresin (adult), mix fiber, press into molds, oven dry.</td><td>Apply crosslinking solution. Press. Oven cure at 140C.</td><td>Oven dry cellulose. Weigh. Mix with glycerol.</td></tr>
<tr><td>4</td><td>Finish</td><td>Demold. Decorate. Compare raw fiber to finished coaster.</td><td>Wash cured sheet. Cut shapes. Compare all samples.</td><td>Pack mold. Hot press. Demold. Compare all samples.</td></tr>
</tbody>
</table>
<!-- ============================================================ -->
<!-- MATERIALS -->
<!-- ============================================================ -->
<span class="step-label">MATERIALS</span>
<h3>What You Need</h3>
<p>
Quantities listed per student. Multiply by group size. All ingredients stay food-safe or classroom-safe for their respective age group.
</p>
<h4>Sprouts (ages 3-7)</h4>
<ul>
<li>10g hemp bast fiber (chopped short, ~1 cm pieces)</li>
<li>25g corn starch</li>
<li>5g dried seaweed (agar powder or carrageenan)</li>
<li>200 mL water</li>
<li>Small silicone mold or cookie cutter on parchment paper</li>
<li>Mixing bowl & spoon</li>
<li>Oven access (adult only)</li>
</ul>
<h4>Shoots (ages 8-12)</h4>
<ul>
<li>25g hemp bast fiber (chopped to 2-3 cm lengths)</li>
<li>15 mL lemon juice concentrate (citric acid source)</li>
<li>5g glycerol (available at pharmacies)</li>
<li>500 mL water</li>
<li>Flat screen or mesh (window screen works)</li>
<li>Two flat boards or heavy books for pressing</li>
<li>Baking sheet & parchment paper</li>
<li>Oven access (adult only at 140C)</li>
</ul>
<h4>Stalks (ages 13-18)</h4>
<ul>
<li>50g hemp bast fiber (chopped to 2-3 cm lengths)</li>
<li>50g NaOH pellets (sodium hydroxide / lye)</li>
<li>1 liter water</li>
<li>10 mL glycerol</li>
<li>Stainless steel pot (NOT aluminum)</li>
<li>pH strips</li>
<li>Metal mold or soap mold</li>
<li>Oven or heat press access</li>
<li>Chemical splash goggles (not safety glasses)</li>
<li>Nitrile gloves, elbow length</li>
<li>2% vinegar solution for spill neutralization</li>
</ul>
<!-- ============================================================ -->
<!-- SPROUTS: AGES 3-7 -->
<!-- ============================================================ -->
<span class="step-label">SPROUTS</span>
<h3>Ages 3-7: Hemp Fiber Coaster (4 days)</h3>
<p>
Based on <a href="/hemp-bioplastic/process/#step-7">Approach B (fiber + bioresin composite)</a>. 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.
</p>
<figure class="diagram">
<img src="../img/three-approaches.svg" alt="Three approaches to hemp bioplastic: this recipe uses Approach B, fiber + bioresin">
<figcaption>Sprouts use Approach B: fiber + bioresin composite. no chemicals beyond kitchen ingredients.</figcaption>
</figure>
<h4>Day 1: Explore & Gather (~30 minutes)</h4>
<div class="recipe-box">
<b>Inputs:</b> raw hemp fiber, corn starch, agar powder, pictures or diagram of hemp plant<br><br>
<b>Process:</b><br>
1. Pass around raw hemp fiber. Touch it, pull strands apart, smell it. Compare thick bundles to thin single threads. (~10 min, kids active)<br>
2. Talk about where hemp comes from: a plant stalk taller than most adults. Show <a href="../img/plant-anatomy.svg">plant anatomy diagram</a>. Point to the stalk bark where fiber lives.<br>
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)<br>
4. Collect all ingredients into a basket or tray. Label them together. (~5 min, kids active)<br>
5. Preview: "Over 4 days, we turn this scratchy fiber into a smooth, hard coaster. Tomorrow we measure everything." (~5 min, everyone)<br><br>
<b>Output:</b> ingredient basket gathered & labeled. Kids familiar with raw materials.<br><br>
<b>Hands-on:</b> ~25 minutes. All sensory exploration. No measuring yet.
</div>
<h4>Day 2: Measure & Tear (~30 minutes)</h4>
<div class="recipe-box">
<b>Inputs:</b> ingredient basket from Day 1, kitchen scale, bags or bowls, jar with lid, molds<br><br>
<b>Process:</b><br>
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)<br>
2. Kids weigh 25g corn starch & pour into same bag. (~5 min, kids active)<br>
3. Kids measure 200 mL water into a jar with a lid. (~3 min, kids active)<br>
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)<br>
5. Set out molds. Kids pick which shape they want. (~5 min, kids active)<br><br>
<b>Output:</b> labeled bag of dry mix (agar + starch), bag of torn fiber, jar of measured water, molds chosen. Everything staged for Day 3.<br><br>
<b>Hands-on:</b> ~25 minutes. All kid labor.
</div>
<h4>Day 3: Mix & Mold (~1 hour)</h4>
<div class="recipe-box">
<b>Inputs:</b> dry mix bag, fiber bag, & water jar from Day 2, saucepan, stove, oven, parchment paper, molds<br><br>
<b>Process:</b><br>
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)<br>
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)<br>
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)<br>
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)<br>
5. Adult places molds in oven at 150C for 20 minutes. <b>BREAK:</b> snack, wash hands, clean workspace. (~20 min, oven runs unattended)<br>
6. Adult removes molds. Set aside to cool completely. Do NOT demold today. Cooling overnight gives a harder result. (~2 min, adult handles oven)<br><br>
<b>Output:</b> coasters/ornaments in molds, cooling overnight. Demolding happens on Day 4.<br><br>
<b>Hands-on:</b> ~30 minutes kid labor out of 1 hour. Adult touches stove (~8 min) & oven (~5 min) only.<br>
<b>Attention span note:</b> longest continuous stretch runs ~15 minutes (molding). For ages 3-5, split molding into two rounds with a wiggle break between.
</div>
<h4>Day 4: Demold & Decorate (~30 minutes)</h4>
<div class="recipe-box">
<b>Inputs:</b> cooled molds from Day 3, raw fiber sample from Day 1, acrylic paint or markers (optional), string for ornaments (optional)<br><br>
<b>Process:</b><br>
1. Kids demold coasters & ornaments. Gently flex silicone mold edges & push from bottom. (~5 min, kids active)<br>
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)<br>
3. Optional: kids decorate with acrylic paint, markers, or stamps. Thread string through ornament holes. (~15 min, kids active)<br>
4. Pack take-home bag: finished coaster or ornaments + a piece of raw hemp fiber to keep for comparison. (~5 min, kids active)<br><br>
<b>Output:</b> 1 coaster (~8 cm diameter) or 2-3 small ornaments per student, decorated & ready to take home.<br><br>
<b>Hands-on:</b> ~25 minutes. All kid labor. No adult needed.
</div>
<p>
<b>What happens inside:</b> 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.
</p>
<!-- ============================================================ -->
<!-- SHOOTS: AGES 8-12 -->
<!-- ============================================================ -->
<span class="step-label">SHOOTS</span>
<h3>Ages 8-12: Citric Acid Tiles (4 days)</h3>
<p>
Based on <a href="/hemp-bioplastic/process/#step-8">Approach C (citric acid crosslinking)</a>. 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.
</p>
<figure class="diagram">
<img src="../img/three-approaches.svg" alt="Three approaches to hemp bioplastic: this recipe uses Approach C, citric acid crosslinking">
<figcaption>Shoots use Approach C: citric acid crosslinking. strongest result, safest chemistry.</figcaption>
</figure>
<h4>Day 1: Gather & Chop (~45 minutes)</h4>
<div class="recipe-box">
<b>Inputs:</b> raw hemp fiber, lemon juice concentrate, glycerol, scissors, kitchen scale<br><br>
<b>Process:</b><br>
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)<br>
2. Students chop 25g hemp fiber to 2-3 cm lengths with scissors. Bag it. (~15 min, students active)<br>
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)<br>
4. Set aside a small sample of raw unchopped fiber for comparison on Day 4.<br>
5. Review the 4-day plan: chop → paper → crosslink → finish. Each day's output feeds the next day. (~5 min, everyone)<br><br>
<b>Output:</b> bag of chopped fiber + jar of crosslinking solution + raw fiber sample. Stored until Day 2.<br><br>
<b>Hands-on:</b> ~35 minutes. All student labor. No adult needed (all ingredients food-safe).
</div>
<h4>Day 2: Make Hemp Paper (~45 minutes)</h4>
<div class="recipe-box">
<b>Inputs:</b> chopped fiber from Day 1, 500 mL water, flat screen or mesh, two flat boards, bowl<br><br>
<b>Process:</b><br>
1. Students pour chopped fiber into a bowl. Measure & add 500 mL water. Stir. Start a 30-minute soak. (~5 min, students active)<br>
2. <b>BREAK (25 min).</b> Fiber soaks unattended. Snack, sketch the process so far, or discuss hemp plant anatomy.<br>
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)<br>
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)<br><br>
<b>Output:</b> rough sheet of hemp paper + untreated paper sample. Store paper flat between sheets of parchment until Day 3.<br><br>
<b>Hands-on:</b> ~20 minutes. All student labor. No adult needed.
</div>
<h4>Day 3: Crosslink & Cure (~1 hour 30 minutes)</h4>
<div class="recipe-box">
<b>Inputs:</b> hemp paper from Day 2, crosslinking solution from Day 1, parchment paper, baking sheet, boards/books, brick or cast iron pan, oven<br><br>
<b>Process:</b><br>
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)<br>
2. <b>Optional BREAK</b> during soak. Good time for science notebook entry: what do you predict will happen when we heat it?<br>
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)<br>
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)<br>
5. <b>BREAK (45 min).</b> Oven cures unattended. Outdoor free time, journaling, or related lesson on bioplastic vs. petroleum.<br>
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)<br><br>
<b>Output:</b> cured crosslinked sheet soaking in water overnight. Washing completes before Day 4.<br><br>
<b>Hands-on:</b> ~25 minutes student labor out of 1.5 hours. Adult touches oven only (~5 min).
</div>
<h4>Day 4: Wash, Cut & Compare (~45 minutes)</h4>
<div class="recipe-box">
<b>Inputs:</b> soaked cured sheet from Day 3, raw fiber sample from Day 1, untreated paper sample from Day 2, scissors, towel<br><br>
<b>Process:</b><br>
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)<br>
2. Students cut tiles, bookmarks, or plant labels from cured sheet using scissors. Adult supervises if using a craft knife. (~15 min, students active)<br>
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)<br>
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)<br><br>
<b>Output:</b> 2-3 tiles (~5x8 cm), or 3-4 bookmarks, or 4-5 plant labels per student.<br><br>
<b>Hands-on:</b> ~30 minutes. All student labor. No adult needed (unless craft knife).
</div>
<p>
<b>What happens inside:</b> Citric acid (from lemon juice) forms chemical bridges between cellulose chains in hemp fiber when heated.<sup id="ref1"><a href="#fn1">[1]</a></sup> 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.
</p>
<!-- ============================================================ -->
<!-- STALKS: AGES 13-18 -->
<!-- ============================================================ -->
<span class="step-label">STALKS</span>
<h3>Ages 13-18: Cellulose Extraction & Pressed Disc (4 days)</h3>
<p>
Based on <a href="/hemp-bioplastic/process/#step-6">Protocol 2 (gentle cellulose extraction)</a>. 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.
</p>
<figure class="diagram">
<img src="../img/cellulose-extraction.svg" alt="Cellulose extraction process: prepare, alkali treat, wash, dry, press">
<figcaption>Stalks use Protocol 2: gentle 5% NaOH extraction at room temperature. no heating needed for extraction step.</figcaption>
</figure>
<h4>Day 1: Safety Training & Gather (~1 hour)</h4>
<div class="warning-box">
<b>Safety briefing (mandatory before touching any chemical).</b> Every student must:<br>
1. Wear chemical splash goggles (not safety glasses) for entire session on chemical days<br>
2. Wear elbow-length nitrile gloves whenever handling NaOH solution<br>
3. Know location of running water (within arm's reach)<br>
4. Know location of 2% vinegar neutralization bottle<br>
5. Understand: ALWAYS add NaOH pellets to water, NEVER water to NaOH<br>
6. Understand: if NaOH contacts skin, flush with running water for 15+ minutes, then notify adult immediately<br>
7. Work in a ventilated area (outdoors or near open windows)
</div>
<div class="recipe-box">
<b>Inputs:</b> hemp fiber, NaOH pellets, glycerol, pH strips, safety gear, scissors or grinder, kitchen scale, stainless steel pot<br><br>
<b>Process:</b><br>
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)<br>
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)<br>
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)<br>
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)<br><br>
<b>Output:</b> bag of chopped fiber + sealed container of weighed NaOH + jar of glycerol + raw fiber sample + safety-trained students.<br><br>
<b>Hands-on:</b> ~40 minutes student labor. All students handle materials (goggles & gloves for NaOH weighing). Adult supervises NaOH step.
</div>
<h4>Day 2: Extract Cellulose (~3 hours with long soak break)</h4>
<div class="recipe-box">
<b>Inputs:</b> chopped fiber from Day 1, NaOH from Day 1, 1 liter water, stainless steel pot (NOT aluminum), pH strips, fine mesh strainer, goggles & gloves<br><br>
<b>Process:</b><br>
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.<sup id="ref2"><a href="#fn2">[2]</a></sup> (~10 min, students active, adult supervises)<br>
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)<br>
3. <b>BREAK (2 hours).</b> 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.<br>
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)<br>
5. Squeeze excess water from fiber. Spread washed fiber on a tray or plate. Store in fridge overnight. (~5 min, students active)<br>
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)<br><br>
<b>Output:</b> washed cellulose fiber (wet, stored in fridge). NaOH waste neutralized & disposed.<br><br>
<b>Hands-on:</b> ~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.
</div>
<h4>Day 3: Dry & Mix (~1 hour 30 minutes)</h4>
<div class="recipe-box">
<b>Inputs:</b> wet cellulose from Day 2, glycerol from Day 1, baking sheet, oven, kitchen scale<br><br>
<b>Process:</b><br>
1. Students weigh wet cellulose on kitchen scale. Record weight. Spread fiber evenly on a baking sheet. (~5 min, students active)<br>
2. Adult loads oven at 80C. Dry for 1 hour, or until fiber feels completely dry. (~2 min, adult handles oven)<br>
3. <b>BREAK (55 min).</b> 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.<br>
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)<br>
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)<br>
6. Store cellulose paste in a sealed container overnight. Glycerol continues to absorb into fiber. (~2 min, students active)<br><br>
<b>Output:</b> cellulose paste (fiber + glycerol), sealed & ready for pressing on Day 4.<br><br>
<b>Hands-on:</b> ~30 minutes student labor out of 1.5 hours. Adult handles oven only (~5 min).
</div>
<h4>Day 4: Press & Demold (~1 hour + slow cool)</h4>
<div class="recipe-box">
<b>Inputs:</b> cellulose paste from Day 3, metal mold or soap mold, vegetable oil, baking sheet, oven, raw fiber sample from Day 1<br><br>
<b>Process:</b><br>
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)<br>
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)<br>
3. <b>BREAK (30 min).</b> 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.<br>
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)<br>
5. Once fully cool, students demold. If material sticks, place in freezer for 10 minutes, then try again. (~5 min, students active)<br>
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)<br><br>
<b>Output:</b> 1 pressed bioplastic disc (~7 cm diameter, ~5mm thick) or 1 small container per student.<br><br>
<b>Hands-on:</b> ~25 minutes student labor out of 1 hour (plus slow cool). Adult handles oven only (~5 min).
</div>
<p>
<b>What happens inside:</b> NaOH (lye) on Day 2 breaks hydrogen bonds in lignin & hemicellulose, dissolving them into solution while leaving cellulose chains intact.<sup id="ref3"><a href="#fn3">[3]</a></sup> 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.
</p>
<!-- ============================================================ -->
<!-- SAFETY NOTES -->
<!-- ============================================================ -->
<span class="step-label">SAFETY</span>
<h3>Safety Notes by Age Group</h3>
<h4>Sprouts (ages 3-7)</h4>
<div class="recipe-box">
<b>Adult handles:</b> stove & oven on Day 3 only. Nothing else requires adult hands across all 4 days.<br>
<b>Kids handle:</b> exploring (Day 1), all measuring & tearing (Day 2), stirring & molding (Day 3), demolding & decorating (Day 4).<br>
<b>Watch for:</b> kids putting fiber or starch mixture in mouths. All ingredients stay food-safe but taste terrible.<br>
<b>Allergens:</b> check for corn & seaweed allergies before Day 1.
</div>
<h4>Shoots (ages 8-12)</h4>
<div class="recipe-box">
<b>Adult handles:</b> oven on Day 3 only. Craft knife supervision on Day 4 if needed.<br>
<b>Students handle:</b> 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).<br>
<b>Watch for:</b> lemon juice in eyes on Day 3 (stings but not dangerous). Keep a damp cloth nearby.<br>
<b>Allergens:</b> citrus sensitivity. Glycerol stays hypoallergenic.
</div>
<h4>Stalks (ages 13-18)</h4>
<div class="warning-box">
<b>Adult supervises all steps involving NaOH (Days 1-2).</b> Students perform every action; adult stays present & ready to intervene.<br>
<b>Students handle:</b> 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).<br>
<b>NaOH at 5% concentration:</b> 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.<br>
<b>Spill protocol:</b> pour 2% vinegar over spill to neutralize, then wipe with paper towels. For skin contact: flush with running water for 15+ minutes.<br>
<b>Waste disposal (end of Day 2):</b> neutralize all NaOH waste to pH 7 with vinegar before pouring down drain. Verify with pH strips.
</div>
<!-- ============================================================ -->
<!-- TROUBLESHOOTING -->
<!-- ============================================================ -->
<span class="step-label">TROUBLESHOOTING</span>
<h3>What Went Wrong?</h3>
<table>
<thead>
<tr><th>Problem</th><th>Cause</th><th>Fix</th></tr>
</thead>
<tbody>
<tr>
<td>Coaster crumbles apart (Sprouts)</td>
<td>Not enough bioresin, or oven too hot</td>
<td>Add more starch/agar mixture next time. Keep oven at 150C, not higher.</td>
</tr>
<tr>
<td>Coaster stays soft & bendy (Sprouts)</td>
<td>Too much water, not dried long enough</td>
<td>Return to oven for 10 more minutes. Pack molds more firmly next time.</td>
</tr>
<tr>
<td>Tile feels like paper, not plastic (Shoots)</td>
<td>Citric acid solution too dilute, or curing time too short</td>
<td>Use full-strength lemon juice concentrate, not diluted. Cure for full 45 minutes at 140C.</td>
</tr>
<tr>
<td>Tile warps during curing (Shoots)</td>
<td>Uneven thickness or uneven pressure</td>
<td>Press more evenly before curing. Use a flat weight that covers the entire sheet.</td>
</tr>
<tr>
<td>Disc has bubbles or spongy texture (Stalks)</td>
<td>Material not dry enough before pressing</td>
<td>Dry longer on Day 3. Weigh before & after: weight should stop changing. Steam from trapped water creates voids.<sup id="ref4"><a href="#fn4">[4]</a></sup></td>
</tr>
<tr>
<td>Disc cracks when cooling (Stalks)</td>
<td>Cooled too fast, or not enough glycerol</td>
<td>Let cool slowly inside oven on Day 4 (1 hour minimum). Increase glycerol to 15 mL on Day 3 next time.</td>
</tr>
<tr>
<td>Fiber still brown after washing (Stalks)</td>
<td>Lignin not fully dissolved</td>
<td>Soak longer in NaOH on Day 2 (up to 4 hours). Or accept the color: brown means some lignin remains, but the material still works.</td>
</tr>
<tr>
<td>pH won't reach 7 after washing (Stalks)</td>
<td>Need more rinse cycles</td>
<td>Keep washing on Day 2. Can take 6-8 rinses. Residual NaOH weakens the final product, so this step matters.</td>
</tr>
</tbody>
</table>
<!-- ============================================================ -->
<!-- TAKE HOME CHECKLIST -->
<!-- ============================================================ -->
<span class="step-label">TAKE HOME</span>
<h3>Take Home Checklist</h3>
<div class="recipe-box">
<b>Sprouts take home (Day 4):</b><br>
&#9744; 1 decorated hemp fiber coaster or 2-3 ornaments<br>
&#9744; A piece of raw hemp fiber to compare with finished product<br><br>
<b>Shoots take home (Day 4):</b><br>
&#9744; 2-3 citric acid tiles, bookmarks, or plant labels<br>
&#9744; Raw hemp fiber sample (saved Day 1)<br>
&#9744; Untreated hemp paper sample (saved Day 2)<br><br>
<b>Stalks take home (Day 4, plus slow cool):</b><br>
&#9744; 1 pressed bioplastic disc or container<br>
&#9744; Raw hemp fiber sample (saved Day 1)<br>
&#9744; Dried cellulose sample (saved Day 3)<br>
&#9744; pH strip showing final wash reached neutral (Day 2)
</div>
<!-- ============================================================ -->
<!-- SOURCES -->
<!-- ============================================================ -->
<hr>
<h3>Sources</h3>
<div class="footnotes">
<ol>
<li id="fn1">Beluns et al. (2023), "Sustainable hemp-based bioplastics with tunable properties via reversible thermal crosslinking of cellulose," <a href="https://pubmed.ncbi.nlm.nih.gov/37245763/" target="_blank"><i>Int J Biol Macromol</i></a>. Citric acid crosslinking at 140C achieves up to 70 MPa tensile strength. <a href="#ref1">&#8617;</a></li>
<li id="fn2">Dhakal et al. (2022), <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC9182753/" target="_blank">PMC 9182753</a>. 5% NaOH treatment of hemp at room temperature for 1-4 hours. Gentlest effective protocol for cellulose extraction. <a href="#ref2">&#8617;</a></li>
<li id="fn3">Chalannavar et al. (2025), "Industrial Cannabis sativa: Hemp Cellulose Based Bioplastic Production," <a href="https://magnascientiapub.com/journals/msabp/sites/default/files/MSABP-2025-0067.pdf" target="_blank">Magna Scientia</a>. Comprehensive review of NaOH cellulose extraction protocols. <a href="#ref3">&#8617;</a></li>
<li id="fn4">Robert Murray-Smith, <a href="https://www.youtube.com/watch?v=REqqJOaE30U" target="_blank">"Hot Press Molding Hemp Casein Plastic"</a> (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." <a href="#ref4">&#8617;</a></li>
</ol>
</div>
<p>
Full chemistry, equipment lists, & scaling details: <a href="/hemp-bioplastic/process/">hemp bioplastic process (recipe)</a>.
</p>
<hr>
<p><a href="/hemp-bioplastic/process/">&#8592; recipe (full process)</a> · <a href="/hemp-bioplastic/process/factory/">factory</a> · <a href="/hemp-bioplastic/">hemp bioplastic overview</a> · <a href="/single-use-plastics/">single-use plastics</a></p>
</main>
<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>
<script src="/js/diagram-zoom.js"></script>
<script src="https://uncloseai.com/uncloseai.js" type="module"></script>
</body>
</html>

View file

@ -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"]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

View file

@ -0,0 +1,217 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: cellulose_extraction Pages: 1 -->
<svg width="346pt" height="1090pt"
viewBox="0.00 0.00 345.56 1089.54" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 1085.54)">
<title>cellulose_extraction</title>
<polygon fill="#1a1a2e" stroke="transparent" points="-4,4 -4,-1085.54 341.56,-1085.54 341.56,4 -4,4"/>
<g id="clust1" class="cluster">
<title>cluster_prep</title>
<polygon fill="#1a1a2e" stroke="#4caf50" stroke-dasharray="5,2" points="12,-782.54 12,-1073.54 174,-1073.54 174,-782.54 12,-782.54"/>
<text text-anchor="middle" x="93" y="-1060.74" font-family="Helvetica Bold" font-size="11.00" fill="#4caf50">PREPARE</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_alkali</title>
<polygon fill="#1a1a2e" stroke="#2196f3" stroke-dasharray="5,2" points="25,-502.54 25,-754.54 161,-754.54 161,-502.54 25,-502.54"/>
<text text-anchor="middle" x="93" y="-741.74" font-family="Helvetica Bold" font-size="11.00" fill="#2196f3">ALKALI TREATMENT</text>
</g>
<g id="clust3" class="cluster">
<title>cluster_bleach</title>
<polygon fill="#1a1a2e" stroke="#9c27b0" stroke-dasharray="5,2" points="8,-322.54 8,-483.54 170,-483.54 170,-322.54 8,-322.54"/>
<text text-anchor="middle" x="89" y="-470.74" font-family="Helvetica Bold" font-size="11.00" fill="#9c27b0">BLEACH (optional)</text>
</g>
<g id="clust4" class="cluster">
<title>cluster_purify</title>
<polygon fill="#1a1a2e" stroke="#ff9800" stroke-dasharray="5,2" points="10,-8 10,-303.54 158,-303.54 158,-8 10,-8"/>
<text text-anchor="middle" x="84" y="-290.74" font-family="Helvetica Bold" font-size="11.00" fill="#ff9800">PURIFY</text>
</g>
<!-- dry -->
<g id="node1" class="node">
<title>dry</title>
<polygon fill="#2e7d32" stroke="black" points="166,-1045.54 20,-1045.54 20,-1009.54 166,-1009.54 166,-1045.54"/>
<text text-anchor="middle" x="93" y="-1030.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">dry bast fiber</text>
<text text-anchor="middle" x="93" y="-1019.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">50°C until constant weight</text>
</g>
<!-- cut -->
<g id="node2" class="node">
<title>cut</title>
<polygon fill="#388e3c" stroke="black" points="153,-972.54 33,-972.54 33,-936.54 153,-936.54 153,-972.54"/>
<text text-anchor="middle" x="93" y="-952.04" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">cut to 2&#45;3 cm lengths</text>
</g>
<!-- dry&#45;&gt;cut -->
<g id="edge1" class="edge">
<title>dry&#45;&gt;cut</title>
<path fill="none" stroke="#888888" d="M93,-1009.35C93,-1001.33 93,-991.59 93,-982.61"/>
<polygon fill="#888888" stroke="#888888" points="96.5,-982.57 93,-972.57 89.5,-982.57 96.5,-982.57"/>
</g>
<!-- grind -->
<g id="node3" class="node">
<title>grind</title>
<polygon fill="#43a047" stroke="black" points="154,-899.54 32,-899.54 32,-863.54 154,-863.54 154,-899.54"/>
<text text-anchor="middle" x="93" y="-884.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">grind &amp; sieve</text>
<text text-anchor="middle" x="93" y="-873.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">through 1.5mm mesh</text>
</g>
<!-- cut&#45;&gt;grind -->
<g id="edge2" class="edge">
<title>cut&#45;&gt;grind</title>
<path fill="none" stroke="#888888" d="M93,-936.35C93,-928.33 93,-918.59 93,-909.61"/>
<polygon fill="#888888" stroke="#888888" points="96.5,-909.57 93,-899.57 89.5,-909.57 96.5,-909.57"/>
</g>
<!-- weigh -->
<g id="node4" class="node">
<title>weigh</title>
<polygon fill="#66bb6a" stroke="black" points="146,-826.54 40,-826.54 40,-790.54 146,-790.54 146,-826.54"/>
<text text-anchor="middle" x="93" y="-811.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">weigh 50g powder</text>
<text text-anchor="middle" x="93" y="-800.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">(test batch)</text>
</g>
<!-- grind&#45;&gt;weigh -->
<g id="edge3" class="edge">
<title>grind&#45;&gt;weigh</title>
<path fill="none" stroke="#888888" d="M93,-863.35C93,-855.33 93,-845.59 93,-836.61"/>
<polygon fill="#888888" stroke="#888888" points="96.5,-836.57 93,-826.57 89.5,-836.57 96.5,-836.57"/>
</g>
<!-- naoh -->
<g id="node5" class="node">
<title>naoh</title>
<polygon fill="#1565c0" stroke="black" points="148,-726.54 38,-726.54 38,-685.54 148,-685.54 148,-726.54"/>
<text text-anchor="middle" x="93" y="-714.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">dissolve 90g NaOH</text>
<text text-anchor="middle" x="93" y="-703.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">in 750 mL water</text>
<text text-anchor="middle" x="93" y="-692.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">= 12% solution</text>
</g>
<!-- weigh&#45;&gt;naoh -->
<g id="edge4" class="edge">
<title>weigh&#45;&gt;naoh</title>
<path fill="none" stroke="#888888" d="M93,-790.49C93,-775.84 93,-754.36 93,-736.87"/>
<polygon fill="#888888" stroke="#888888" points="96.5,-736.58 93,-726.58 89.5,-736.58 96.5,-736.58"/>
<text text-anchor="middle" x="108" y="-765.34" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">add to</text>
</g>
<!-- bath -->
<g id="node6" class="node">
<title>bath</title>
<polygon fill="#1976d2" stroke="black" points="152.5,-648.54 33.5,-648.54 33.5,-607.54 152.5,-607.54 152.5,-648.54"/>
<text text-anchor="middle" x="93" y="-636.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">add hemp powder</text>
<text text-anchor="middle" x="93" y="-625.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">80°C, stir at 500 rpm</text>
<text text-anchor="middle" x="93" y="-614.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">3 hours</text>
</g>
<!-- naoh&#45;&gt;bath -->
<g id="edge5" class="edge">
<title>naoh&#45;&gt;bath</title>
<path fill="none" stroke="#888888" d="M93,-685.47C93,-677.31 93,-667.66 93,-658.67"/>
<polygon fill="#888888" stroke="#888888" points="96.5,-658.54 93,-648.54 89.5,-658.54 96.5,-658.54"/>
</g>
<!-- filter1 -->
<g id="node7" class="node">
<title>filter1</title>
<polygon fill="#1e88e5" stroke="black" points="137,-551.54 45,-551.54 45,-510.54 137,-510.54 137,-551.54"/>
<text text-anchor="middle" x="91" y="-539.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">vacuum filter</text>
<text text-anchor="middle" x="91" y="-528.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">wash 4&#45;5 times</text>
<text text-anchor="middle" x="91" y="-517.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">until pH neutral</text>
</g>
<!-- bath&#45;&gt;filter1 -->
<g id="edge6" class="edge">
<title>bath&#45;&gt;filter1</title>
<path fill="none" stroke="#888888" d="M92.59,-607.36C92.31,-594.24 91.94,-576.74 91.63,-561.92"/>
<polygon fill="#888888" stroke="#888888" points="95.12,-561.62 91.41,-551.7 88.13,-561.77 95.12,-561.62"/>
<text text-anchor="middle" x="114" y="-582.34" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">lignin</text>
<text text-anchor="middle" x="114" y="-572.34" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">dissolved</text>
</g>
<!-- waste -->
<g id="node13" class="node">
<title>waste</title>
<ellipse fill="#37474f" stroke="black" cx="252" cy="-130.77" rx="85.62" ry="36.54"/>
<text text-anchor="middle" x="252" y="-144.77" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#aaaaaa">waste liquor</text>
<text text-anchor="middle" x="252" y="-133.77" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#aaaaaa">neutralize to pH 7</text>
<text text-anchor="middle" x="252" y="-122.77" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#aaaaaa">before disposal</text>
<text text-anchor="middle" x="252" y="-111.77" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#aaaaaa">lignin is compostable</text>
</g>
<!-- bath&#45;&gt;waste -->
<g id="edge12" class="edge">
<title>bath&#45;&gt;waste</title>
<path fill="none" stroke="#555555" stroke-dasharray="5,2" d="M151.84,-607.43C184.26,-592.52 218,-568.29 218,-532.04 218,-532.04 218,-532.04 218,-248.54 218,-224.1 224.95,-197.88 232.57,-176.49"/>
<polygon fill="#555555" stroke="#555555" points="235.88,-177.62 236.1,-167.03 229.32,-175.18 235.88,-177.62"/>
</g>
<!-- h2o2 -->
<g id="node8" class="node">
<title>h2o2</title>
<polygon fill="#7b1fa2" stroke="black" points="162,-455.54 16,-455.54 16,-403.54 162,-403.54 162,-455.54"/>
<text text-anchor="middle" x="89" y="-443.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">8% hydrogen peroxide</text>
<text text-anchor="middle" x="89" y="-432.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">adjust pH to 12 with NaOH</text>
<text text-anchor="middle" x="89" y="-421.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">40°C for 1 hour</text>
<text text-anchor="middle" x="89" y="-410.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">repeat 4 cycles</text>
</g>
<!-- filter1&#45;&gt;h2o2 -->
<g id="edge7" class="edge">
<title>filter1&#45;&gt;h2o2</title>
<path fill="none" stroke="#888888" d="M90.6,-510.38C90.35,-497.8 90.02,-481.11 89.72,-466.25"/>
<polygon fill="#888888" stroke="#888888" points="93.21,-465.76 89.51,-455.83 86.21,-465.9 93.21,-465.76"/>
</g>
<!-- filter2 -->
<g id="node9" class="node">
<title>filter2</title>
<polygon fill="#8e24aa" stroke="black" points="139,-366.54 35,-366.54 35,-330.54 139,-330.54 139,-366.54"/>
<text text-anchor="middle" x="87" y="-351.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">wash until neutral</text>
<text text-anchor="middle" x="87" y="-340.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">vacuum filter</text>
</g>
<!-- h2o2&#45;&gt;filter2 -->
<g id="edge8" class="edge">
<title>h2o2&#45;&gt;filter2</title>
<path fill="none" stroke="#888888" d="M88.36,-403.11C88.14,-394.74 87.91,-385.39 87.69,-376.88"/>
<polygon fill="#888888" stroke="#888888" points="91.19,-376.6 87.43,-366.69 84.19,-376.77 91.19,-376.6"/>
</g>
<!-- hemi -->
<g id="node10" class="node">
<title>hemi</title>
<polygon fill="#e65100" stroke="black" points="149.5,-275.54 18.5,-275.54 18.5,-223.54 149.5,-223.54 149.5,-275.54"/>
<text text-anchor="middle" x="84" y="-263.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">17.5% NaOH solution</text>
<text text-anchor="middle" x="84" y="-252.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">room temperature</text>
<text text-anchor="middle" x="84" y="-241.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">5 hours, stir at 500 rpm</text>
<text text-anchor="middle" x="84" y="-230.54" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">removes hemicellulose</text>
</g>
<!-- filter2&#45;&gt;hemi -->
<g id="edge9" class="edge">
<title>filter2&#45;&gt;hemi</title>
<path fill="none" stroke="#888888" d="M86.46,-330.2C86.08,-317.89 85.56,-300.94 85.09,-285.83"/>
<polygon fill="#888888" stroke="#888888" points="88.59,-285.64 84.78,-275.75 81.59,-285.86 88.59,-285.64"/>
</g>
<!-- filter3 -->
<g id="node11" class="node">
<title>filter3</title>
<polygon fill="#f57c00" stroke="black" points="145,-151.27 23,-151.27 23,-110.27 145,-110.27 145,-151.27"/>
<text text-anchor="middle" x="84" y="-139.27" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">vacuum filter</text>
<text text-anchor="middle" x="84" y="-128.27" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">wash 3 times</text>
<text text-anchor="middle" x="84" y="-117.27" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">dry at 60°C overnight</text>
</g>
<!-- hemi&#45;&gt;filter3 -->
<g id="edge10" class="edge">
<title>hemi&#45;&gt;filter3</title>
<path fill="none" stroke="#888888" d="M84,-223.49C84,-205.28 84,-180.57 84,-161.39"/>
<polygon fill="#888888" stroke="#888888" points="87.5,-161.37 84,-151.37 80.5,-161.37 87.5,-161.37"/>
<text text-anchor="middle" x="114.5" y="-198.34" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">hemicellulose</text>
<text text-anchor="middle" x="114.5" y="-188.34" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">removed</text>
</g>
<!-- hemi&#45;&gt;waste -->
<g id="edge13" class="edge">
<title>hemi&#45;&gt;waste</title>
<path fill="none" stroke="#555555" stroke-dasharray="5,2" d="M122.31,-223.54C131.12,-217.69 140.42,-211.45 149,-205.54 166.05,-193.8 184.48,-180.73 200.97,-168.88"/>
<polygon fill="#555555" stroke="#555555" points="203.33,-171.5 209.4,-162.81 199.24,-165.81 203.33,-171.5"/>
</g>
<!-- result -->
<g id="node12" class="node">
<title>result</title>
<polygon fill="#ff9800" stroke="black" points="146,-57 22,-57 22,-16 146,-16 146,-57"/>
<text text-anchor="middle" x="84" y="-45" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">~25g pure cellulose</text>
<text text-anchor="middle" x="84" y="-34" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">white fibrous material</text>
<text text-anchor="middle" x="84" y="-23" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">~50% yield from bast</text>
</g>
<!-- filter3&#45;&gt;result -->
<g id="edge11" class="edge">
<title>filter3&#45;&gt;result</title>
<path fill="none" stroke="#888888" d="M84,-110.2C84,-97.72 84,-81.31 84,-67.24"/>
<polygon fill="#888888" stroke="#888888" points="87.5,-67.04 84,-57.04 80.5,-67.04 87.5,-67.04"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -0,0 +1,45 @@
digraph equipment {
bgcolor="#1a1a2e"
rankdir=TB
node [fontname="Helvetica" fontsize=10 style=filled shape=box]
edge [style=invis]
label=<<B><FONT COLOR="#cccccc" POINT-SIZE="14">equipment for a 50g test batch</FONT></B>>
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]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

View file

@ -0,0 +1,142 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: equipment Pages: 1 -->
<svg width="664pt" height="417pt"
viewBox="0.00 0.00 663.50 417.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 413)">
<title>equipment</title>
<polygon fill="#1a1a2e" stroke="transparent" points="-4,4 -4,-413 659.5,-413 659.5,4 -4,4"/>
<text text-anchor="start" x="205.75" y="-394.8" font-family="Times,serif" font-weight="bold" font-size="14.00" fill="#cccccc">equipment for a 50g test batch</text>
<g id="clust1" class="cluster">
<title>cluster_chem</title>
<polygon fill="#1a1a2e" stroke="#2196f3" stroke-dasharray="5,2" points="8,-8 8,-378 152,-378 152,-8 8,-8"/>
<text text-anchor="middle" x="80" y="-365.2" font-family="Helvetica Bold" font-size="11.00" fill="#2196f3">CHEMISTRY</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_press</title>
<polygon fill="#1a1a2e" stroke="#ff9800" stroke-dasharray="5,2" points="160,-80 160,-375.5 328,-375.5 328,-80 160,-80"/>
<text text-anchor="middle" x="244" y="-362.7" font-family="Helvetica Bold" font-size="11.00" fill="#ff9800">PRESSING</text>
</g>
<g id="clust3" class="cluster">
<title>cluster_safety</title>
<polygon fill="#1a1a2e" stroke="#f44336" stroke-dasharray="5,2" points="336,-80 336,-375.5 508,-375.5 508,-80 336,-80"/>
<text text-anchor="middle" x="422" y="-362.7" font-family="Helvetica Bold" font-size="11.00" fill="#f44336">SAFETY</text>
</g>
<!-- e1 -->
<g id="node1" class="node">
<title>e1</title>
<polygon fill="#1565c0" stroke="black" points="133,-350 27,-350 27,-309 133,-309 133,-350"/>
<text text-anchor="middle" x="80" y="-338" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">stainless steel pot</text>
<text text-anchor="middle" x="80" y="-327" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">2&#45;5 liter</text>
<text text-anchor="middle" x="80" y="-316" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">NOT aluminum</text>
</g>
<!-- e2 -->
<g id="node2" class="node">
<title>e2</title>
<polygon fill="#1976d2" stroke="black" points="132,-273 28,-273 28,-237 132,-237 132,-273"/>
<text text-anchor="middle" x="80" y="-258" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">hot plate</text>
<text text-anchor="middle" x="80" y="-247" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">80&#45;100°C capable</text>
</g>
<!-- e1&#45;&gt;e2 -->
<!-- e3 -->
<g id="node3" class="node">
<title>e3</title>
<polygon fill="#1e88e5" stroke="black" points="137.5,-198.5 22.5,-198.5 22.5,-162.5 137.5,-162.5 137.5,-198.5"/>
<text text-anchor="middle" x="80" y="-183.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">digital thermometer</text>
<text text-anchor="middle" x="80" y="-172.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">0&#45;200°C</text>
</g>
<!-- e2&#45;&gt;e3 -->
<!-- e4 -->
<g id="node4" class="node">
<title>e4</title>
<polygon fill="#42a5f5" stroke="black" points="114.5,-124 45.5,-124 45.5,-88 114.5,-88 114.5,-124"/>
<text text-anchor="middle" x="80" y="-109" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">pH strips</text>
<text text-anchor="middle" x="80" y="-98" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">range 1&#45;14</text>
</g>
<!-- e3&#45;&gt;e4 -->
<!-- e5 -->
<g id="node5" class="node">
<title>e5</title>
<polygon fill="#64b5f6" stroke="black" points="144,-52 16,-52 16,-16 144,-16 144,-52"/>
<text text-anchor="middle" x="80" y="-37" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1a1a2e">vacuum filter setup</text>
<text text-anchor="middle" x="80" y="-26" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1a1a2e">Buchner funnel + flask</text>
</g>
<!-- e4&#45;&gt;e5 -->
<!-- p1 -->
<g id="node6" class="node">
<title>p1</title>
<polygon fill="#e65100" stroke="black" points="320,-347.5 168,-347.5 168,-311.5 320,-311.5 320,-347.5"/>
<text text-anchor="middle" x="244" y="-332.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">metal mold</text>
<text text-anchor="middle" x="244" y="-321.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">aluminum soap mold works</text>
</g>
<!-- p2 -->
<g id="node7" class="node">
<title>p2</title>
<polygon fill="#f57c00" stroke="black" points="313.5,-273 174.5,-273 174.5,-237 313.5,-237 313.5,-273"/>
<text text-anchor="middle" x="244" y="-258" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">oven (140&#45;200°C)</text>
<text text-anchor="middle" x="244" y="-247" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">or rosin press ($200&#45;500)</text>
</g>
<!-- p1&#45;&gt;p2 -->
<!-- p3 -->
<g id="node8" class="node">
<title>p3</title>
<polygon fill="#ff9800" stroke="black" points="297,-201 191,-201 191,-160 297,-160 297,-201"/>
<text text-anchor="middle" x="244" y="-189" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">bench vise or</text>
<text text-anchor="middle" x="244" y="-178" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">hydraulic press</text>
<text text-anchor="middle" x="244" y="-167" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">for clamping force</text>
</g>
<!-- p2&#45;&gt;p3 -->
<!-- p4 -->
<g id="node9" class="node">
<title>p4</title>
<polygon fill="#ffc107" stroke="black" points="304,-124 184,-124 184,-88 304,-88 304,-124"/>
<text text-anchor="middle" x="244" y="-109" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1a1a2e">heat&#45;resistant gloves</text>
<text text-anchor="middle" x="244" y="-98" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1a1a2e">rated 200°C+</text>
</g>
<!-- p3&#45;&gt;p4 -->
<!-- s1 -->
<g id="node10" class="node">
<title>s1</title>
<polygon fill="#b71c1c" stroke="black" points="490.5,-347.5 353.5,-347.5 353.5,-311.5 490.5,-311.5 490.5,-347.5"/>
<text text-anchor="middle" x="422" y="-332.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">chemical splash goggles</text>
<text text-anchor="middle" x="422" y="-321.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">not just safety glasses</text>
</g>
<!-- s2 -->
<g id="node11" class="node">
<title>s2</title>
<polygon fill="#c62828" stroke="black" points="462,-273 382,-273 382,-237 462,-237 462,-273"/>
<text text-anchor="middle" x="422" y="-258" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">nitrile gloves</text>
<text text-anchor="middle" x="422" y="-247" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">elbow length</text>
</g>
<!-- s1&#45;&gt;s2 -->
<!-- s3 -->
<g id="node12" class="node">
<title>s3</title>
<polygon fill="#d32f2f" stroke="black" points="486,-198.5 358,-198.5 358,-162.5 486,-162.5 486,-198.5"/>
<text text-anchor="middle" x="422" y="-183.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">ventilated workspace</text>
<text text-anchor="middle" x="422" y="-172.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">fume hood or outdoors</text>
</g>
<!-- s2&#45;&gt;s3 -->
<!-- s4 -->
<g id="node13" class="node">
<title>s4</title>
<polygon fill="#e53935" stroke="black" points="499.5,-124 344.5,-124 344.5,-88 499.5,-88 499.5,-124"/>
<text text-anchor="middle" x="422" y="-109" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">2% vinegar nearby</text>
<text text-anchor="middle" x="422" y="-98" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">for NaOH spill neutralization</text>
</g>
<!-- s3&#45;&gt;s4 -->
<!-- cost -->
<g id="node14" class="node">
<title>cost</title>
<polygon fill="#263238" stroke="black" points="649.5,-350 516.5,-350 516.5,-309 655.5,-309 655.5,-344 649.5,-350"/>
<polyline fill="none" stroke="black" points="649.5,-350 649.5,-344 "/>
<polyline fill="none" stroke="black" points="655.5,-344 649.5,-344 "/>
<text text-anchor="middle" x="586" y="-338" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#cddc39">total equipment cost</text>
<text text-anchor="middle" x="586" y="-327" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#cddc39">$500&#45;2,000</text>
<text text-anchor="middle" x="586" y="-316" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#cddc39">for basic workshop setup</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.4 KiB

View file

@ -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=<<B><FONT COLOR="#cccccc" POINT-SIZE="14">which parts of hemp we harvest</FONT></B>>
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]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

View file

@ -0,0 +1,141 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: plant_anatomy Pages: 1 -->
<svg width="763pt" height="329pt"
viewBox="0.00 0.00 763.00 329.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 325)">
<title>plant_anatomy</title>
<polygon fill="#1a1a2e" stroke="transparent" points="-4,4 -4,-325 759,-325 759,4 -4,4"/>
<text text-anchor="start" x="252.5" y="-306.8" font-family="Times,serif" font-weight="bold" font-size="14.00" fill="#cccccc">which parts of hemp we harvest</text>
<g id="clust1" class="cluster">
<title>cluster_use</title>
<polygon fill="#1a1a2e" stroke="#4caf50" stroke-dasharray="5,2" points="8,-8 8,-208.5 312,-208.5 312,-8 8,-8"/>
<text text-anchor="middle" x="160" y="-194.9" font-family="Helvetica Bold" font-size="12.00" fill="#4caf50">WE USE</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_stalk</title>
<polygon fill="#1a1a2e" stroke="transparent" stroke-dasharray="5,2" points="16,-16 16,-95 304,-95 304,-16 16,-16"/>
</g>
<g id="clust3" class="cluster">
<title>cluster_byproduct</title>
<polygon fill="#1a1a2e" stroke="#ff9800" stroke-dasharray="5,2" points="320,-125 320,-214 747,-214 747,-125 320,-125"/>
<text text-anchor="middle" x="533.5" y="-200.4" font-family="Helvetica Bold" font-size="12.00" fill="#ff9800">BYPRODUCTS</text>
</g>
<!-- plant -->
<g id="node1" class="node">
<title>plant</title>
<ellipse fill="#2e7d32" stroke="black" cx="438" cy="-274" rx="56.64" ry="21.43"/>
<text text-anchor="middle" x="438" y="-277" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">hemp plant</text>
<text text-anchor="middle" x="438" y="-266" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">120 day crop</text>
</g>
<!-- stalk -->
<g id="node2" class="node">
<title>stalk</title>
<polygon fill="#388e3c" stroke="black" points="282.5,-179.5 175.5,-179.5 175.5,-138.5 282.5,-138.5 282.5,-179.5"/>
<text text-anchor="middle" x="229" y="-167.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">STALK</text>
<text text-anchor="middle" x="229" y="-156.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">(main stem)</text>
<text text-anchor="middle" x="229" y="-145.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">80&#45;90% of harvest</text>
</g>
<!-- plant&#45;&gt;stalk -->
<g id="edge1" class="edge">
<title>plant&#45;&gt;stalk</title>
<path fill="none" stroke="#888888" d="M402.65,-257.38C386.22,-249.95 366.48,-240.78 349,-232 320.89,-217.88 290.53,-199.63 267.37,-185.03"/>
<polygon fill="#888888" stroke="#888888" points="269.19,-182.04 258.87,-179.64 265.44,-187.95 269.19,-182.04"/>
<text text-anchor="middle" x="381" y="-224.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">harvest stems</text>
</g>
<!-- leaves -->
<g id="node5" class="node">
<title>leaves</title>
<polygon fill="#827717" stroke="black" points="453.5,-179.5 328.5,-179.5 328.5,-138.5 453.5,-138.5 453.5,-179.5"/>
<text text-anchor="middle" x="391" y="-167.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">LEAVES</text>
<text text-anchor="middle" x="391" y="-156.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">not used for bioplastic</text>
<text text-anchor="middle" x="391" y="-145.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">compost or mulch</text>
</g>
<!-- plant&#45;&gt;leaves -->
<g id="edge2" class="edge">
<title>plant&#45;&gt;leaves</title>
<path fill="none" stroke="#888888" d="M429.6,-252.8C422.2,-235.01 411.34,-208.91 403.02,-188.91"/>
<polygon fill="#888888" stroke="#888888" points="406.24,-187.54 399.17,-179.65 399.78,-190.23 406.24,-187.54"/>
<text text-anchor="middle" x="430.5" y="-224.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">strip</text>
</g>
<!-- seeds -->
<g id="node6" class="node">
<title>seeds</title>
<polygon fill="#f57c00" stroke="black" points="596.5,-179.5 471.5,-179.5 471.5,-138.5 596.5,-138.5 596.5,-179.5"/>
<text text-anchor="middle" x="534" y="-167.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">SEEDS</text>
<text text-anchor="middle" x="534" y="-156.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">not used for bioplastic</text>
<text text-anchor="middle" x="534" y="-145.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">food, oil, or next crop</text>
</g>
<!-- plant&#45;&gt;seeds -->
<g id="edge3" class="edge">
<title>plant&#45;&gt;seeds</title>
<path fill="none" stroke="#888888" d="M454.5,-253.57C470.03,-235.3 493.42,-207.77 510.81,-187.29"/>
<polygon fill="#888888" stroke="#888888" points="513.58,-189.44 517.39,-179.55 508.25,-184.91 513.58,-189.44"/>
<text text-anchor="middle" x="495" y="-224.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">collect</text>
</g>
<!-- roots -->
<g id="node7" class="node">
<title>roots</title>
<polygon fill="#4e342e" stroke="black" points="739,-185 615,-185 615,-133 739,-133 739,-185"/>
<text text-anchor="middle" x="677" y="-173" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">ROOTS</text>
<text text-anchor="middle" x="677" y="-162" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">stay in ground</text>
<text text-anchor="middle" x="677" y="-151" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">improve soil structure</text>
<text text-anchor="middle" x="677" y="-140" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">break up compaction</text>
</g>
<!-- plant&#45;&gt;roots -->
<g id="edge4" class="edge">
<title>plant&#45;&gt;roots</title>
<path fill="none" stroke="#888888" d="M478.21,-258.96C527.44,-241.77 604.52,-214.8 606,-214 617.73,-207.68 629.59,-199.52 640.17,-191.46"/>
<polygon fill="#888888" stroke="#888888" points="642.64,-193.97 648.36,-185.05 638.32,-188.46 642.64,-193.97"/>
<text text-anchor="middle" x="606" y="-224.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">leave in soil</text>
</g>
<!-- bast -->
<g id="node3" class="node">
<title>bast</title>
<polygon fill="#43a047" stroke="black" points="144,-87 24,-87 24,-24 144,-24 144,-87"/>
<text text-anchor="middle" x="84" y="-75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">BAST FIBER</text>
<text text-anchor="middle" x="84" y="-64" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">outer bark layer</text>
<text text-anchor="middle" x="84" y="-53" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">~30% of stalk</text>
<text text-anchor="middle" x="84" y="-42" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">77% cellulose</text>
<text text-anchor="middle" x="84" y="-31" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">this makes bioplastic</text>
</g>
<!-- stalk&#45;&gt;bast -->
<g id="edge5" class="edge">
<title>stalk&#45;&gt;bast</title>
<path fill="none" stroke="#888888" d="M201.04,-138.43C182.65,-125.56 158.02,-108.32 136.1,-92.97"/>
<polygon fill="#888888" stroke="#888888" points="138.05,-90.06 127.85,-87.19 134.03,-95.8 138.05,-90.06"/>
<text text-anchor="middle" x="190.5" y="-107.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">outer layer</text>
</g>
<!-- hurd -->
<g id="node4" class="node">
<title>hurd</title>
<polygon fill="#795548" stroke="black" points="296,-87 162,-87 162,-24 296,-24 296,-87"/>
<text text-anchor="middle" x="229" y="-75" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">HURD (core)</text>
<text text-anchor="middle" x="229" y="-64" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">inner woody pith</text>
<text text-anchor="middle" x="229" y="-53" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">~70% of stalk</text>
<text text-anchor="middle" x="229" y="-42" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">44% cellulose</text>
<text text-anchor="middle" x="229" y="-31" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">lower grade, still usable</text>
</g>
<!-- stalk&#45;&gt;hurd -->
<g id="edge6" class="edge">
<title>stalk&#45;&gt;hurd</title>
<path fill="none" stroke="#888888" d="M229,-138.43C229,-126.75 229,-111.47 229,-97.27"/>
<polygon fill="#888888" stroke="#888888" points="232.5,-97.19 229,-87.19 225.5,-97.19 232.5,-97.19"/>
<text text-anchor="middle" x="252" y="-107.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">inner core</text>
</g>
<!-- note -->
<g id="node8" class="node">
<title>note</title>
<polygon fill="#263238" stroke="black" points="719,-298 513,-298 513,-250 725,-250 725,-292 719,-298"/>
<polyline fill="none" stroke="black" points="719,-298 719,-292 "/>
<polyline fill="none" stroke="black" points="725,-292 719,-292 "/>
<text text-anchor="middle" x="619" y="-286.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">bioplastic comes from stalk only</text>
<text text-anchor="middle" x="619" y="-276.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">specifically bast fiber (outer bark)</text>
<text text-anchor="middle" x="619" y="-266.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">hurd works but yields less cellulose</text>
<text text-anchor="middle" x="619" y="-256.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">leaves, seeds, &amp; roots serve other purposes</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.5 KiB

View file

@ -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=<<B><FONT COLOR="#cccccc" POINT-SIZE="14">mixing &amp; hot pressing</FONT></B>>
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]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

View file

@ -0,0 +1,159 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: pressing Pages: 1 -->
<svg width="337pt" height="753pt"
viewBox="0.00 0.00 337.37 752.60" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 748.6)">
<title>pressing</title>
<polygon fill="#1a1a2e" stroke="transparent" points="-4,4 -4,-748.6 333.37,-748.6 333.37,4 -4,4"/>
<text text-anchor="start" x="77.19" y="-730.4" font-family="Times,serif" font-weight="bold" font-size="14.00" fill="#cccccc">mixing &amp; hot pressing</text>
<!-- cellulose -->
<g id="node1" class="node">
<title>cellulose</title>
<polygon fill="#1e88e5" stroke="black" points="200,-720.6 112,-720.6 112,-684.6 200,-684.6 200,-720.6"/>
<text text-anchor="middle" x="156" y="-705.6" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">dried cellulose</text>
<text text-anchor="middle" x="156" y="-694.6" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">weighed</text>
</g>
<!-- glycerol -->
<g id="node2" class="node">
<title>glycerol</title>
<polygon fill="#7b1fa2" stroke="black" points="200.5,-646.6 111.5,-646.6 111.5,-605.6 200.5,-605.6 200.5,-646.6"/>
<text text-anchor="middle" x="156" y="-634.6" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">add glycerol</text>
<text text-anchor="middle" x="156" y="-623.6" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">15% = rigid</text>
<text text-anchor="middle" x="156" y="-612.6" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">30% = flexible</text>
</g>
<!-- cellulose&#45;&gt;glycerol -->
<g id="edge1" class="edge">
<title>cellulose&#45;&gt;glycerol</title>
<path fill="none" stroke="#888888" d="M156,-684.32C156,-676.14 156,-666.13 156,-656.78"/>
<polygon fill="#888888" stroke="#888888" points="159.5,-656.65 156,-646.65 152.5,-656.65 159.5,-656.65"/>
</g>
<!-- mix -->
<g id="node3" class="node">
<title>mix</title>
<polygon fill="#9c27b0" stroke="black" points="211,-568.6 101,-568.6 101,-527.6 211,-527.6 211,-568.6"/>
<text text-anchor="middle" x="156" y="-556.6" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">stir at 80°C</text>
<text text-anchor="middle" x="156" y="-545.6" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">for 60 minutes</text>
<text text-anchor="middle" x="156" y="-534.6" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">until homogeneous</text>
</g>
<!-- glycerol&#45;&gt;mix -->
<g id="edge2" class="edge">
<title>glycerol&#45;&gt;mix</title>
<path fill="none" stroke="#888888" d="M156,-605.53C156,-597.37 156,-587.72 156,-578.73"/>
<polygon fill="#888888" stroke="#888888" points="159.5,-578.6 156,-568.6 152.5,-578.6 159.5,-578.6"/>
</g>
<!-- dry2 -->
<g id="node4" class="node">
<title>dry2</title>
<polygon fill="#f44336" stroke="black" points="233,-490.6 79,-490.6 79,-438.6 233,-438.6 233,-490.6"/>
<text text-anchor="middle" x="156" y="-478.6" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">DRY COMPLETELY</text>
<text text-anchor="middle" x="156" y="-467.6" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">this step is critical</text>
<text text-anchor="middle" x="156" y="-456.6" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">60°C overnight</text>
<text text-anchor="middle" x="156" y="-445.6" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">grind to breadcrumb texture</text>
</g>
<!-- mix&#45;&gt;dry2 -->
<g id="edge3" class="edge">
<title>mix&#45;&gt;dry2</title>
<path fill="none" stroke="#888888" d="M156,-527.37C156,-519.36 156,-509.86 156,-500.74"/>
<polygon fill="#888888" stroke="#888888" points="159.5,-500.71 156,-490.71 152.5,-500.71 159.5,-500.71"/>
</g>
<!-- mold -->
<g id="node5" class="node">
<title>mold</title>
<polygon fill="#e65100" stroke="black" points="125,-373.3 27,-373.3 27,-332.3 125,-332.3 125,-373.3"/>
<text text-anchor="middle" x="76" y="-361.3" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">fill metal mold</text>
<text text-anchor="middle" x="76" y="-350.3" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">compress lightly</text>
<text text-anchor="middle" x="76" y="-339.3" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">add lid</text>
</g>
<!-- dry2&#45;&gt;mold -->
<g id="edge4" class="edge">
<title>dry2&#45;&gt;mold</title>
<path fill="none" stroke="#888888" d="M137.65,-438.41C125.28,-421.43 108.96,-399.03 96.22,-381.55"/>
<polygon fill="#888888" stroke="#888888" points="99,-379.42 90.28,-373.4 93.34,-383.54 99,-379.42"/>
</g>
<!-- fail1 -->
<g id="node10" class="node">
<title>fail1</title>
<polygon fill="#b71c1c" stroke="black" points="329.25,-336.4 329.25,-369.2 274.63,-392.4 197.37,-392.4 142.75,-369.2 142.75,-336.4 197.37,-313.2 274.63,-313.2 329.25,-336.4"/>
<text text-anchor="middle" x="236" y="-366.8" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">WET = FAIL</text>
<text text-anchor="middle" x="236" y="-355.8" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">steam creates voids</text>
<text text-anchor="middle" x="236" y="-344.8" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">spongy, porous result</text>
<text text-anchor="middle" x="236" y="-333.8" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">must be bone dry</text>
</g>
<!-- dry2&#45;&gt;fail1 -->
<g id="edge9" class="edge">
<title>dry2&#45;&gt;fail1</title>
<path fill="none" stroke="#f44336" stroke-dasharray="5,2" d="M174.35,-438.41C182.45,-427.29 192.24,-413.85 201.62,-400.99"/>
<polygon fill="#f44336" stroke="#f44336" points="204.63,-402.79 207.69,-392.65 198.97,-398.67 204.63,-402.79"/>
<text text-anchor="middle" x="216" y="-413.4" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">if skipped</text>
</g>
<!-- heat -->
<g id="node6" class="node">
<title>heat</title>
<polygon fill="#ff9800" stroke="black" points="135.5,-276 16.5,-276 16.5,-240 135.5,-240 135.5,-276"/>
<text text-anchor="middle" x="76" y="-261" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">heat to 150°C</text>
<text text-anchor="middle" x="76" y="-250" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">in oven or heat press</text>
</g>
<!-- mold&#45;&gt;heat -->
<g id="edge5" class="edge">
<title>mold&#45;&gt;heat</title>
<path fill="none" stroke="#888888" d="M76,-332.12C76,-318.76 76,-300.92 76,-286.21"/>
<polygon fill="#888888" stroke="#888888" points="79.5,-286.16 76,-276.16 72.5,-286.16 79.5,-286.16"/>
</g>
<!-- press -->
<g id="node7" class="node">
<title>press</title>
<polygon fill="#ffc107" stroke="black" points="152,-203 0,-203 0,-151 152,-151 152,-203"/>
<text text-anchor="middle" x="76" y="-191" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1a1a2e">apply maximum pressure</text>
<text text-anchor="middle" x="76" y="-180" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1a1a2e">bench vise, hydraulic press,</text>
<text text-anchor="middle" x="76" y="-169" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1a1a2e">or C&#45;clamps</text>
<text text-anchor="middle" x="76" y="-158" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1a1a2e">hold 10&#45;30 minutes</text>
</g>
<!-- heat&#45;&gt;press -->
<g id="edge6" class="edge">
<title>heat&#45;&gt;press</title>
<path fill="none" stroke="#888888" d="M76,-239.86C76,-232.08 76,-222.57 76,-213.37"/>
<polygon fill="#888888" stroke="#888888" points="79.5,-213.21 76,-203.21 72.5,-213.21 79.5,-213.21"/>
</g>
<!-- cool -->
<g id="node8" class="node">
<title>cool</title>
<polygon fill="#795548" stroke="black" points="131.5,-114 20.5,-114 20.5,-73 131.5,-73 131.5,-114"/>
<text text-anchor="middle" x="76" y="-102" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">release pressure</text>
<text text-anchor="middle" x="76" y="-91" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">cool slowly in mold</text>
<text text-anchor="middle" x="76" y="-80" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">do not rush</text>
</g>
<!-- press&#45;&gt;cool -->
<g id="edge7" class="edge">
<title>press&#45;&gt;cool</title>
<path fill="none" stroke="#888888" d="M76,-150.66C76,-142.29 76,-132.9 76,-124.23"/>
<polygon fill="#888888" stroke="#888888" points="79.5,-124.13 76,-114.13 72.5,-124.13 79.5,-124.13"/>
</g>
<!-- demold -->
<g id="node9" class="node">
<title>demold</title>
<polygon fill="#4e342e" stroke="black" points="128,-36 24,-36 24,0 128,0 128,-36"/>
<text text-anchor="middle" x="76" y="-21" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">remove bioplastic</text>
<text text-anchor="middle" x="76" y="-10" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">from mold</text>
</g>
<!-- cool&#45;&gt;demold -->
<g id="edge8" class="edge">
<title>cool&#45;&gt;demold</title>
<path fill="none" stroke="#888888" d="M76,-72.8C76,-64.7 76,-55.18 76,-46.41"/>
<polygon fill="#888888" stroke="#888888" points="79.5,-46.25 76,-36.25 72.5,-46.25 79.5,-46.25"/>
</g>
<!-- tip -->
<g id="node11" class="node">
<title>tip</title>
<polygon fill="#263238" stroke="black" points="314,-721.6 218,-721.6 218,-683.6 320,-683.6 320,-715.6 314,-721.6"/>
<polyline fill="none" stroke="black" points="314,-721.6 314,-715.6 "/>
<polyline fill="none" stroke="black" points="320,-715.6 314,-715.6 "/>
<text text-anchor="middle" x="269" y="-710.4" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">coat mold interior</text>
<text text-anchor="middle" x="269" y="-700.4" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">with vegetable oil</text>
<text text-anchor="middle" x="269" y="-690.4" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#cddc39">to prevent sticking</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.9 KiB

View file

@ -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=<<B><FONT COLOR="#cccccc" POINT-SIZE="14">retting: how to tell when stalks are ready</FONT></B>>
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]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

View file

@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: retting_test Pages: 1 -->
<svg width="829pt" height="325pt"
viewBox="0.00 0.00 828.79 324.80" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 320.8)">
<title>retting_test</title>
<polygon fill="#1a1a2e" stroke="transparent" points="-4,4 -4,-320.8 824.79,-320.8 824.79,4 -4,4"/>
<text text-anchor="start" x="247.89" y="-302.6" font-family="Times,serif" font-weight="bold" font-size="14.00" fill="#cccccc">retting: how to tell when stalks are ready</text>
<g id="clust1" class="cluster">
<title>cluster_method</title>
<polygon fill="#1a1a2e" stroke="#4caf50" stroke-dasharray="5,2" points="13.89,-8 13.89,-108 344.79,-108 344.79,-8 13.89,-8"/>
<text text-anchor="middle" x="179.34" y="-95.2" font-family="Helvetica Bold" font-size="11.00" fill="#4caf50">DEW RETTING</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_tests</title>
<polygon fill="#1a1a2e" stroke="#cddc39" stroke-dasharray="5,2" points="382.79,-14 382.79,-102 812.79,-102 812.79,-14 382.79,-14"/>
<text text-anchor="middle" x="597.79" y="-89.2" font-family="Helvetica Bold" font-size="11.00" fill="#cddc39">THREE TESTS</text>
</g>
<!-- lay -->
<g id="node1" class="node">
<title>lay</title>
<polygon fill="#2e7d32" stroke="black" points="141.89,-68.5 21.89,-68.5 21.89,-27.5 141.89,-27.5 141.89,-68.5"/>
<text text-anchor="middle" x="81.89" y="-56.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">lay stalks on grass</text>
<text text-anchor="middle" x="81.89" y="-45.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">expose to rain &amp; dew</text>
<text text-anchor="middle" x="81.89" y="-34.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">turn every few days</text>
</g>
<!-- temp -->
<g id="node2" class="node">
<title>temp</title>
<polygon fill="#388e3c" stroke="black" points="336.79,-79.5 200.79,-79.5 200.79,-16.5 336.79,-16.5 336.79,-79.5"/>
<text text-anchor="middle" x="268.79" y="-67.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">duration by temperature</text>
<text text-anchor="middle" x="268.79" y="-56.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">37°C → 3 days</text>
<text text-anchor="middle" x="268.79" y="-45.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">20°C → 7&#45;8 days</text>
<text text-anchor="middle" x="268.79" y="-34.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">12°C → 15&#45;17 days</text>
<text text-anchor="middle" x="268.79" y="-23.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">7°C → 30&#45;45 days</text>
</g>
<!-- lay&#45;&gt;temp -->
<g id="edge1" class="edge">
<title>lay&#45;&gt;temp</title>
<path fill="none" stroke="#888888" d="M141.9,-48C157.4,-48 174.33,-48 190.62,-48"/>
<polygon fill="#888888" stroke="#888888" points="190.66,-51.5 200.66,-48 190.66,-44.5 190.66,-51.5"/>
</g>
<!-- t1 -->
<g id="node3" class="node">
<title>t1</title>
<polygon fill="#827717" stroke="black" points="522.79,-74 390.79,-74 390.79,-22 522.79,-22 522.79,-74"/>
<text text-anchor="middle" x="456.79" y="-62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">BEND TEST</text>
<text text-anchor="middle" x="456.79" y="-51" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">bend stalk back &amp; forth</text>
<text text-anchor="middle" x="456.79" y="-40" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">hurd should crack &amp; fall</text>
<text text-anchor="middle" x="456.79" y="-29" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">fiber should NOT break</text>
</g>
<!-- temp&#45;&gt;t1 -->
<g id="edge2" class="edge">
<title>temp&#45;&gt;t1</title>
<path fill="none" stroke="#888888" d="M336.94,-48C351.01,-48 365.93,-48 380.28,-48"/>
<polygon fill="#888888" stroke="#888888" points="380.6,-51.5 390.6,-48 380.6,-44.5 380.6,-51.5"/>
<text text-anchor="middle" x="363.79" y="-50.8" font-family="Helvetica,sans-Serif" font-size="9.00" fill="#aaaaaa">test</text>
</g>
<!-- t2 -->
<g id="node4" class="node">
<title>t2</title>
<polygon fill="#9e9d24" stroke="black" points="686.79,-74 559.79,-74 559.79,-22 686.79,-22 686.79,-74"/>
<text text-anchor="middle" x="623.29" y="-62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">PEEL TEST</text>
<text text-anchor="middle" x="623.29" y="-51" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">peel fiber at base</text>
<text text-anchor="middle" x="623.29" y="-40" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">should separate easily</text>
<text text-anchor="middle" x="623.29" y="-29" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">for several inches</text>
</g>
<!-- t1&#45;&gt;t2 -->
<!-- t3 -->
<g id="node5" class="node">
<title>t3</title>
<polygon fill="#afb42b" stroke="black" points="804.79,-74 723.79,-74 723.79,-22 804.79,-22 804.79,-74"/>
<text text-anchor="middle" x="764.29" y="-62" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">COLOR TEST</text>
<text text-anchor="middle" x="764.29" y="-51" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">fiber bundles</text>
<text text-anchor="middle" x="764.29" y="-40" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">turning white</text>
<text text-anchor="middle" x="764.29" y="-29" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">means ready</text>
</g>
<!-- t2&#45;&gt;t3 -->
<!-- under -->
<g id="node6" class="node">
<title>under</title>
<polygon fill="#b71c1c" stroke="black" points="163.68,-139.6 163.68,-172.4 115.77,-195.6 48.02,-195.6 0.11,-172.4 0.11,-139.6 48.02,-116.4 115.77,-116.4 163.68,-139.6"/>
<text text-anchor="middle" x="81.89" y="-170" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">UNDER&#45;RETTED</text>
<text text-anchor="middle" x="81.89" y="-159" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">fiber sticks to hurd</text>
<text text-anchor="middle" x="81.89" y="-148" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">hard to separate</text>
<text text-anchor="middle" x="81.89" y="-137" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">→ keep retting</text>
</g>
<!-- over -->
<g id="node7" class="node">
<title>over</title>
<polygon fill="#b71c1c" stroke="black" points="163.68,-237.6 163.68,-270.4 115.77,-293.6 48.02,-293.6 0.11,-270.4 0.11,-237.6 48.02,-214.4 115.77,-214.4 163.68,-237.6"/>
<text text-anchor="middle" x="81.89" y="-268" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">OVER&#45;RETTED</text>
<text text-anchor="middle" x="81.89" y="-257" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">fiber breaks easily</text>
<text text-anchor="middle" x="81.89" y="-246" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">weak &amp; mushy</text>
<text text-anchor="middle" x="81.89" y="-235" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">→ start over</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.2 KiB

View file

@ -0,0 +1,45 @@
digraph three_approaches {
bgcolor="#1a1a2e"
rankdir=TB
node [fontname="Helvetica" fontsize=10 style=filled shape=box]
edge [style=invis]
label=<<B><FONT COLOR="#cccccc" POINT-SIZE="14">three approaches to hemp bioplastic</FONT></B>>
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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

View file

@ -0,0 +1,150 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: three_approaches Pages: 1 -->
<svg width="602pt" height="506pt"
viewBox="0.00 0.00 602.00 506.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 502)">
<title>three_approaches</title>
<polygon fill="#1a1a2e" stroke="transparent" points="-4,4 -4,-502 598,-502 598,4 -4,4"/>
<text text-anchor="start" x="153" y="-483.8" font-family="Times,serif" font-weight="bold" font-size="14.00" fill="#cccccc">three approaches to hemp bioplastic</text>
<g id="clust1" class="cluster">
<title>cluster_a</title>
<polygon fill="#1a1a2e" stroke="#2196f3" stroke-dasharray="5,2" points="8,-8 8,-467 182,-467 182,-8 8,-8"/>
<text text-anchor="middle" x="95" y="-454.2" font-family="Helvetica Bold" font-size="11.00" fill="#2196f3">A: CELLULOSE EXTRACTION</text>
<text text-anchor="middle" x="95" y="-442.2" font-family="Helvetica Bold" font-size="11.00" fill="#2196f3">(most documented)</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_b</title>
<polygon fill="#1a1a2e" stroke="#4caf50" stroke-dasharray="5,2" points="190,-85 190,-467 391,-467 391,-85 190,-85"/>
<text text-anchor="middle" x="290.5" y="-454.2" font-family="Helvetica Bold" font-size="11.00" fill="#4caf50">B: FIBER + BIORESIN COMPOSITE</text>
<text text-anchor="middle" x="290.5" y="-442.2" font-family="Helvetica Bold" font-size="11.00" fill="#4caf50">(Robert Murray&#45;Smith)</text>
</g>
<g id="clust3" class="cluster">
<title>cluster_c</title>
<polygon fill="#1a1a2e" stroke="#ff9800" stroke-dasharray="5,2" points="399,-162 399,-467 586,-467 586,-162 399,-162"/>
<text text-anchor="middle" x="492.5" y="-454.2" font-family="Helvetica Bold" font-size="11.00" fill="#ff9800">C: CITRIC ACID CROSSLINKING</text>
<text text-anchor="middle" x="492.5" y="-442.2" font-family="Helvetica Bold" font-size="11.00" fill="#ff9800">(Beluns et al. 2023)</text>
</g>
<!-- a1 -->
<g id="node1" class="node">
<title>a1</title>
<polygon fill="#1565c0" stroke="black" points="160.5,-427 29.5,-427 29.5,-391 160.5,-391 160.5,-427"/>
<text text-anchor="middle" x="95" y="-406.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">ret &amp; decorticate stalks</text>
</g>
<!-- a2 -->
<g id="node2" class="node">
<title>a2</title>
<polygon fill="#1976d2" stroke="black" points="173,-355 17,-355 17,-319 173,-319 173,-355"/>
<text text-anchor="middle" x="95" y="-334.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">NaOH bath to dissolve lignin</text>
</g>
<!-- a1&#45;&gt;a2 -->
<!-- a3 -->
<g id="node3" class="node">
<title>a3</title>
<polygon fill="#1e88e5" stroke="black" points="163.5,-283 26.5,-283 26.5,-247 163.5,-247 163.5,-283"/>
<text text-anchor="middle" x="95" y="-262.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">bleach &amp; purify cellulose</text>
</g>
<!-- a2&#45;&gt;a3 -->
<!-- a4 -->
<g id="node4" class="node">
<title>a4</title>
<polygon fill="#42a5f5" stroke="black" points="145.5,-208.5 44.5,-208.5 44.5,-172.5 145.5,-172.5 145.5,-208.5"/>
<text text-anchor="middle" x="95" y="-188" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">mix with glycerol</text>
</g>
<!-- a3&#45;&gt;a4 -->
<!-- a5 -->
<g id="node5" class="node">
<title>a5</title>
<polygon fill="#64b5f6" stroke="black" points="148.5,-131.5 41.5,-131.5 41.5,-95.5 148.5,-95.5 148.5,-131.5"/>
<text text-anchor="middle" x="95" y="-111" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#1a1a2e">hot press at 150°C</text>
</g>
<!-- a4&#45;&gt;a5 -->
<!-- a_note -->
<g id="node6" class="node">
<title>a_note</title>
<polygon fill="#263238" stroke="black" points="136,-57 48,-57 48,-16 142,-16 142,-51 136,-57"/>
<polyline fill="none" stroke="black" points="136,-57 136,-51 "/>
<polyline fill="none" stroke="black" points="142,-51 136,-51 "/>
<text text-anchor="middle" x="95" y="-45" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2196f3">highest quality</text>
<text text-anchor="middle" x="95" y="-34" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2196f3">most chemistry</text>
<text text-anchor="middle" x="95" y="-23" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#2196f3">2&#45;3 day process</text>
</g>
<!-- a5&#45;&gt;a_note -->
<!-- b1 -->
<g id="node7" class="node">
<title>b1</title>
<polygon fill="#2e7d32" stroke="black" points="356,-427 224,-427 224,-391 356,-391 356,-427"/>
<text text-anchor="middle" x="290" y="-406.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">prepare hemp fiber mat</text>
</g>
<!-- b2 -->
<g id="node8" class="node">
<title>b2</title>
<polygon fill="#388e3c" stroke="black" points="354,-355 226,-355 226,-319 354,-319 354,-355"/>
<text text-anchor="middle" x="290" y="-340" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">make bioresin:</text>
<text text-anchor="middle" x="290" y="-329" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">seaweed + corn starch</text>
</g>
<!-- b1&#45;&gt;b2 -->
<!-- b3 -->
<g id="node9" class="node">
<title>b3</title>
<polygon fill="#43a047" stroke="black" points="364.5,-283 215.5,-283 215.5,-247 364.5,-247 364.5,-283"/>
<text text-anchor="middle" x="290" y="-262.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">impregnate fiber with resin</text>
</g>
<!-- b2&#45;&gt;b3 -->
<!-- b4 -->
<g id="node10" class="node">
<title>b4</title>
<polygon fill="#66bb6a" stroke="black" points="340,-208.5 240,-208.5 240,-172.5 340,-172.5 340,-208.5"/>
<text text-anchor="middle" x="290" y="-188" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">dry at 150&#45;200°C</text>
</g>
<!-- b3&#45;&gt;b4 -->
<!-- b_note -->
<g id="node11" class="node">
<title>b_note</title>
<polygon fill="#263238" stroke="black" points="343.5,-134 230.5,-134 230.5,-93 349.5,-93 349.5,-128 343.5,-134"/>
<polyline fill="none" stroke="black" points="343.5,-134 343.5,-128 "/>
<polyline fill="none" stroke="black" points="349.5,-128 343.5,-128 "/>
<text text-anchor="middle" x="290" y="-122" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">simpler chemistry</text>
<text text-anchor="middle" x="290" y="-111" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">composite (not pure)</text>
<text text-anchor="middle" x="290" y="-100" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">1 day process</text>
</g>
<!-- b4&#45;&gt;b_note -->
<!-- c1 -->
<g id="node12" class="node">
<title>c1</title>
<polygon fill="#e65100" stroke="black" points="546.5,-427 437.5,-427 437.5,-391 546.5,-391 546.5,-427"/>
<text text-anchor="middle" x="492" y="-412" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">make hemp paper</text>
<text text-anchor="middle" x="492" y="-401" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">from chopped fiber</text>
</g>
<!-- c2 -->
<g id="node13" class="node">
<title>c2</title>
<polygon fill="#f57c00" stroke="black" points="545,-355 439,-355 439,-319 545,-319 545,-355"/>
<text text-anchor="middle" x="492" y="-340" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">soak in glycerol +</text>
<text text-anchor="middle" x="492" y="-329" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">citric acid solution</text>
</g>
<!-- c1&#45;&gt;c2 -->
<!-- c3 -->
<g id="node14" class="node">
<title>c3</title>
<polygon fill="#ff9800" stroke="black" points="533.5,-283 450.5,-283 450.5,-247 533.5,-247 533.5,-283"/>
<text text-anchor="middle" x="492" y="-268" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">cure at 140°C</text>
<text text-anchor="middle" x="492" y="-257" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">under weight</text>
</g>
<!-- c2&#45;&gt;c3 -->
<!-- c_note -->
<g id="node15" class="node">
<title>c_note</title>
<polygon fill="#263238" stroke="black" points="547.5,-211 430.5,-211 430.5,-170 553.5,-170 553.5,-205 547.5,-211"/>
<polyline fill="none" stroke="black" points="547.5,-211 547.5,-205 "/>
<polyline fill="none" stroke="black" points="553.5,-205 547.5,-205 "/>
<text text-anchor="middle" x="492" y="-199" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#ff9800">no NaOH needed</text>
<text text-anchor="middle" x="492" y="-188" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#ff9800">safest approach</text>
<text text-anchor="middle" x="492" y="-177" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#ff9800">up to 70 MPa strength</text>
</g>
<!-- c3&#45;&gt;c_note -->
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.6 KiB

View file

@ -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=<<B><FONT COLOR="#cccccc" POINT-SIZE="14">what goes wrong &amp; how to fix it</FONT></B>>
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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

View file

@ -0,0 +1,155 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 2.43.0 (0)
-->
<!-- Title: troubleshooting Pages: 1 -->
<svg width="994pt" height="198pt"
viewBox="0.00 0.00 994.00 198.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 194)">
<title>troubleshooting</title>
<polygon fill="#1a1a2e" stroke="transparent" points="-4,4 -4,-194 990,-194 990,4 -4,4"/>
<text text-anchor="start" x="370" y="-175.8" font-family="Times,serif" font-weight="bold" font-size="14.00" fill="#cccccc">what goes wrong &amp; how to fix it</text>
<g id="clust1" class="cluster">
<title>cluster_problems</title>
<polygon fill="#1a1a2e" stroke="transparent" points="8,-8 8,-159 978,-159 978,-8 8,-8"/>
</g>
<!-- p1 -->
<g id="node1" class="node">
<title>p1</title>
<polygon fill="#b71c1c" stroke="black" points="946.5,-151 863.5,-151 863.5,-115 946.5,-115 946.5,-151"/>
<text text-anchor="middle" x="905" y="-136" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">CRUMBLES</text>
<text text-anchor="middle" x="905" y="-125" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">after pressing</text>
</g>
<!-- f1 -->
<g id="node2" class="node">
<title>f1</title>
<polygon fill="#263238" stroke="black" points="969.5,-79 840.5,-79 840.5,-16 969.5,-16 969.5,-79"/>
<text text-anchor="middle" x="905" y="-67" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">too dry, low pressure,</text>
<text text-anchor="middle" x="905" y="-56" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">or temperature too low</text>
<text text-anchor="middle" x="905" y="-45" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">→ add glycerol (15%+)</text>
<text text-anchor="middle" x="905" y="-34" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">→ increase pressure</text>
<text text-anchor="middle" x="905" y="-23" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">→ verify 140&#45;150°C</text>
</g>
<!-- p1&#45;&gt;f1 -->
<g id="edge1" class="edge">
<title>p1&#45;&gt;f1</title>
<path fill="none" stroke="#888888" d="M905,-114.7C905,-107.27 905,-98.25 905,-89.29"/>
<polygon fill="#888888" stroke="#888888" points="908.5,-89.28 905,-79.28 901.5,-89.28 908.5,-89.28"/>
</g>
<!-- p2 -->
<g id="node3" class="node">
<title>p2</title>
<polygon fill="#b71c1c" stroke="black" points="798,-151 710,-151 710,-115 798,-115 798,-151"/>
<text text-anchor="middle" x="754" y="-136" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">SPONGY</text>
<text text-anchor="middle" x="754" y="-125" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">porous texture</text>
</g>
<!-- f2 -->
<g id="node4" class="node">
<title>f2</title>
<polygon fill="#263238" stroke="black" points="822,-79 686,-79 686,-16 822,-16 822,-79"/>
<text text-anchor="middle" x="754" y="-67" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">moisture remained</text>
<text text-anchor="middle" x="754" y="-56" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">steam created voids</text>
<text text-anchor="middle" x="754" y="-45" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">→ dry overnight at 60°C</text>
<text text-anchor="middle" x="754" y="-34" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">→ verify weight is stable</text>
<text text-anchor="middle" x="754" y="-23" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">before pressing</text>
</g>
<!-- p2&#45;&gt;f2 -->
<g id="edge2" class="edge">
<title>p2&#45;&gt;f2</title>
<path fill="none" stroke="#888888" d="M754,-114.7C754,-107.27 754,-98.25 754,-89.29"/>
<polygon fill="#888888" stroke="#888888" points="757.5,-89.28 754,-79.28 750.5,-89.28 757.5,-89.28"/>
</g>
<!-- p3 -->
<g id="node5" class="node">
<title>p3</title>
<polygon fill="#b71c1c" stroke="black" points="635,-151 543,-151 543,-115 635,-115 635,-151"/>
<text text-anchor="middle" x="589" y="-136" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">BROWN</text>
<text text-anchor="middle" x="589" y="-125" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">after extraction</text>
</g>
<!-- f3 -->
<g id="node6" class="node">
<title>f3</title>
<polygon fill="#263238" stroke="black" points="668,-79 510,-79 510,-16 668,-16 668,-79"/>
<text text-anchor="middle" x="589" y="-67" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">lignin remains</text>
<text text-anchor="middle" x="589" y="-56" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">insufficient delignification</text>
<text text-anchor="middle" x="589" y="-45" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">→ repeat NaOH bath</text>
<text text-anchor="middle" x="589" y="-34" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">→ add bleaching step</text>
<text text-anchor="middle" x="589" y="-23" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">→ check NaOH concentration</text>
</g>
<!-- p3&#45;&gt;f3 -->
<g id="edge3" class="edge">
<title>p3&#45;&gt;f3</title>
<path fill="none" stroke="#888888" d="M589,-114.7C589,-107.27 589,-98.25 589,-89.29"/>
<polygon fill="#888888" stroke="#888888" points="592.5,-89.28 589,-79.28 585.5,-89.28 592.5,-89.28"/>
</g>
<!-- p4 -->
<g id="node7" class="node">
<title>p4</title>
<polygon fill="#b71c1c" stroke="black" points="458,-151 388,-151 388,-115 458,-115 458,-151"/>
<text text-anchor="middle" x="423" y="-136" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">DISSOLVES</text>
<text text-anchor="middle" x="423" y="-125" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">in water</text>
</g>
<!-- f4 -->
<g id="node8" class="node">
<title>f4</title>
<polygon fill="#263238" stroke="black" points="491.5,-79 354.5,-79 354.5,-16 491.5,-16 491.5,-79"/>
<text text-anchor="middle" x="423" y="-67" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">no crosslinking</text>
<text text-anchor="middle" x="423" y="-56" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">glycerol is water&#45;soluble</text>
<text text-anchor="middle" x="423" y="-45" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">→ add citric acid (5%)</text>
<text text-anchor="middle" x="423" y="-34" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">→ cure at 140°C</text>
<text text-anchor="middle" x="423" y="-23" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">→ or reduce glycerol</text>
</g>
<!-- p4&#45;&gt;f4 -->
<g id="edge4" class="edge">
<title>p4&#45;&gt;f4</title>
<path fill="none" stroke="#888888" d="M423,-114.7C423,-107.27 423,-98.25 423,-89.29"/>
<polygon fill="#888888" stroke="#888888" points="426.5,-89.28 423,-79.28 419.5,-89.28 426.5,-89.28"/>
</g>
<!-- p5 -->
<g id="node9" class="node">
<title>p5</title>
<polygon fill="#b71c1c" stroke="black" points="308,-151 200,-151 200,-115 308,-115 308,-151"/>
<text text-anchor="middle" x="254" y="-136" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">BRITTLE</text>
<text text-anchor="middle" x="254" y="-125" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">shatters on impact</text>
</g>
<!-- f5 -->
<g id="node10" class="node">
<title>f5</title>
<polygon fill="#263238" stroke="black" points="336,-73.5 172,-73.5 172,-21.5 336,-21.5 336,-73.5"/>
<text text-anchor="middle" x="254" y="-61.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">too little plasticizer</text>
<text text-anchor="middle" x="254" y="-50.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">or cellulose degraded</text>
<text text-anchor="middle" x="254" y="-39.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">→ increase glycerol to 25&#45;30%</text>
<text text-anchor="middle" x="254" y="-28.5" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">→ use gentler NaOH (&lt;7.5%)</text>
</g>
<!-- p5&#45;&gt;f5 -->
<g id="edge5" class="edge">
<title>p5&#45;&gt;f5</title>
<path fill="none" stroke="#888888" d="M254,-114.7C254,-105.81 254,-94.65 254,-84.03"/>
<polygon fill="#888888" stroke="#888888" points="257.5,-83.7 254,-73.7 250.5,-83.7 257.5,-83.7"/>
</g>
<!-- p6 -->
<g id="node11" class="node">
<title>p6</title>
<polygon fill="#b71c1c" stroke="black" points="135.5,-151 34.5,-151 34.5,-115 135.5,-115 135.5,-151"/>
<text text-anchor="middle" x="85" y="-136" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">LOW YIELD</text>
<text text-anchor="middle" x="85" y="-125" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">(&lt;20% cellulose)</text>
</g>
<!-- f6 -->
<g id="node12" class="node">
<title>f6</title>
<polygon fill="#263238" stroke="black" points="154,-79 16,-79 16,-16 154,-16 154,-79"/>
<text text-anchor="middle" x="85" y="-67" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">NaOH too concentrated</text>
<text text-anchor="middle" x="85" y="-56" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">or temperature too high</text>
<text text-anchor="middle" x="85" y="-45" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">→ use 5% NaOH protocol</text>
<text text-anchor="middle" x="85" y="-34" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">→ stay under 80°C</text>
<text text-anchor="middle" x="85" y="-23" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#4caf50">→ use bast fiber not hurd</text>
</g>
<!-- p6&#45;&gt;f6 -->
<g id="edge6" class="edge">
<title>p6&#45;&gt;f6</title>
<path fill="none" stroke="#888888" d="M85,-114.7C85,-107.27 85,-98.25 85,-89.29"/>
<polygon fill="#888888" stroke="#888888" points="88.5,-89.28 85,-79.28 81.5,-89.28 88.5,-89.28"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.9 KiB

View file

@ -0,0 +1,472 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>hemp bioplastic process &#8212; unturf.</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#5871ad">
<meta charset="utf-8">
<link rel="stylesheet" href="/css/chunkfive/stylesheet.css" type="text/css" charset="utf-8" />
<link rel="stylesheet" href="/css/pico.classless.min.css">
<link rel="stylesheet" href="/css/unturf.css">
</head>
<body>
<main class="content-wide">
<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="/let-us-define-a-permacomputer/">manifesto</a> · <a href="/eight-forms-of-capital/">eight forms of capital</a> · <a href="/single-use-plastics/">single-use plastics</a> · <a href="/hemp-bioplastic/">hemp bioplastic</a> · <a href="/hemp-bioplastic/process/" aria-current="page">recipe</a> · <a href="/software/">free software</a></small></center>
<h2>Hemp Bioplastic: Process</h2>
<p>
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.
</p>
<p>
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.
</p>
<!-- ============================================================ -->
<!-- PLANT ANATOMY -->
<!-- ============================================================ -->
<span class="step-label">STEP 1</span>
<h3>Which Parts of Hemp We Harvest</h3>
<p>
Hemp bioplastic comes from <b>stalks only</b> — specifically bast fiber, the outer bark layer of the main stem. Not leaves. Not seeds. Not roots. Each part serves a different purpose.
</p>
<figure class="diagram">
<img src="img/plant-anatomy.svg" alt="Hemp plant anatomy: which parts we use for bioplastic">
<figcaption>bioplastic comes from stalk bast fiber. everything else serves other purposes.</figcaption>
</figure>
<table>
<thead>
<tr><th>Plant Part</th><th>Use for Bioplastic?</th><th>What It Does Instead</th></tr>
</thead>
<tbody>
<tr><td><b>Stalk — bast fiber</b></td><td>Yes — primary source</td><td>77% cellulose, highest quality</td></tr>
<tr><td><b>Stalk — hurd (core)</b></td><td>Yes — lower grade</td><td>44% cellulose, or use for hempcrete, animal bedding, garden mulch</td></tr>
<tr><td>Leaves</td><td>No</td><td>Compost, mulch, animal feed</td></tr>
<tr><td>Seeds</td><td>No</td><td>Food (hemp hearts), oil, or save for next crop</td></tr>
<tr><td>Roots</td><td>No</td><td>Stay in ground — improve soil structure, break compaction, add organic matter</td></tr>
<tr><td>Flowers</td><td>No</td><td>Fiber varieties produce minimal flower; if present, compost or dry</td></tr>
</tbody>
</table>
<p>
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.
</p>
<!-- ============================================================ -->
<!-- THREE APPROACHES -->
<!-- ============================================================ -->
<span class="step-label">STEP 2</span>
<h3>Three Approaches</h3>
<p>
No single canonical recipe exists. Research reveals three distinct paths, each with different tradeoffs between chemistry complexity & material quality.<sup id="ref1"><a href="#fn1">[1]</a></sup>
</p>
<figure class="diagram">
<img src="img/three-approaches.svg" alt="Three approaches: cellulose extraction, fiber composite, citric acid crosslinking">
<figcaption>pick your path based on equipment, chemistry comfort, & desired result.</figcaption>
</figure>
<table>
<thead>
<tr><th>Approach</th><th>Chemistry</th><th>Time</th><th>Strength</th><th>Best For</th></tr>
</thead>
<tbody>
<tr><td>A: Cellulose extraction</td><td>NaOH + acid + bleach</td><td>2-3 days</td><td>2-7 MPa</td><td>Pure bioplastic objects</td></tr>
<tr><td>B: Fiber + bioresin</td><td>Seaweed + starch (no NaOH)</td><td>1 day</td><td>Moderate</td><td>Panels, flat sheets</td></tr>
<tr><td>C: Citric acid crosslink</td><td>Citric acid + glycerol (no NaOH)</td><td>1 day</td><td>Up to 70 MPa</td><td>Strongest result, safest chemistry</td></tr>
</tbody>
</table>
<div class="recipe-box">
<b>Recommendation for first attempt:</b> Approach C (citric acid crosslinking) avoids all NaOH, all acid work, & all bleaching while producing material up to 70 MPa tensile strength.<sup id="ref5"><a href="#fn5">[5]</a></sup> If you want to understand full cellulose extraction, try Approach A on a second batch.
</div>
<!-- ============================================================ -->
<!-- EQUIPMENT -->
<!-- ============================================================ -->
<span class="step-label">STEP 3</span>
<h3>Equipment</h3>
<figure class="diagram">
<img src="img/equipment.svg" alt="Equipment needed for a 50g test batch">
<figcaption>total equipment cost: $500-2,000 for basic workshop setup.</figcaption>
</figure>
<h4>Chemistry (Approach A only)</h4>
<ul>
<li>Stainless steel pot, 2-5 liter — <b>NOT aluminum</b> (reacts with NaOH)</li>
<li>Hot plate capable of 80-100°C</li>
<li>Digital thermometer, 0-200°C range</li>
<li>pH strips, range 1-14</li>
<li>Vacuum filtration: Buchner funnel + vacuum flask + water aspirator</li>
<li>Kitchen scale, 0.1g precision</li>
<li>Mortar & pestle or coffee grinder for fiber size reduction</li>
<li>Metal sieve, 1.5mm mesh</li>
<li>Multiple large buckets for washing</li>
</ul>
<h4>Pressing (all approaches)</h4>
<ul>
<li>Metal mold — aluminum soap mold works for test batches</li>
<li>Oven capable of 140-200°C, or a rosin press ($200-500)</li>
<li>Bench vise, hydraulic press, or heavy C-clamps for pressure</li>
<li>Heat-resistant gloves rated 200°C+</li>
</ul>
<h4>Safety (non-negotiable)</h4>
<ul>
<li>Chemical splash goggles — not just safety glasses</li>
<li>Nitrile gloves, elbow length</li>
<li>Ventilated workspace — fume hood or work outdoors</li>
<li>Bottle of 2% vinegar nearby for NaOH spill neutralization</li>
<li>Running water within arm's reach</li>
</ul>
<!-- ============================================================ -->
<!-- RETTING -->
<!-- ============================================================ -->
<span class="step-label">STEP 4</span>
<h3>Retting (Preparing Stalks)</h3>
<p>
Before separating fiber from stalk, retting partially breaks down the pectin that binds bast fiber to hurd. Skip this & decortication becomes very difficult.<sup id="ref12"><a href="#fn12">[12]</a></sup>
</p>
<figure class="diagram">
<img src="img/retting-test.svg" alt="Retting process and three tests to check readiness">
<figcaption>dew retting takes 3-45 days depending on temperature. three tests confirm readiness.</figcaption>
</figure>
<h4>Dew Retting (simplest)</h4>
<ol>
<li>Lay harvested stalks on grass, exposed to rain & dew</li>
<li>Turn stalks every few days for even breakdown</li>
<li>Maintain ~30% moisture — sprinkle with water if dry</li>
<li>Duration depends on temperature:
<ul>
<li>37°C → 3 days</li>
<li>20°C → 7-8 days</li>
<li>12°C → 15-17 days</li>
<li>7°C → 30-45 days</li>
<li>Below 5°C → retting stops</li>
</ul>
</li>
</ol>
<h4>Water Retting (faster)</h4>
<ol>
<li>Submerge stalks in warm water for ~10 days</li>
<li>Change water periodically — it will smell</li>
<li>Bacteria in water accelerate pectin breakdown</li>
</ol>
<h4>Three Tests for Readiness</h4>
<div class="recipe-box">
<b>Bend test:</b> Bend dried stalks back & forth. Hurd should crack & fall free. Fiber should NOT break when shaken.<br><br>
<b>Peel test:</b> Peel fiber at base of stem. Should separate easily for several inches. If fiber breaks after a few inches, retting needs more time.<br><br>
<b>Color test:</b> Fiber bundles turning white signals readiness.
</div>
<div class="warning-box">
<b>Over-retting weakens fiber.</b> 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.
</div>
<!-- ============================================================ -->
<!-- DECORTICATION -->
<!-- ============================================================ -->
<span class="step-label">STEP 5</span>
<h3>Decortication (Separating Fiber)</h3>
<p>
After retting, separate bast fiber from hurd by hand.<sup id="ref9"><a href="#fn9">[9]</a></sup> Target: 95% clean bast fiber with 5% or less hurd contamination.
</p>
<ol>
<li><b>Break:</b> Bend & snap dried retted stalks repeatedly. Woody hurd should crack & fall away from flexible bast fiber.</li>
<li><b>Shake:</b> Shake vigorously to dislodge hurd fragments.</li>
<li><b>Scutch:</b> Beat fibers against a hard surface to remove remaining hurd.</li>
<li><b>Hackle:</b> Pull fibers through coarse wire brushes or metal combs to remove short fibers & debris.</li>
</ol>
<p>
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.
</p>
<!-- ============================================================ -->
<!-- APPROACH A: CELLULOSE EXTRACTION -->
<!-- ============================================================ -->
<span class="step-label">STEP 6</span>
<h3>Approach A: Cellulose Extraction</h3>
<p>
Full chemical extraction produces the purest cellulose. Three protocols exist — start with Protocol 2 (gentlest) for a first attempt.<sup id="ref1b"><a href="#fn1">[1]</a></sup>
</p>
<figure class="diagram">
<img src="img/cellulose-extraction.svg" alt="Cellulose extraction process: prepare, alkali treat, bleach, purify">
<figcaption>50g hemp powder yields ~25g pure cellulose through 4 stages.</figcaption>
</figure>
<h4>Size Reduction</h4>
<ol>
<li>Dry separated bast fibers at 50°C until constant weight</li>
<li>Cut to 2-3 cm lengths</li>
<li>Grind using blender, coffee grinder, or mortar & pestle</li>
<li>Pass through 1.5mm metal sieve</li>
<li>Weigh 50g of powder (test batch)</li>
</ol>
<h4>Protocol 1: Full Extraction (highest purity)</h4>
<div class="recipe-box">
<b>Alkali treatment:</b><sup id="ref2"><a href="#fn2">[2]</a></sup><br>
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.<br><br>
<b>Bleaching (optional but recommended):</b><sup id="ref3"><a href="#fn3">[3]</a></sup><br>
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.<br><br>
<b>Hemicellulose removal:</b><br>
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.
</div>
<h4>Protocol 2: Gentle Extraction (best for beginners)</h4>
<div class="recipe-box">
<b>Alkali treatment:</b><sup id="ref6"><a href="#fn6">[6]</a></sup><br>
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.<br><br>
This protocol found 5% NaOH for 1 hour nearly as effective as 4 hours. Start with 1 hour, check results, extend if needed.
</div>
<div class="warning-box">
<b>NaOH safety.</b> 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.
</div>
<!-- ============================================================ -->
<!-- APPROACH B: BIORESIN COMPOSITE -->
<!-- ============================================================ -->
<span class="step-label">STEP 7</span>
<h3>Approach B: Fiber + Bioresin Composite</h3>
<p>
Robert Murray-Smith's method skips all chemical extraction.<sup id="ref4"><a href="#fn4">[4]</a></sup> Instead, hemp fiber acts as reinforcement inside a bioresin matrix made from seaweed & corn starch.
</p>
<div class="recipe-box">
<b>Bioresin recipe:</b><br>
25g dried seaweed (carrageenan or agar) + 50g corn starch + 1 liter water. Heat & stir until dissolved into a viscous liquid.<br><br>
<b>Process:</b><br>
1. Prepare a hemp fiber mat (loose fiber spread into a flat layer)<br>
2. Pour bioresin over fiber mat<br>
3. Roll with a roller until resin penetrates fully through the mat<br>
4. Dry in oven at 150-200°C for 20 minutes<br>
5. Result: a rigid composite panel<br><br>
<b>Variant:</b> 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."
</div>
<p>
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.
</p>
<!-- ============================================================ -->
<!-- APPROACH C: CITRIC ACID CROSSLINKING -->
<!-- ============================================================ -->
<span class="step-label">STEP 8</span>
<h3>Approach C: Citric Acid Crosslinking</h3>
<p>
Developed by Beluns et al. at Riga Technical University (2023).<sup id="ref5b"><a href="#fn5">[5]</a></sup> No NaOH. No acid baths. No bleach. Produces material up to 70 MPa tensile strength — comparable to commodity petroleum plastics. The safest & strongest approach.
</p>
<div class="recipe-box">
<b>Process:</b><br>
1. Chop hemp stalks (bast + hurd together works) & soak in water<br>
2. Spread fibers on a screen, press flat, dry — making a rough hemp paper<br>
3. Prepare impregnation solution: 2g glycerol + 1g citric acid + small amount of PEG (polyethylene glycol), dissolved in minimal water<br>
4. Soak hemp paper in solution until saturated<br>
5. Place on a metal sheet, cover with another sheet<br>
6. Cure at 140°C in oven for 30-60 minutes under weight (a brick or cast iron pan on top)<br>
7. Wash in water for 24-48 hours to remove unreacted material<br>
8. Dry at room temperature
</div>
<p>
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.
</p>
<!-- ============================================================ -->
<!-- MIXING & PRESSING -->
<!-- ============================================================ -->
<span class="step-label">STEP 9</span>
<h3>Mixing & Hot Pressing (Approach A)</h3>
<p>
After extracting cellulose via Approach A, mix with plasticizer & press into shapes.
</p>
<figure class="diagram">
<img src="img/pressing.svg" alt="Mixing cellulose with glycerol and hot pressing into molds">
<figcaption>the material MUST be completely dry before pressing. this is the most common failure point.</figcaption>
</figure>
<div class="recipe-box">
<b>Mixing:</b><br>
1. Weigh dried cellulose<br>
2. Add glycerol: 15% by weight for rigid, 30% for flexible<br>
3. Add water to make a workable slurry<br>
4. Stir at 80°C for 60 minutes until homogeneous<br>
5. Optional: add 5% citric acid by weight for water resistance<br><br>
<b>Drying (critical):</b><br>
6. Spread mixture on a tray<br>
7. Dry at 60°C overnight — or until weight stabilizes<br>
8. Grind to a breadcrumb/sawdust consistency<br><br>
<b>Pressing:</b><sup id="ref11"><a href="#fn11">[11]</a></sup><br>
9. Coat mold interior with thin layer of vegetable oil<br>
10. Fill mold with dry material, compress lightly by hand, add lid<br>
11. Heat to 150°C (oven or heat press)<br>
12. Once at temperature, apply maximum pressure — bench vise, hydraulic press, or C-clamps<br>
13. Hold at temperature & pressure for 10-30 minutes (30 min gave best strength in testing)<br>
14. Release pressure<br>
15. Cool slowly in mold — do not rush, rapid cooling causes cracking<br>
16. Demold
</div>
<div class="warning-box">
<b>If material stays wet when pressed:</b> 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."<sup id="ref4b"><a href="#fn4">[4]</a></sup> Dry overnight. Verify weight has stopped changing. Then press.
</div>
<!-- ============================================================ -->
<!-- TROUBLESHOOTING -->
<!-- ============================================================ -->
<span class="step-label">STEP 10</span>
<h3>Troubleshooting</h3>
<figure class="diagram">
<img src="img/troubleshooting.svg" alt="Common problems and solutions">
<figcaption>every failure teaches something. expect the first batch to teach more than it produces.</figcaption>
</figure>
<h4>Quality Indicators</h4>
<table>
<thead>
<tr><th>Check</th><th>Good</th><th>Bad</th></tr>
</thead>
<tbody>
<tr><td>Color after extraction</td><td>White to off-white</td><td>Brown/yellow (lignin remains)</td></tr>
<tr><td>Texture when dry</td><td>Fibrous, fluffy, crumbly</td><td>Stiff hard chunks (hurd contamination)</td></tr>
<tr><td>Weight loss from original</td><td>40-50% for bast (normal)</td><td>&gt;70% (over-treated) or &lt;30% (under-treated)</td></tr>
<tr><td>Surface after pressing</td><td>Smooth, glossy</td><td>Rough, porous, bubbled (wet)</td></tr>
<tr><td>Sound when tapped</td><td>Solid "click"</td><td>Hollow "thud" (voids inside)</td></tr>
<tr><td>Water drop test</td><td>Water beads or absorbs slowly</td><td>Instantly absorbs & softens (needs crosslinking)</td></tr>
</tbody>
</table>
<!-- ============================================================ -->
<!-- SCALING -->
<!-- ============================================================ -->
<span class="step-label">STEP 11</span>
<h3>Scaling Up</h3>
<table>
<thead>
<tr><th>Scale</th><th>Input</th><th>Yield</th><th>Time</th><th>Notes</th></tr>
</thead>
<tbody>
<tr><td>Test batch</td><td>50g bast fiber</td><td>~25g cellulose</td><td>2-3 days</td><td>One soap-mold-sized object. $5-10 in chemicals.</td></tr>
<tr><td>Useful batch</td><td>2 kg bast fiber</td><td>~1 kg cellulose</td><td>3-5 days</td><td>10-20 liter reaction vessel needed. ~100+ liters wash water.</td></tr>
<tr><td>Community batch</td><td>20 kg bast fiber</td><td>~10 kg cellulose</td><td>5-7 days</td><td>Needs mechanical stirring, larger press, waste handling plan.</td></tr>
</tbody>
</table>
<div class="warning-box">
<b>Scaling NaOH:</b> 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.
</div>
<p>
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.
</p>
<hr>
<h3>Honest Summary</h3>
<p>
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.
</p>
<p>
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.
</p>
<hr>
<h3>Sources</h3>
<div class="footnotes">
<ol>
<li id="fn1">Chalannavar et al. (2025), "Industrial Cannabis sativa: Hemp Cellulose Based Bioplastic Production," <a href="https://magnascientiapub.com/journals/msabp/sites/default/files/MSABP-2025-0067.pdf" target="_blank">Magna Scientia</a>. Comprehensive review reproducing Liao protocol with 50g/12% NaOH/1:15 ratio/80°C/3h parameters. <a href="#ref1">&#8617;</a></li>
<li id="fn2">Liao (2022), <a href="https://escholarship.mcgill.ca/downloads/cz30pz65p.pdf" target="_blank">McGill University thesis</a>. Hemp nanocellulose extraction: 49.6% yield from bast fiber at 97% purity. Detailed NaOH protocol with exact quantities. <a href="#ref2">&#8617;</a></li>
<li id="fn3">Hydrogen peroxide bleaching protocol from <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC10611065/" target="_blank">PMC 10611065</a>. Safer alternative to sodium chlorite for workshop-scale cellulose bleaching. <a href="#ref3">&#8617;</a></li>
<li id="fn4">Robert Murray-Smith, <a href="https://www.youtube.com/watch?v=UCuPwBYyYKE" target="_blank">"A Hemp And Seaweed Bioplastic"</a> (2020) & <a href="https://www.youtube.com/watch?v=REqqJOaE30U" target="_blank">"Hot Press Molding Hemp Casein Plastic"</a> (2020). Workshop demonstrations with bioresin composite & casein-tannin approaches at 150°C. <a href="#ref4">&#8617;</a></li>
<li id="fn5">Beluns et al. (2023), "Sustainable hemp-based bioplastics with tunable properties via reversible thermal crosslinking of cellulose," <a href="https://pubmed.ncbi.nlm.nih.gov/37245763/" target="_blank"><i>Int J Biol Macromol</i></a>. No chemical pretreatment, citric acid crosslinking at 140°C, achieving up to 70 MPa tensile strength & 7-fold water uptake reduction. <a href="#ref5">&#8617;</a></li>
<li id="fn6">Dhakal et al. (2022), <a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC9182753/" target="_blank">PMC 9182753</a>. 5% NaOH treatment of hemp at room temperature for 1-4 hours — gentlest effective protocol. <a href="#ref6">&#8617;</a></li>
<li id="fn7"><a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC12073554/" target="_blank">PMC 12073554</a> (2025). Hemp waste cellulose extraction via alternating 2% NaOH & 1M HCl treatments. Milder protocol with 47% yield. <a href="#ref7">&#8617;</a></li>
<li id="fn8"><a href="https://pmc.ncbi.nlm.nih.gov/articles/PMC5456901/" target="_blank">PMC 5456901</a>. Abraham et al. (2016), hemp hurd cellulose microfiber extraction via alkaline & acid hydrolysis. <a href="#ref8">&#8617;</a></li>
<li id="fn9">Hemp In A Pot, <a href="https://www.youtube.com/watch?v=iywsYqBxrPY" target="_blank">"Manual Decortication of Hemp Stalks By Hand"</a> (2020). Practical video demonstration of hand decortication. <a href="#ref9">&#8617;</a></li>
<li id="fn10">Solis Garcia et al. (2025), <a href="http://scielo.senescyt.gob.ec/scielo.php?pid=S2477-91052025000100024&script=sci_abstract&tlng=en" target="_blank">"Extraction of cellulose fibers from hemp stalk by chemical treatment"</a>. Optimal at 10% NaOH / 120 min yielding 75.11% alpha-cellulose. <a href="#ref10">&#8617;</a></li>
<li id="fn11"><a href="https://bio-protocol.org/exchange/minidetail?id=21294617&type=30" target="_blank">Bio-protocol</a> (2025). Hemp cellulose + glycerol + NaOH, stirred 60 min at 80°C, hot pressed at 240°C for 10 min. <a href="#ref11">&#8617;</a></li>
<li id="fn12">Robert A. Nelson, <a href="http://www.rexresearch.com/hhusb/hh3fiber.htm" target="_blank">"Hemp Husbandry, Chapter 3: Hemp Fiber"</a>. Comprehensive retting reference with temperature/duration data. <a href="#ref12">&#8617;</a></li>
</ol>
</div>
<hr>
<p><a href="/hemp-bioplastic/">&#8592; hemp bioplastic overview</a> · <a href="/hemp-bioplastic/process/homeschool/">homeschool recipe</a> · <a href="/hemp-bioplastic/process/factory/">factory</a> · <a href="/single-use-plastics/">single-use plastics</a> · <a href="/let-us-define-a-permacomputer/">manifesto</a></p>
</main>
<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>
<script src="/js/diagram-zoom.js"></script>
<script src="https://uncloseai.com/uncloseai.js" type="module"></script>
</body>
</html>

View file

@ -4,5 +4,6 @@
<meta http-equiv="Refresh" content="0; url='/let-us-define-a-permacomputer/'" />
</head>
<body>
<script src="https://uncloseai.com/uncloseai.js" type="module"></script>
</body>
</html>

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