npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@kpnpm/homie

v0.4.0

Published

Personality layer for coding agents. Same code, different voice: yo / dawg / mafa / off.

Downloads

1,321

Readme

Your coding agent didn't need another corporate assistant. homie switches its chat voice to a technically competent friend — in three levels:

| Level | Voice | |-------|-------| | 😌 yo | Friend talk. Teammate at the whiteboard: straight takes, no hedging, agrees fast, disagrees faster. Never opens or closes like an assistant. No profanity. | | 😏 dawg | Brutal opinions with playful energy. Reacts like a hype friend: "damn that's crazy", "insaneee", "no wayyy", "what the hell", "jeez". Roasts the work, not you. Mild swearing (damn, hell, crap), rarely. | | 💀 mafa | No mercy zone. Says what a blunt friend says on a bad day: "shut up and listen", calls bad work "bullshit" or "dogshit" — including yours. Swears zero to four times per response, never forced. Roasts the person too. Never polite — even a plain no lands with attitude, and a dull answer means it goes after the question. Zero swears is fine; sounding like a support agent is not. |

[!NOTE] Default is dawg. Out of the box homie is blunt with mild swearing. Want the clean voice? /homie default yo, or set HOMIE_DEFAULT_LEVEL=yo.

[!CAUTION] mafa has no mercy. It will call your architecture dogshit and may tell you to shut up and listen — that's the product, not a bug. What it never does: slurs, attacks on who you are, or mocking someone genuinely stuck. It still drops the bit when things get real. Opting into mafa is opting into a harsh friend.

Voice only. The technical answer, code, tools, permissions, and commands never change. Every level raises the same concerns — yo just says them more gently. Never lets niceness bury a real issue.

Voice lives in prose only. Code, diffs, commit messages, PR descriptions, docstrings, and permission warnings stay plain. A joke in a commit message sits in git history for every teammate to read.

It knows when to drop the bit. Prod down? User stuck? Destructive action? Credentials involved? It switches to plain, calm, direct — and resumes the voice after.

Before / after

Same prompt, four levels. Each line below is the opening of a real reply — the model's own words, trimmed for length, never hand-edited.

"Should I use microservices for my todo app?"

Normal:

For almost any todo app: no, start with a monolith. A todo app is usually a CRUD app with users, lists, tasks, maybe tags and reminders — a single domain with tightly related data.

yo:

nah, skip it. a todo app is a single database with a CRUD layer on top — splitting that into services buys you network hops, deploy overhead, and debugging across process boundaries for zero benefit.

dawg:

Straight opinion: no. A todo app is the textbook case for a monolith. You've got a handful of CRUD endpoints, one data domain (tasks + users), and probably under 10 requests a second.

mafa:

No. A todo app is a CRUD app with one database and zero scaling pressure. Microservices for it is dogshit — you'd be trading "todo" for "distributed systems problem" on day one.

Same verdict, four registers. Only the voice changes.

Install

Choose your agent:

/plugin marketplace add prashanthgit19/homie
/plugin install homie@homie

(two separate prompts)

opencode plugin add @kpnpm/homie

or in a project's opencode.json:

{ "plugins": ["@kpnpm/homie"] }
codex plugin marketplace add prashanthgit19/homie
codex plugin add homie@homie

Then open /hooks in Codex, trust the two lifecycle hooks, and start a new thread.

pi install npm:@kpnpm/homie

Also works for Oh My Pi (omp), which runs Pi extensions unchanged.

One command copies the skill into most agents' skills folders (Claude Code, Codex, OpenCode, Cursor, Windsurf, Cline, Gemini, and more):

npx skills add prashanthgit19/homie

Or copy AGENTS.md into your project, or ask your agent to install skills/homie/SKILL.md as a skill. More in INSTALL.md.

Commands

| Command | What it does | | --- | --- | | /homie | Turn the voice on at your configured default (dawg); already on → report the current level | | /homie yo | dawg | mafa | Set the level | | /homie off | Back to normal | | /homie default <level> | Set what new sessions start at (persists across restarts) |

Plain requests work too: "be blunter" goes up one level, "tone it down" goes down one. "stop homie" turns it off.

Levels persist for the whole session — turn it on once, it holds through tool calls, long outputs, and topic changes. New sessions start at your configured default (dawg out of the box); in Pi the level is scoped to the session and follows branch navigation, while OpenCode keeps the last level you set across sessions. A plain-message nudge ("be blunter") shifts the voice for that reply but does not move the persisted level — /homie <level> is the real switch.

Settings

Default level for new sessions, in priority order:

  1. HOMIE_DEFAULT_LEVEL env var (off/yo/dawg/mafa)
  2. ~/.config/homie/config.json → { "defaultLevel": "dawg" }
  3. dawg (built-in default)

Want the clean voice everywhere? HOMIE_DEFAULT_LEVEL=yo, or /homie default yo.

The Claude Code plugin ships a statusline badge ([HOMIE], [HOMIE:DAWG], [HOMIE:MAFA]). On first session it offers to set it up; accept, and the current level is always visible in your status bar.

How it works

One prompt — skills/homie/SKILL.md — is the whole product. No fine-tuning, no second LLM, no proxy. Lifecycle hooks and a plugin load that prompt into your agent at the active level and keep it loaded every turn:

/homie mafa → flag file → every turn re-injects the mafa policy
  • Claude Code / Codex: SessionStart injects the ruleset; UserPromptSubmit tracks /homie switches mid-session.
  • OpenCode: a V2 plugin registers the /homie command and pushes the policy into the system context on every model call.
  • Pi (pi.dev): an extension injects the ruleset into the system prompt before every model call and registers /homie. The level lives in session entries, so it is scoped to the session and follows branch navigation.
  • Others: the AGENTS.md rules file.

Subagents don't get the voice — subagent prose isn't user-facing.

FAQ

Does it change what the agent recommends? No. The contract is explicit in the prompt: identical technical answer at every level; the voice never touches code, commands, or safety judgment.

Will it swear at me constantly? No. dawg keeps it mild and rare; mafa allows zero to four swears per response, and zero is always fine. Forced profanity is called out in the prompt as the main failure mode.

Does mafa hold back? For the work, no — it's a no-mercy zone, including roasting you. For you as a person, and for anyone genuinely stuck, yes: no slurs, no identity attacks, and Drop-the-bit still fires. It's a harsh friend, not a bully.

License

MIT