A lightweight alternative to OpenClaw that runs in containers for security. Connects to WhatsApp, Telegram, Slack, Discord, Gmail and other messaging apps,, has memory, scheduled jobs, and runs directly on Anthropic's Agents SDK
147 matches across 9 categories. Click a row to expand file-level details.
| Severity | File | Line | Snippet |
|---|---|---|---|
| MEDIUM | nanoclaw.sh | 40 | # ─── log helpers ──────────────────────────────────────────────────────── |
| MEDIUM | nanoclaw.sh | 99 | # ─── bash-side "clack-alike" status line ──────────────────────────────── |
| MEDIUM | nanoclaw.sh | 125 | # ─── fresh-run setup ──────────────────────────────────────────────────── |
| MEDIUM | nanoclaw.sh | 140 | # ─── pre-flight: minimum hardware specs ──────────────────────────────── |
| MEDIUM | nanoclaw.sh | 190 | # ─── pre-flight: Google Cloud VM warning (Linux) ────────────────────── |
| MEDIUM | nanoclaw.sh | 217 | # ─── pre-flight: root user warning (Linux) ──────────────────────────── |
| MEDIUM | nanoclaw.sh | 250 | # ─── pre-flight: Homebrew on macOS ───────────────────────────────────── |
| MEDIUM | nanoclaw.sh | 298 | # ─── first step: install the basics (Node + pnpm + native modules) ───── |
| MEDIUM | nanoclaw.sh | 351 | # ─── hand off to setup:auto ──────────────────────────────────────────── |
| MEDIUM | migrate-v2.sh | 111 | # ─── output helpers ────────────────────────────────────────────────────── |
| MEDIUM | migrate-v2.sh | 131 | # ─── init logs ─────────────────────────────────────────────────────────── |
| MEDIUM | migrate-v2.sh | 145 | # ─── phase 0a: bootstrap prerequisites ────────────────────────────────── |
| MEDIUM | migrate-v2.sh | 192 | # ─── phase 0b: find v1 install ────────────────────────────────────────── |
| MEDIUM | migrate-v2.sh | 241 | # ─── phase 0c: validate v1 DB ─────────────────────────────────────────── |
| MEDIUM | migrate-v2.sh | 277 | # ─── run_step helper ───────────────────────────────────────────────────── |
| MEDIUM | migrate-v2.sh | 324 | # ─── phase 1: core state ──────────────────────────────────────────────── |
| MEDIUM | migrate-v2.sh | 353 | # ─── phase 2: channels (interactive) ──────────────────────────────────── |
| MEDIUM | migrate-v2.sh | 427 | # ─── phase 3: infrastructure ──────────────────────────────────────────── |
| MEDIUM | migrate-v2.sh | 556 | # ─── service switchover ───────────────────────────────────────────────── |
| MEDIUM | migrate-v2.sh | 681 | # ─── phase 4: handoff ─────────────────────────────────────────────────── |
| MEDIUM | migrate-v2.sh | 736 | # ─── hand off to Claude ───────────────────────────────────────────────── |
| MEDIUM | setup/auto.ts | 598 | // ─── first-chat step ─────────────────────────────────────────────────── |
| MEDIUM | setup/auto.ts | 705 | // ─── auth step (select → branch) ──────────────────────────────────────── |
| MEDIUM | setup/auto.ts | 952 | // ─── timezone step ───────────────────────────────────────────────────── |
| MEDIUM | setup/auto.ts | 1078 | // ─── prompts owned by the sequencer ──────────────────────────────────── |
| MEDIUM | setup/auto.ts | 1164 | // ─── interactive / env helpers ───────────────────────────────────────── |
| MEDIUM | setup/auto.ts | 1260 | // ─── intro + progression-log init ────────────────────────────────────── |
| MEDIUM | setup/migrate-v2/shared.ts | 5 | // ── JID parsing ───────────────────────────────────────────────────────── |
| MEDIUM | setup/migrate-v2/shared.ts | 98 | // ── Trigger mapping ───────────────────────────────────────────────────── |
| MEDIUM | setup/migrate-v2/shared.ts | 128 | // ── ID generation ─────────────────────────────────────────────────────── |
| MEDIUM | setup/migrate-v2/shared.ts | 134 | // ── Channel auth registry ─────────────────────────────────────────────── |
| MEDIUM | setup/lib/setup-config.ts | 137 | // ─── name derivation ─────────────────────────────────────────────────── |
| MEDIUM | setup/lib/teams-manifest.ts | 111 | // ─── Minimal PNG encoder (solid color, no external deps) ────────────────── |
| MEDIUM | setup/channels/teams.ts | 124 | // ─── step: intro / prereqs ────────────────────────────────────────────── |
| MEDIUM | setup/channels/teams.ts | 187 | // ─── step: public URL ────────────────────────────────────────────────── |
| MEDIUM | setup/channels/teams.ts | 240 | // ─── step: Azure App Registration ────────────────────────────────────── |
| MEDIUM | setup/channels/teams.ts | 326 | // ─── step: client secret ─────────────────────────────────────────────── |
| MEDIUM | setup/channels/teams.ts | 385 | // ─── step: Azure Bot resource ────────────────────────────────────────── |
| MEDIUM | setup/channels/teams.ts | 437 | // ─── step: enable Teams channel ──────────────────────────────────────── |
| MEDIUM | setup/channels/teams.ts | 464 | // ─── step: manifest zip ──────────────────────────────────────────────── |
| MEDIUM | setup/channels/teams.ts | 508 | // ─── step: sideload ──────────────────────────────────────────────────── |
| MEDIUM | setup/channels/teams.ts | 540 | // ─── step: install adapter ───────────────────────────────────────────── |
| MEDIUM | setup/channels/teams.ts | 577 | // ─── post-install: hand off to Claude for the final wiring ──────────── |
| MEDIUM | setup/channels/teams.ts | 644 | // ─── shared step gate ────────────────────────────────────────────────── |
| MEDIUM | setup/channels/teams.ts | 708 | // ─── shared: UUID paste with help escape ─────────────────────────────── |
| MEDIUM | setup/channels/teams.ts | 744 | // ─── path helpers ────────────────────────────────────────────────────── |
| MEDIUM | docs/ollama.md | 15 | │ http://host.docker. │ ┌──────────────────┐ |
| MEDIUM | src/host-sweep.test.ts | 157 | // ───────────────────────────────────────────────────────────────────────────── |
| MEDIUM | src/host-sweep.test.ts | 168 | // ───────────────────────────────────────────────────────────────────────────── |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | setup/environment.ts | 38 | export function detectExistingDisplayName(projectRoot: string): string | null { |
| LOW | setup/onecli.ts | 124 | function removeLegacyOnecliContainers(): string { |
| LOW | setup/channels/imessage.ts | 186 | async function walkThroughFullDiskAccess(): Promise<void> { |
| LOW | setup/channels/discord.ts | 186 | function showTokenLocationReminder(hasExistingBot: boolean): void { |
| LOW | setup/channels/discord.ts | 219 | async function walkThroughServerCreation(): Promise<void> { |
| LOW | setup/channels/discord.ts | 407 | async function promptForUserIdWithDevMode(): Promise<string> { |
| LOW | setup/channels/whatsapp.ts | 437 | function writeAssistantHasOwnNumber(): void { |
| LOW | docs/SPEC.md | 152 | export function getRegisteredChannelNames(): string[] { |
| LOW | container/agent-runner/src/poll-loop.ts | 265 | function formatMessagesWithCommands(messages: MessageInRow[], nativeSlashCommands: boolean): string { |
| LOW | container/agent-runner/src/destinations.ts | 82 | export function buildSystemPromptAddendum(assistantName?: string): string { |
| LOW | container/agent-runner/src/db/session-state.ts | 52 | export function migrateLegacyContinuation(providerName: string): string | undefined { |
| LOW | container/agent-runner/src/db/connection.ts | 136 | export function clearContainerToolInFlight(): void { |
| LOW | src/host-sweep.ts | 228 | function enforceRunningContainerSla( |
| LOW | src/container-restart.ts | 21 | export function restartAgentGroupContainers(agentGroupId: string, reason: string, wakeMessage?: string): number { |
| LOW | src/claude-md-compose.ts | 152 | export function migrateGroupsToClaudeLocal(): void { |
| LOW | src/container-runtime.ts | 37 | export function ensureContainerRuntimeRunning(): void { |
| LOW | src/container-runner.ts | 225 | function resolveProviderContribution( |
| LOW | src/providers/provider-container-registry.ts | 45 | export function registerProviderContainerConfig(name: string, fn: ProviderContainerConfigFn): void { |
| LOW | src/providers/provider-container-registry.ts | 52 | export function getProviderContainerConfig(name: string): ProviderContainerConfigFn | undefined { |
| LOW | src/providers/provider-container-registry.ts | 56 | export function listProviderContainerConfigNames(): string[] { |
| LOW | src/cli/resources/destinations.ts | 18 | async function projectDestinationsToSessions(agentGroupId: string): Promise<void> { |
| LOW | src/cli/commands/help.ts | 73 | export function registerResourceHelpCommands(): void { |
| LOW | src/db/session-db.ts | 213 | export function deleteOrphanProcessingClaims(outDb: Database.Database): number { |
| LOW | src/db/session-db.ts | 340 | export function getInboundSourceSessionId(db: Database.Database, messageId: string): string | null { |
| LOW | src/db/session-db.ts | 358 | export function getMostRecentPeerSourceSessionId(db: Database.Database, peerAgentGroupId: string): string | null { |
| LOW | src/db/container-configs.ts | 53 | export function updateContainerConfigScalars( |
| LOW | src/db/container-configs.ts | 83 | export function updateContainerConfigJson( |
| LOW | src/db/sessions.ts | 183 | export function updatePendingApprovalStatus(approvalId: string, status: PendingApproval['status']): void { |
| LOW | src/db/sessions.ts | 191 | export function getPendingApprovalsByAction(action: string): PendingApproval[] { |
| LOW | src/db/messaging-groups.ts | 34 | export function getMessagingGroupByPlatform(channelType: string, platformId: string): MessagingGroup | undefined { |
| LOW | src/db/messaging-groups.ts | 53 | export function getMessagingGroupWithAgentCount( |
| LOW | src/db/messaging-groups.ts | 75 | export function getMessagingGroupsByChannel(channelType: string): MessagingGroup[] { |
| LOW | src/db/messaging-groups.ts | 113 | export function setMessagingGroupDeniedAt(id: string, deniedAt: string | null): void { |
| LOW | src/db/messaging-groups.ts | 132 | export function createMessagingGroupAgent(mga: MessagingGroupAgent): void { |
| LOW | src/db/messaging-groups.ts | 199 | export function getMessagingGroupAgentByPair( |
| LOW | src/db/messaging-groups.ts | 214 | export function updateMessagingGroupAgent( |
| LOW | src/db/messaging-groups.ts | 239 | export function deleteMessagingGroupAgent(id: string): void { |
| LOW | src/db/messaging-groups.ts | 244 | export function getMessagingGroupsByAgentGroup(agentGroupId: string): MessagingGroup[] { |
| LOW | src/modules/mount-security/index.ts | 361 | export function generateAllowlistTemplate(): string { |
| LOW | src/modules/permissions/channel-approval.ts | 80 | function visibleAgentGroupsForApprover( |
| LOW | src/modules/permissions/channel-approval.ts | 254 | export function buildAgentSelectionOptions( |
| LOW | src/modules/permissions/index.ts | 225 | async function handleSenderApprovalResponse(payload: ResponsePayload): Promise<boolean> { |
| LOW | src/modules/permissions/index.ts | 310 | async function handleChannelApprovalResponse(payload: ResponsePayload): Promise<boolean> { |
| LOW | src/modules/permissions/db/pending-channel-approvals.ts | 26 | export function createPendingChannelApproval(row: PendingChannelApproval): void { |
| LOW | src/modules/permissions/db/pending-channel-approvals.ts | 41 | export function getPendingChannelApproval(messagingGroupId: string): PendingChannelApproval | undefined { |
| LOW | src/modules/permissions/db/pending-channel-approvals.ts | 47 | export function hasInFlightChannelApproval(messagingGroupId: string): boolean { |
| LOW | src/modules/permissions/db/pending-channel-approvals.ts | 54 | export function updatePendingChannelApprovalCard(messagingGroupId: string, title: string, optionsJson: string): void { |
| LOW | src/modules/permissions/db/pending-channel-approvals.ts | 60 | export function deletePendingChannelApproval(messagingGroupId: string): void { |
| LOW | src/modules/permissions/db/pending-sender-approvals.ts | 28 | export function createPendingSenderApproval(row: PendingSenderApproval): void { |
| LOW | src/modules/permissions/db/pending-sender-approvals.ts | 51 | export function hasInFlightSenderApproval(messagingGroupId: string, senderIdentity: string): boolean { |
| LOW | src/modules/permissions/db/pending-sender-approvals.ts | 58 | export function deletePendingSenderApproval(id: string): void { |
| LOW | src/modules/agent-to-agent/db/agent-destinations.ts | 107 | export function deleteAllDestinationsTouching(agentGroupId: string): void { |
| LOW | src/modules/agent-to-agent/db/agent-destinations.ts | 120 | export function getDestinationReferencers(targetAgentGroupId: string): string[] { |
| LOW | src/modules/typing/index.ts | 154 | export function pauseTypingRefreshAfterDelivery(sessionId: string): void { |
| LOW | src/modules/interactive/index.ts | 20 | async function handleInteractiveResponse(payload: ResponsePayload): Promise<boolean> { |
| LOW | src/modules/approvals/onecli-approvals.ts | 85 | export function startOneCLIApprovalHandler(deliveryAdapter: ChannelDeliveryAdapter): void { |
| LOW | src/modules/approvals/onecli-approvals.ts | 103 | export function stopOneCLIApprovalHandler(): void { |
| LOW | src/channels/channel-registry.ts | 40 | export function getRegisteredChannelNames(): string[] { |
| LOW | src/channels/channel-registry.ts | 45 | export function getChannelContainerConfig(name: string): ChannelRegistration['containerConfig'] { |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | setup.sh | 1 | #!/bin/bash |
| LOW | nanoclaw.sh | 1 | #!/usr/bin/env bash |
| LOW | migrate-v2.sh | 1 | #!/usr/bin/env bash |
| LOW | migrate-v2-reset.sh | 1 | #!/usr/bin/env bash |
| LOW | setup/add-discord.sh | 1 | #!/usr/bin/env bash |
| LOW | setup/add-telegram.sh | 1 | #!/usr/bin/env bash |
| LOW | setup/install-matrix.sh | 1 | #!/usr/bin/env bash |
| LOW | setup/add-teams.sh | 1 | #!/usr/bin/env bash |
| LOW | setup/add-imessage.sh | 1 | #!/usr/bin/env bash |
| LOW | setup/probe.sh | 1 | #!/bin/bash |
| LOW | setup/register-claude-token.sh | 1 | #!/usr/bin/env bash |
| LOW | setup/install-signal-cli.sh | 1 | #!/usr/bin/env bash |
| LOW | setup/install-claude.sh | 1 | #!/usr/bin/env bash |
| LOW | setup/install-linear.sh | 1 | #!/usr/bin/env bash |
| LOW | setup/install-whatsapp.sh | 1 | #!/usr/bin/env bash |
| LOW | setup/add-signal.sh | 1 | #!/usr/bin/env bash |
| LOW | setup/add-whatsapp.sh | 1 | #!/usr/bin/env bash |
| LOW | setup/add-slack.sh | 1 | #!/usr/bin/env bash |
| LOW | setup/lib/install-slug.sh | 1 | # install-slug.sh — shell mirror of setup/lib/install-slug.ts. |
| LOW | setup/lib/channels-remote.sh | 1 | # channels-remote.sh — resolve the git remote that carries the `channels` |
| LOW | setup/lib/diagnostics.sh | 1 | # diagnostics.sh — shared PostHog emitter for bash-side setup code. |
| LOW | container/build.sh | 1 | #!/bin/bash |
| LOW | container/entrypoint.sh | 1 | #!/bin/bash |
| LOW | container/agent-runner/src/poll-loop.ts | 341 | // Skip system messages (MCP tool responses). |
| LOW | container/agent-runner/src/poll-loop.ts | 421 | try { |
| LOW | scripts/cleanup-sessions.sh | 1 | #!/bin/bash |
| LOW | src/delivery.ts | 261 | // Guarded by the channel_type check. If the module isn't installed the |
| LOW | src/delivery.ts | 281 | // targeting that messaging group. createMessagingGroupAgent() inserts |
| LOW | src/providers/index.ts | 1 | // Host-side provider container-config barrel. |
| LOW | src/cli/dispatch.ts | 141 | // - `list` → drop rows that don't belong to the caller's agent group |
| LOW | src/db/messaging-groups.ts | 141 | @id, @messaging_group_id, @agent_group_id, |
| LOW | src/channels/chat-sdk-bridge.ts | 521 | return true; |
| LOW | src/channels/index.ts | 1 | // Channel self-registration barrel. |
| Severity | File | Line | Snippet |
|---|---|---|---|
| HIGH | .claude/skills/add-imessage/SKILL.md | 95 | IMESSAGE_API_KEY=your-api-key |
| Severity | File | Line | Snippet |
|---|---|---|---|
| MEDIUM | setup/signal-auth.ts | 158 | // rather than scraping stdout — more robust across signal-cli versions. |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | migrate-v2.sh | 597 | # Check if v1 service is running |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | container/skills/agent-browser/SKILL.md | 144 | agent-browser fill @e1 "user@example.com" |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | repo-tokens/action.yml | 92 | except Exception as e: |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | src/modules/approvals/onecli-approvals.ts | 113 | async function handleRequest(request: ApprovalRequest): Promise<Decision> { |