Thanks for considering contributing to Powernode! This document covers how to get involved — filing issues, submitting changes, and the conventions we follow.
This project adheres to the Contributor Covenant Code of Conduct. By participating, you're expected to uphold this code. Report unacceptable behavior by opening a private GitHub Security Advisory on this repository (Settings → Security → Report a vulnerability — works for conduct issues too) or via GitHub Discussions for non-sensitive matters.
- Read
CLAUDE.md— it covers the architecture, conventions, MCP-first workflow, and platform organization. The file is named for the AI assistant we use during development, but the conventions apply to all contributors. - Follow setup in
README.mdfor installing dependencies and running the platform locally. - Set up extension frontend symlinks (one-time, after
cd frontend && npm install):This creates./scripts/setup-extension-frontend-symlinks.sh
extensions/<ext>/frontend/node_modulessymlinks to the parent'sfrontend/node_modulesso extension Jest tests can resolve dependencies. The symlinks are gitignored; the script is idempotent. - Run the test suite to confirm your environment works:
cd server && bundle exec rspec --format progress cd frontend && CI=true npm test
server/— Rails 8 API backendfrontend/— React 19 / TypeScript frontendworker/— Standalone Sidekiq worker (HTTP-only API to server, never imports server code)extensions/— Optional feature extensions:business(billing/SaaS),marketing(campaigns/landing pages),system(fleet/edge),trading,supply-chaindocs/— Architecture, feature, and platform documentationscripts/— Build, validation, and utility scripts
Use the appropriate template:
- Bug reports — for things that are broken (use the bug report template)
- Feature requests — for proposals (new capability, integration, or workflow)
- Security issues — DO NOT file as public issues. Open a private GitHub Security Advisory with details. We'll respond within 72 hours and coordinate disclosure.
Please search existing issues first to avoid duplicates.
- Fork the repo and create a feature branch from
develop:git checkout -b feature/your-change-name develop
- Branch strategy: PRs target
develop. The release flow isdevelop → release/x.y.z → master. - Make focused changes: one PR = one logical change. Smaller PRs review faster and ship sooner.
- Follow the conventions documented in
CLAUDE.md. Highlights:- Frontend permissions:
currentUser?.permissions?.includes('name')— NEVER check roles - Theme classes only:
bg-theme-*,text-theme-*— no hardcoded colors - API responses:
render_success()/render_error()— never barerender - Ruby pragma:
# frozen_string_literal: trueon every.rbfile - Frontend logging:
import { logger } from '@/shared/utils/logger'— noconsole.login production code - TypeScript: no
anytypes — proper types required
- Frontend permissions:
- Add tests for new behavior:
- Backend:
spec/(RSpec) — see existing patterns inspec/factories/,spec/support/ - Frontend:
*.test.tsx(Jest) — see existing component tests - E2E:
e2e/(Playwright) — seee2e/pages/for page objects
- Backend:
- Run validation before pushing:
Or for a quicker subset:
./scripts/validate.sh
./scripts/validate.sh --skip-tests - Commit messages:
type(scope): subject— e.g.,feat(marketing): add waitlist signup endpoint. See recentgit log --onelinefor style. - No AI-assistant attribution in commit messages (no "Co-Authored-By: Claude", etc.) — keep them clean.
- Bug fixes (especially with regression tests)
- Documentation improvements
- New extensions (see
extensions/for shape —system,marketing,business,trading) - Integration adapters: Claude Agent SDK, LangGraph, Mastra, OpenAI Agents SDK, AutoGen, Vercel AI SDK
- Performance improvements with measurements
- Test coverage in under-tested areas (the
extensions/business/spec/directory in particular) - Accessibility improvements with
data-testidand ARIA labels
- Cosmetic refactors without functional change
- Style-only PRs that fight existing patterns
- Breaking changes without prior issue discussion
- Auto-generated content (typo-fix bots, dependency-update spam unrelated to security)
- License changes (we're staying MIT — see
LICENSE)
- Read
CLAUDE.mdfor the full MCP-first workflow if you're using AI assistance - Run
cd frontend && npx tsc --noEmitafter TypeScript changes - Run
cd server && bundle exec rspec spec/path/to/relevant_spec.rbfor targeted backend specs - Never run the full RSpec suite — only changed-file specs (the suite is large and slow)
- Use
./scripts/validate.shas a pre-push checklist
Local services run via systemd. After installing:
sudo scripts/systemd/powernode-installer.sh install
sudo systemctl start powernode.targetThen journalctl -u powernode-backend@default -f to tail logs.
Never use manual commands (rails server, sidekiq, npm start) for production workflows — they bypass the health-check infrastructure.
- GitHub Issues — best for bugs and feature requests
- GitHub Discussions — best for design questions, ideas, "is this approach right?"
- GitHub Security Advisories — for private questions or security reports
By contributing, you agree that your contributions will be licensed under the MIT License (see LICENSE).
Thanks for being part of Powernode!