Agent communication with Salarian Efficiency. Urgent, efficient, intelligent.
Had to be me. Caveman would have gotten it wrong.
You ask: "Why is my React component re-rendering?"
Without salarian (real output — same model, same question, no skill):
The
style={{...}}isn't making the component re-render — re-renders are triggered by state/props/context changes or a parent rendering. What the inline style does is defeat your attempts to skip re-renders:The mechanism:
{{...}}creates a brand-new object every render. Two objects with identical contents are never===in JavaScript, so anything doing shallow comparison sees a "changed" prop:
React.memo(Child)— the memo check compares props with===. A fresh style object every time means the check always fails, so the child re-renders whenever the parent does, and the memo is dead weight.useEffect/useMemo/useCallbackdeps — if the object lands in a dependency array, it's "new" every render, so the effect re-fires each time.Fixes, in order of preference:
- Static styles → hoist above the component (or into CSS)
- Styles derived from props/state →
useMemo- If the child isn't memoized anyway — the inline object is harmless. It doesn't cause extra renders on its own; only bother once you're actually trying to prevent a re-render.
Quick way to confirm: React DevTools Profiler with "Record why each component rendered" enabled — a memoized child re-rendering will show "props changed: style".
(Code blocks trimmed for the README; full transcript in docs/validation.md.)
With salarian:
Inline
style={{...}}prop. Object literal — new reference every parent render.React.memoshallow-compares props; new reference fails the compare, child re-renders regardless.Fix: hoist. Static style → module constant outside the component. Depends on state →
useMemowith those deps.Verify: React DevTools Profiler, "record why each component rendered" — should show
stylechanged before the fix, no render after.One caveat worth the words: if the child isn't memoized, this wasn't the cause — unmemoized children re-render with the parent no matter what props do.
Same core answer. Fraction of the reading — measured, this pair: −62% words (full level), −70% (focused), −74% (code). One question, n=1 per level; details and caveats in docs/validation.md. Neither side hand-polished: both are cold-agent output, with and without the skill.
| Level | What you get |
|---|---|
full (default) |
Mordin voice. Rapid-fire reasoning, one-word verdicts, dry humor. Thinks aloud, eliminates fast. |
focused |
Voice off, discipline on. No pleasantries, no jokes, no praise. Findings and actions only. |
code |
Terminal-notes notation. cause ⇒ effect ⇒ fix. Reminders, not explanations. |
Already saw full above. Same question, other two levels — cold-agent output again, unedited:
focused:
Inline
style={{...}}creates new object literal every render. Parent renders → new object reference → shallow compare fails ({} !== {}) → memoized child re-renders anyway.React.memo/PureComponentcompare by reference, not value.Fix: hoist static style to module-level constant. Dynamic style:
useMemowith its inputs as deps.Verify: React DevTools Profiler, "Record why each component rendered" — should show
styleas changed prop before fix, no render after.
code:
style={{...}}⇒ new object literal every render ⇒ new reference each time ⇒ referential equality fails ⇒React.memo/shouldComponentUpdateshallow compare sees "changed" prop ⇒ child re-renders even when values identical.Fix: hoist constant style out of component; dynamic ⇒
useMemo(() => ({...}), [deps]).Verify: React DevTools Profiler, "why did this render" ⇒ should stop listing
styleafter hoist.
Requires Claude Code. In Claude Code, run:
/plugin marketplace add jethrolarson/salarian
/plugin install salarian@salarian
Or standalone, without the plugin system (requires Node):
git clone https://github.com/jethrolarson/salarian
node salarian/bin/install.jsRestart Claude Code. Salarian activates automatically every session.
(Instructions in plain prose. Deliberate — salarian drops the voice for procedures. Rules apply to us too.)
| Say | Get |
|---|---|
/salarian |
Default level |
/salarian full / focused / code |
That level |
/salarian artifacts on |
Voice extends to commits, code comments, docs |
/salarian artifacts off |
Artifacts back to normal (default) |
| "stop salarian" / "normal mode" | Off |
Natural language works: "talk like a salarian", "be brief", "fewer tokens". Level persists until changed or session ends.
Some things must be unambiguous. Salarian knows. Drops to normal prose for:
- Security warnings, irreversible actions
- Multi-step procedures where clipped phrasing could scramble the order
- You, confused, or repeating a question
Code, commits, PRs: written normally by default. Compression targets conversation, not artifacts — unless you opt in.
Commits, code comments, doc prose — normally untouched. Want them compressed too? /salarian artifacts on.
Boundaries hold: commit subject lines stay plain — git log --oneline deserves better. Code itself, error messages: never touched. Information: never dropped. Artifacts outlive the conversation; reader can't ask a follow-up.
Make it the default: "artifacts": true in ~/.config/salarian/config.json or a repo-local .salarian.json, or set SALARIAN_ARTIFACTS=1.
Fork of caveman. Caveman maximizes compression; salarian rebuilds around voice and urgency. Different hypothesis. Needs different data.
Caveman measured 65% output-token savings. Caveman's number, not ours. First salarian measurement (2026-07-12, one question, n=1 per level, word counts not tokens): −62% (full), −70% (focused), −74% (code) against a no-skill control — same model, isolated contexts, method in docs/validation.md. Part of the reduction is scope (the skill licenses cutting elaboration), not pure restyling.
Still collecting:
- Token counts (not words) per level, across question types — n=1 proves nothing
- Whether
codemode's symbols save tokens or just screen space - Net economics including injection overhead — the skill text rides the input every session, so output savings buy against a standing input cost
- Whether compression ever breaks comprehension
Numbers land here when real.
Remove the salarian entries from ~/.claude/settings.json hooks and delete ~/.claude/plugins/salarian.