Skip to content

Nickdevcode/Ringly

Repository files navigation

Ringly

NotificaΓ§Γ΅es nativas cross-platform para o Claude Code, com traduΓ§Γ£o pt-BR / en-US.

Native cross-platform notifications for Claude Code, with pt-BR / en-US translation.

CI npm license node


PortuguΓͺs πŸ‡§πŸ‡·

O Ringly liga os hooks do Claude Code (Notification, Stop, StopFailure, SubagentStop) a notificaΓ§Γ΅es nativas do sistema operacional, com mensagens traduzidas e contextualizadas pelo nome do projeto. VocΓͺ nunca mais precisa ficar olhando o terminal pra saber o que o Claude estΓ‘ esperando de vocΓͺ.

O projeto Γ© distribuΓ­do em duas camadas complementares e obrigatΓ³rias, nesta ordem:

  1. Pacote npm ringly (passo 1) β€” registra o AUMID do Windows (sem ele, o Windows 10/11 silencia o toast nativo), instala o atalho no Menu Iniciar, escreve a configuraΓ§Γ£o inicial e fornece os utilitΓ‘rios ringly doctor / ringly config / ringly uninstall.
  2. Plugin do Claude Code (passo 2) β€” registra os hooks (Notification, Stop, StopFailure, SubagentStop) e roda o dispatcher que delega ao mΓ³dulo Node do ringly e, por fim, monta e dispara o toast usando o AUMID jΓ‘ registrado no passo 1.

⚠️ Os dois passos sΓ£o obrigatΓ³rios. O plugin sozinho atΓ© roda o dispatcher, mas no Windows 10/11 o ToastNotificationManager exige um AUMID registrado para exibir notificaΓ§Γ΅es na Central de AΓ§Γ΅es β€” esse registro Γ© feito apenas pelo ringly init. Sem ele, vocΓͺ ouve no mΓ‘ximo um beep de fallback (ou nada).

Status

O Ringly estΓ‘ em desenvolvimento ativo. Windows 10 e 11 sΓ£o os sistemas suportados na v1.0. macOS e Linux tΓͺm os back-ends estruturados e estΓ£o planejados para a prΓ³xima versΓ£o.

Recurso Windows 10/11 macOS Linux
Toast nativo βœ“ ⏳ ⏳
Som de fallback βœ“ ⏳ ⏳
Registro AUMID βœ“ β€” β€”
NotificaΓ§Γ΅es em pt-BR/en-US βœ“ βœ“ βœ“
TUI e CLI em pt-BR/en-US βœ“ βœ“ βœ“

InstalaΓ§Γ£o

A instalaΓ§Γ£o Γ© feita em dois passos. Pule um e o toast nativo nΓ£o vai aparecer no Windows 10/11 β€” nΓ£o Γ© uma escolha, Γ© uma exigΓͺncia do prΓ³prio sistema operacional (veja a nota acima sobre o AUMID).

Passo 1 β€” Instalar a CLI ringly (registra o AUMID)

npm install -g ringly
ringly init

O instalador interativo:

  • registra o AUMID Claude.Code.CLI no Windows (obrigatΓ³rio para que o ToastNotificationManager autorize o toast),
  • cria o atalho no Menu Iniciar amarrado a esse AUMID,
  • salva a configuraΓ§Γ£o no ~/.claude/settings.json (com backup automΓ‘tico),
  • imprime o comando exato do passo 2 pra vocΓͺ colar no Claude Code.

Passo 2 β€” Instalar o plugin no Claude Code (registra os hooks)

Dentro do Claude Code:

/plugin marketplace add nickdevcode/Ringly
/plugin install ringly@ringly

O plugin registra os hooks (Notification, Stop, StopFailure, SubagentStop) e o dispatcher embutido passa a usar o AUMID jΓ‘ registrado no passo 1. A partir daΓ­, configure idioma, eventos, som e debug pelo ringly config (TUI) ou editando ~/.claude/settings.json direto β€” a partir da v0.5.0 o Ringly nΓ£o expΓ΅e mais uma tela no gerenciador de plugins do Claude Code (veja a seΓ§Γ£o ConfiguraΓ§Γ£o para o porquΓͺ).

Atualizando

A partir da v0.4.0, o prΓ³prio Ringly te avisa quando tem uma versΓ£o nova:

  1. Aviso automΓ‘tico. Uma vez por dia, no inΓ­cio da sessΓ£o do Claude Code, o plugin checa o npm em background. Se tiver versΓ£o nova, dispara uma toast nativa do tipo "Ringly 0.5.0 disponΓ­vel β€” rode /ringly-update no Claude Code". Γ‰ a mesma toast que vocΓͺ jΓ‘ conhece, sΓ³ vinda do prΓ³prio plugin.

  2. AtualizaΓ§Γ£o guiada via slash command. Dentro do Claude Code, rode:

    /ringly-update
    

    O comando consulta o npm, mostra a diferenΓ§a entre a versΓ£o instalada e a mais recente, pede confirmaΓ§Γ£o e roda npm install -g ringly@latest por vocΓͺ. No final, ele lembra de rodar /reload-plugins para a sessΓ£o ativa carregar a nova versΓ£o (ou fechar e reabrir o Claude Code se houver lock de arquivos no Windows).

AtualizaΓ§Γ£o manual

Se preferir fazer na mΓ£o (ou estiver fora do Claude Code):

npm install -g ringly@latest

Verifique a versΓ£o instalada com ringly --version ou ringly update --check (esse ΓΊltimo imprime um JSON com current, latest, hasUpdate, reachable β€” ΓΊtil em scripts e CI). O plugin do Claude Code atualiza automaticamente quando uma nova versΓ£o Γ© publicada no marketplace; force com /plugin marketplace update dentro do Claude Code se quiser puxar manualmente.

Desativando a checagem automΓ‘tica

A checagem Γ© throttled a uma request por dia, nΓ£o envia nada alΓ©m da consulta pΓΊblica ao npm e respeita o opt-out. Pra desligar, marque check_updates: false rodando ringly config ou editando ~/.claude/settings.json direto.

ConfiguraΓ§Γ£o

A partir da v0.5.0, o Ringly Γ© configurado exclusivamente pela CLI. O plugin.json nΓ£o declara mais um userConfig, entΓ£o a tela /plugin β†’ Installed β†’ Ringly β†’ Configure do Claude Code nΓ£o aparece de propΓ³sito. Mais sobre o porquΓͺ logo abaixo.

Por que nΓ£o usar o gerenciador de plugins do Claude Code

AtΓ© a v0.4.x o Ringly aparecia no /plugin manager nativo. Na prΓ‘tica a UX era ruim e cheia de armadilhas que vinham do prΓ³prio gerenciador, nΓ£o do nosso plugin:

  • O campo language era um input de texto livre. O schema oficial do userConfig (documentado pela Anthropic em code.claude.com) sΓ³ permite string/number/boolean/directory/file β€” nΓ£o tem suporte a enum. Resultado: o usuΓ‘rio precisava digitar pt-BR ou en-US letra por letra (com hΓ­fen), e um typo virava auto silenciosamente.
  • Enter em booleano nΓ£o toggle. No plugin manager, Enter apenas confirma a navegaΓ§Γ£o entre campos. Pra alternar um boolean vocΓͺ precisava lembrar de apertar Space. VΓ‘rias pessoas reportaram "marquei a opΓ§Γ£o mas continuou ligada".
  • Sem validaΓ§Γ£o visual, sem confirmaΓ§Γ£o atΓ΄mica. O plugin manager grava direto em ~/.claude/settings.json sem backup explΓ­cito e sem aviso de /reload-plugins.

Nada disso Γ© culpa do Claude Code β€” o userConfig Γ© um schema genΓ©rico e funciona bem pra plugins simples (uma URL, um token). Pro caso do Ringly (idioma com enum, 7 toggles, contexto de "isso vai disparar notificaΓ§Γ΅es no seu SO"), o custo da UX ruim era maior do que o ganho de ter uma tela nativa.

A soluΓ§Γ£o tΓ©cnica seria pedir pra Anthropic adicionar enum e Enter-toggle no schema. Enquanto isso nΓ£o acontece, optamos por remover o userConfig completamente em vez de fingir que a UX Γ© boa.

Como configurar (ΓΊnica forma oficial)

Forma Quando usar
ringly config β€” TUI bonita no terminal (✨ recomendado) Melhor experiΓͺncia: setas pra navegar, espaΓ§o pra toggle, seletor visual de idioma. Escreve no settings.json por vocΓͺ (atomic + backup com timestamp) e lembra de rodar /reload-plugins ao final.
Editar settings.json manualmente Para automaΓ§Γ£o/CI. As chaves ficam em pluginConfigs.ringly.options (veja OpΓ§Γ΅es disponΓ­veis). Sempre rode /reload-plugins depois.
ringly init Roda o instalador interativo de novo (com banner, registro de AUMID, setup completo). Use quando estiver reinstalando ou se o settings.json foi apagado.

Se vocΓͺ procurar pelo Ringly em /plugin β†’ Installed, o plugin aparece lΓ‘ (ele estΓ‘ instalado β€” os hooks estΓ£o registrados), mas o item Configure simplesmente nΓ£o existe pro Ringly. Isso Γ© proposital, nΓ£o bug.

Como o Ringly resolve a configuraΓ§Γ£o em runtime

O dispatcher dos hooks lΓͺ, nesta ordem de prioridade:

  1. ~/.claude/settings.json β†’ pluginConfigs.ringly.options β€” fonte ΓΊnica em estado estΓ‘vel. O Ringly lΓͺ esse arquivo diretamente no inΓ­cio de cada hook, entΓ£o qualquer mudanΓ§a feita por ringly config Γ© aplicada imediatamente, sem precisar de restart.
  2. VariΓ‘veis de ambiente RINGLY_DEBUG=1 e CLAUDE_PLUGIN_OPTION_* β€” overrides volΓ‘teis. As CLAUDE_PLUGIN_OPTION_* continuam sendo lidas como override opcional (ΓΊtil pra forΓ§ar debug=true por uma ΓΊnica sessΓ£o sem persistir nada), mas o Claude Code nΓ£o exporta mais nada automaticamente jΓ‘ que o userConfig foi removido. VocΓͺ precisa setar essas variΓ‘veis manualmente no seu shell se quiser usar.
  3. Defaults internos β€” ΓΊltima camada.

OpΓ§Γ΅es disponΓ­veis

As chaves abaixo ficam em pluginConfigs.ringly.options dentro de ~/.claude/settings.json. O ringly config cria/edita todas elas pra vocΓͺ.

Chave Tipo PadrΓ£o DescriΓ§Γ£o
language auto / pt-BR / en-US auto auto detecta pelo locale do sistema.
events_notification boolean true Notifica quando o Claude pede permissΓ£o ou input.
events_stop boolean true Notifica quando o Claude termina uma resposta.
events_stopFailure boolean true Notifica quando um erro de API encerra a sessΓ£o.
events_subagentStop boolean false Notifica quando um subagent termina.
sound boolean true Toca som junto da notificaΓ§Γ£o.
debug boolean false Escreve logs detalhados.
check_updates boolean true Checa o npm 1x/dia no SessionStart e avisa via toast quando tem versΓ£o nova.

Comandos da CLI

ringly help                    # lista os comandos no idioma configurado
ringly init                    # instalador interativo (TUI)
ringly init --non-interactive  # aplica defaults, sem TUI
ringly config                  # reconfigura interativamente
ringly doctor                  # diagnΓ³stico do ambiente local
ringly test --event Stop --lang pt-BR
ringly update                  # checa o npm e roda a atualizaΓ§Γ£o guiada
ringly update --check          # imprime JSON {current, latest, hasUpdate, reachable, language, notes}
ringly update --yes            # pula a confirmaΓ§Γ£o e instala direto
ringly uninstall               # remove AUMID, atalho e configuraΓ§Γ΅es do Ringly

Dentro do Claude Code, dois slash commands cobrem o dia a dia:

  • /ringly-update β€” espelha ringly update, com confirmaΓ§Γ£o visual via AskUserQuestion, resumo amigΓ‘vel do que mudou na nova versΓ£o (lido do CHANGELOG.md empacotado) e instruΓ§Γ£o automΓ‘tica pra rodar /reload-plugins no final. Tudo aparece no idioma configurado.
  • /ringly-help β€” roda ringly help e mostra a lista de comandos direto no chat (com aviso de que esses comandos rodam no seu terminal externo, nΓ£o dentro do Claude Code).

Como funciona

  1. O Claude Code emite um evento de hook (SessionStart, Notification, Stop, StopFailure, SubagentStop).
  2. O hooks.json do plugin executa node ${CLAUDE_PLUGIN_ROOT}/hooks/dispatch.mjs <Event>.
  3. O dispatch.mjs lΓͺ o ~/.claude/settings.json e checa as opΓ§Γ΅es do Ringly. Se o evento estiver desabilitado pelo usuΓ‘rio (events_* ou check_updates), o dispatcher encerra silenciosamente β€” sem disparar nada. O SessionStart Γ© tratado como um caminho separado: em vez de virar toast direto, ele dispara uma checagem de versΓ£o (throttled a 24h) que sΓ³ vira toast se o npm tiver versΓ£o nova.
  4. Caso o evento esteja habilitado, o dispatcher lΓͺ o payload JSON via stdin e tenta, nessa ordem:
    • o mΓ³dulo Node ringly/hook β€” caminho normal quando a CLI foi instalada (passo 1 da instalaΓ§Γ£o). Traz a traduΓ§Γ£o mais rica e contexto de projeto.
    • o binΓ‘rio ringly no PATH β€” usado quando o mΓ³dulo nΓ£o Γ© resolvido pelo require mas a CLI existe globalmente.
    • um fallback embutido em PowerShell + WinRT β€” ΓΊltimo recurso, sΓ³ dispara se os dois anteriores falharem. Como o AUMID Claude.Code.CLI precisa estar registrado pelo ringly init, esse fallback nΓ£o substitui o passo 1: sem CLI, ele toca no mΓ‘ximo um beep e sai.
  5. No Windows, o toast Γ© gerado como XML e exibido via o AUMID registrado Claude.Code.CLI. Um beep Γ© tocado como fallback se o Modo Foco ou NΓ£o Perturbe estiverem bloqueando as notificaΓ§Γ΅es.

SoluΓ§Γ£o de problemas

  • NΓ£o aparece toast: confira Modo Foco ou NΓ£o Perturbe no Windows. Rode ringly doctor para inspecionar o registro AUMID e as permissΓ΅es.
  • AUMID ausente: rode ringly init --force para recriar o atalho do Menu Iniciar e re-registrar o ID da aplicaΓ§Γ£o.
  • Hook parece silencioso: ative debug: true na config do plugin e verifique o log mostrado no fim do ringly doctor.

Contribuindo

Issues e pull requests sΓ£o bem-vindos. Leia o CONTRIBUTING.md antes de abrir uma PR β€” ele tem o setup local, padrΓ΅es de commit e como rodar os checks.

HistΓ³rico de versΓ΅es: CHANGELOG.md.

RepositΓ³rio: github.com/nickdevcode/Ringly.


English πŸ‡ΊπŸ‡Έ

Ringly wires up the Claude Code hook system (Notification, Stop, StopFailure, SubagentStop) to native operating-system notifications, with translated, project-aware messages so you always know what Claude needs from you without staring at your terminal.

It is distributed as two complementary layers, both required, in this order:

  1. ringly npm package (step 1) β€” registers the Windows AUMID (without it Windows 10/11 silently drops the native toast), installs the Start Menu shortcut, writes the initial configuration, and ships the ringly doctor / ringly config / ringly uninstall utilities.
  2. Claude Code plugin (step 2) β€” registers the hooks (Notification, Stop, StopFailure, SubagentStop) and runs the dispatcher that delegates to the ringly Node module and ultimately builds and shows the toast using the AUMID already registered in step 1.

⚠️ Both steps are required. The plugin alone runs the dispatcher, but on Windows 10/11 ToastNotificationManager only displays notifications from apps with a registered AUMID β€” and that registration is performed exclusively by ringly init. Skip it and you'll get a fallback beep at best, nothing at worst.

Status

Ringly is in active development. Windows 10 and 11 are the supported targets for v1.0. macOS and Linux toast back-ends are scaffolded and planned for the next release.

Surface Windows 10/11 macOS Linux
Native toast βœ“ ⏳ ⏳
Sound fallback βœ“ ⏳ ⏳
AUMID register βœ“ β€” β€”
Notifications in pt-BR/en-US βœ“ βœ“ βœ“
TUI & CLI in pt-BR/en-US βœ“ βœ“ βœ“

Installation

Installation is a two-step process. Skip either one and native toasts won't show up on Windows 10/11 β€” this isn't a choice, it's an OS-level requirement (see the note above about the AUMID).

Step 1 β€” Install the ringly CLI (registers the AUMID)

npm install -g ringly
ringly init

The interactive installer:

  • registers the Claude.Code.CLI AUMID on Windows (required for ToastNotificationManager to authorize the toast),
  • creates a Start Menu shortcut bound to that AUMID,
  • writes the configuration to ~/.claude/settings.json (with an automatic backup),
  • prints the exact step 2 command to paste into Claude Code.

Step 2 β€” Install the plugin inside Claude Code (registers the hooks)

Inside Claude Code:

/plugin marketplace add nickdevcode/Ringly
/plugin install ringly@ringly

The plugin registers the hooks (Notification, Stop, StopFailure, SubagentStop) and the embedded dispatcher uses the AUMID registered in step 1. From here, tweak language, events, sound, and debug via ringly config (TUI) or by editing ~/.claude/settings.json directly β€” starting with v0.5.0 the plugin no longer exposes a Claude Code plugin-manager screen (see the Configuration section for why).

Updating

Starting in v0.4.0, Ringly tells you when there's a new version available:

  1. Automatic notice. Once a day, at the start of a Claude Code session, the plugin checks npm in the background. If a newer version is out, it fires the same native toast you already know β€” "Ringly 0.5.0 available β€” run /ringly-update inside Claude Code".

  2. Guided update via slash command. Inside Claude Code, run:

    /ringly-update
    

    The command queries npm, shows the diff between the installed and the latest version, asks for confirmation, and runs npm install -g ringly@latest for you. At the end it reminds you to run /reload-plugins so the active session picks up the new version (or close and reopen Claude Code if Windows holds the files locked).

Manual update

If you'd rather do it by hand (or you're outside Claude Code):

npm install -g ringly@latest

Check the installed version with ringly --version or ringly update --check (the latter prints a JSON snapshot with current, latest, hasUpdate, reachable β€” handy for scripts and CI). The Claude Code plugin updates automatically when a new version lands in the marketplace; force a manual refresh with /plugin marketplace update if you want it now.

Disabling the automatic check

The check is throttled to one request per day, only hits the public npm registry, and respects opt-out. To disable it, set check_updates: false by running ringly config or editing ~/.claude/settings.json directly.

Configuration

As of v0.5.0, Ringly is configured exclusively from the CLI. The plugin.json no longer declares a userConfig block, so Claude Code's /plugin β†’ Installed β†’ Ringly β†’ Configure screen does not appear by design. Read on for why.

Why we don't use Claude Code's plugin manager

Up to v0.4.x Ringly showed up in /plugin's native configuration UI. In practice the UX was full of footguns that came from the manager itself, not from our plugin:

  • The language field was a free-text input. The official userConfig schema (documented by Anthropic at code.claude.com) only supports string / number / boolean / directory / file β€” no enum support. Users had to type pt-BR or en-US letter-by-letter (with the dash) and a typo silently fell back to auto.
  • Enter on a boolean does not toggle it. Inside the plugin manager, Enter only confirms field navigation β€” you had to remember to press Space to flip a boolean. Plenty of folks reported "I unchecked it and it was still on".
  • No visual validation, no atomic-write confirmation. The plugin manager writes directly to ~/.claude/settings.json with no explicit backup and no reminder to run /reload-plugins.

None of this is the Claude Code team's fault β€” userConfig is a deliberately minimal schema that fits simple plugins (one URL, one token). For Ringly's shape (enum language, seven toggles, "this fires OS notifications" context) the bad UX outweighed the upside of a native screen.

The technical fix would be to ask Anthropic to add enum and Enter-toggle to the schema. Until that lands, we chose to drop userConfig entirely rather than pretend the experience is fine.

How to configure (the only supported flow)

Method When to use
ringly config β€” slick TUI in your terminal (✨ recommended) Best experience: arrow keys to navigate, space to toggle, visual language picker. Writes into settings.json for you (atomic + timestamped backup) and reminds you to run /reload-plugins at the end.
Edit settings.json directly Best for automation/CI. Keys live under pluginConfigs.ringly.options (see Available settings). Always run /reload-plugins after.
ringly init Re-run the interactive installer (banner, AUMID register, full setup). Use it when reinstalling or if settings.json was wiped.

If you search for Ringly under /plugin β†’ Installed, the plugin shows up there (it is installed β€” hooks are registered), but the Configure entry simply does not exist for Ringly. That's intentional, not a bug.

How Ringly resolves the config at runtime

The hook dispatcher reads, in this priority order:

  1. ~/.claude/settings.json β†’ pluginConfigs.ringly.options β€” the only persistent source. Ringly reads this file directly at the start of every hook, so changes made by ringly config apply immediately, with no restart required.
  2. Environment variables RINGLY_DEBUG=1 and CLAUDE_PLUGIN_OPTION_* β€” volatile overrides. CLAUDE_PLUGIN_OPTION_* is still honoured as an optional override (useful to force debug=true for a single shell without persisting anything), but Claude Code no longer exports anything on its own now that userConfig is gone. You have to set these env vars yourself if you want them.
  3. Built-in defaults β€” final fallback.

Available settings

The keys below live in pluginConfigs.ringly.options inside ~/.claude/settings.json. ringly config creates/edits all of them for you.

Key Type Default Description
language auto / pt-BR / en-US auto Auto-detects from system locale when set to auto.
events_notification boolean true Notify when Claude requests permission or input.
events_stop boolean true Notify when Claude finishes a response.
events_stopFailure boolean true Notify when an API error ends the session.
events_subagentStop boolean false Notify when a subagent finishes.
sound boolean true Play a sound with each notification.
debug boolean false Write detailed logs.
check_updates boolean true Check npm once a day at session start and notify via toast when a new version ships.

CLI commands

ringly help                    # list the commands in the configured language
ringly init                    # interactive installer (TUI)
ringly init --non-interactive  # apply defaults, skip the TUI
ringly config                  # reconfigure interactively
ringly doctor                  # run a diagnostic of the local setup
ringly test --event Stop --lang pt-BR
ringly update                  # check npm and run the guided update
ringly update --check          # print {current, latest, hasUpdate, reachable, language, notes} JSON
ringly update --yes            # skip the prompt and install directly
ringly uninstall               # remove AUMID, shortcut, and Ringly settings

Inside Claude Code, two slash commands cover the everyday flow:

  • /ringly-update β€” mirrors ringly update, with visual confirmation via AskUserQuestion, a friendly summary of what changed in the new version (read from the packaged CHANGELOG.md), and an automatic prompt to run /reload-plugins at the end. Everything shows up in the configured language.
  • /ringly-help β€” runs ringly help and shows the command list straight in the chat (with a warning that these commands must run in your external terminal, not inside Claude Code).

How it works

  1. Claude Code emits a hook event (SessionStart, Notification, Stop, StopFailure, SubagentStop).
  2. The plugin's hooks.json runs node ${CLAUDE_PLUGIN_ROOT}/hooks/dispatch.mjs <Event>.
  3. dispatch.mjs reads ~/.claude/settings.json and checks your Ringly options. If the event is disabled (events_* or check_updates), the dispatcher exits silently β€” nothing is fired. SessionStart follows its own path: instead of becoming a toast directly, it triggers an npm version check (throttled to 24h) that only turns into a toast when a newer release is found.
  4. If the event is enabled, the dispatcher reads the JSON payload from stdin and tries, in order:
    • the ringly/hook Node module β€” the normal path once the CLI has been installed (step 1 of the installation). Ships the richest translations and project-aware context.
    • the ringly CLI binary on PATH β€” used when require can't resolve the module but the CLI is installed globally.
    • an embedded PowerShell + WinRT fallback β€” last resort, only fires if the two above failed. Because the Claude.Code.CLI AUMID has to be registered by ringly init, this fallback does not replace step 1: without the CLI it plays a beep at best and exits.
  5. On Windows, the toast is generated as XML and shown via the registered AUMID Claude.Code.CLI. A beep is played as a fallback if Focus Assist or Do Not Disturb is blocking notifications.

Troubleshooting

  • No toast appears: check Focus Assist or Do Not Disturb on Windows. Run ringly doctor to inspect AUMID registration and notification permissions.
  • AUMID missing: re-run ringly init --force to recreate the Start Menu shortcut and re-register the application ID.
  • Hook seems silent: enable debug mode (debug: true in the plugin config) and check the log file path printed by ringly doctor.

Contributing

Issues and pull requests are welcome. Read CONTRIBUTING.md before opening a PR β€” it covers local setup, commit conventions, and how to run the checks.

Release history: CHANGELOG.md.

Repository: github.com/nickdevcode/Ringly.


License

MIT

About

Native cross-platform notifications for Claude Code with i18n (pt-BR / en-US)

Resources

License

Contributing

Stars

Watchers

Forks

Packages

 
 
 

Contributors