Inspiration
Climate decisions don't happen in sustainability meetings - they happen in Slack threads. "Let's switch hosting regions." "Should we fly the team in or run this remote?" "Can we move these docs off paper?" Every one is a carbon trade-off, and almost nobody logs them.
The problem isn't that teams don't care. It's that climate accountability tools live somewhere else - separate dashboards, quarterly spreadsheets, reports that arrive long after the decision has been made.
I wanted to flip that. What if the log lived where the decisions already happen - and gave you an honest estimate the moment you made one?
That's GreenLog.
What it does
GreenLog turns Slack itself into the sustainability log. Three primitives:
/greenlog log <natural language>- Type any decision in plain English. Gemini parses it and returns a card with magnitude (Large / Medium / Small / Negligible), direction (positive / negative / neutral), category (8 total - Energy, Transport, Materials, and others), and a one-sentence "why" explaining the environmental mechanism. Every card has one-click Undo. When the input is ambiguous ("drove to work today" with no distance), the bot asks a short follow-up before producing the card./greenlog digest- Posts the week's digest to the configured channel: decisions grouped by category with the net direction. Runs automatically every Monday in the workspace timezone, or trigger it on demand from the App Home.@GreenLogthread mention - Ad-hoc "what if" estimates inside any thread, without persisting to the log. For decisions still being debated.
Plus an App Home tab as the per-workspace home base: timezone auto-detected from the installer, digest channel picked from a conversations selector, source-labelled settings so you always know what's auto vs user-set. No environment variables. No engineer required.
The differentiator: honest uncertainty. When a decision has no environmental signal - a bug fix, a doc edit, a routine deploy - the card says so explicitly: "This action has no direct environmental signal we can estimate." No invented kg CO₂. No fake precision. An honest "we don't know" beats a confident lie.
How we built it
GreenLog runs on Slack Bolt JS with Socket Mode, Node.js (CommonJS), and Gemini 3.1 Flash-Lite via the OpenAI-compatible endpoint. Two architectural disciplines:
- Single LLM seam. All decision triage flows through
lib/carbonEstimate.js. Listeners never call the LLM directly. Prompt iterations — including the entire "honest uncertainty" behavior — live in one file. - Single error seam. Every listener routes failures through one error renderer that produces a screen-reader-friendly Block Kit card with plain-English summary, action context, and a request ID. No stack traces leak into Slack.
Storage is two local JSON files - one for log entries, one for per-workspace settings. Socket Mode means no public webhook URL, no SSL certs, no infrastructure overhead.
Challenges we ran into
The hardest part was the honest uncertainty behavior. Early prompts had Gemini returning confident-sounding kg CO₂ numbers for things like "shipped a hotfix" - invented precision masking the fact that there's no real environmental signal in a code deploy. After several prompt iterations, I got Gemini to recognize when it doesn't have enough signal to estimate and to say so explicitly. The card just reads "This action has no direct environmental signal we can estimate." It's the differentiator for a For Good app.
Designing the magnitude scale (Large / Medium / Small / Negligible) instead of raw kg CO₂ took several rewrites too. Numbers feel precise but produce false confidence. Qualitative magnitudes match the actual uncertainty in how well any model can estimate a one-line decision.
Edge cases in JSON storage, timezone detection for the Monday digest, and channel selection across workspaces all took iteration.
Accomplishments that I'm proud of
- Solo-built end-to-end in about 30 days
- The "honest uncertainty" pattern - refusing to invent numbers when the signal isn't there
- Accessibility built in from the start: screen-reader-tested Block Kit,
text:fallbacks on every card - One-click Undo on every log - accountability without commitment fear
- Source-labelled settings on the App Home so users always know what's auto vs theirs
What I learned
- Designing for honest AI uncertainty produces more user trust than designing for fake precision.
- A single LLM seam pays compound interest - prompt iterations don't ripple into listener code.
- Magnitude-and-direction triage beats raw numbers when the underlying model can't justify the precision.
- Socket Mode dramatically reduces deployment complexity for Slack apps.
What's next for GreenLog
- Multi-language support for global teams
- Optional weekly DM nudges to log a missed decision
- Carbon offset integration - link logged decisions to verified offset programs
- Team challenges using the same magnitude scale (lowest-net week, biggest reversal)
- CSV export of logs for ESG reporting
GreenLog. Honest sustainability triage, where decisions actually get made.
Built With
- block-kit
- gemini
- javascript
- node.js
- openai-api
- slack-api
- slack-bolt
- socket-mode
Log in or sign up for Devpost to join the conversation.