.claude/skills/fusionaly-boundaries/SKILL.md
Use when working on Fusionaly OSS or Pro - enforces clean separation between repos, prevents Pro features in OSS, forbids modifying OSS from Pro
npx skillsauth add karloscodes/fusionaly-oss fusionaly-boundariesInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Fusionaly has two repos with strict boundaries. OSS is the open-source core. Pro extends OSS via git submodule without modifying it.
fusionaly-oss/ # Standalone open-source product
├── app/ # Public API (Pro imports from here)
├── internal/ # OSS internals (Pro cannot import)
└── web/src/ # OSS React components
fusionaly-pro/ # Commercial extension
├── oss/ # Git submodule → fusionaly-oss (READ-ONLY!)
├── internal/ # Pro-only code
└── web/src/ # Pro React components
| ✅ Do | ❌ Don't |
|-------|---------|
| Keep it fully standalone | Add AI/LLM features |
| Export via app/ package | Add license validation |
| Provide extension points | Reference Pro repo |
| Test with make test-e2e | Add "Pro" conditionals |
OSS must work without Pro. No AI, no licensing, no Pro feature flags.
| ✅ Do | ❌ Don't |
|-------|---------|
| Import from fusionaly/app | Import from fusionaly/internal/* |
| Override routes (Pro first) | Modify files in ./oss/ |
| Extend via props/hooks | Add functions to OSS "for Pro" |
| Test with make test-all | Commit OSS changes from Pro |
Pro extends OSS via public API only. Never edit the submodule directly.
// ✅ GOOD
import "fusionaly/app"
// ❌ FORBIDDEN
import "fusionaly/internal/analytics"
In OSS, stop if you're adding:
In Pro, stop if you're:
./oss/fusionaly/internal/*OSS provides hooks, Pro uses them:
// OSS: Provides extension point
func HandleDashboardWithExtension(ctx, component string, extender func(props) props) error {
props := buildProps(ctx)
if extender != nil {
props = extender(props) // Pro injects here
}
return render(component, props)
}
// Pro: Uses extension point
func proDashboardExtender(props map[string]any) map[string]any {
props["insights"] = ai.GetInsights() // Pro-only data
return props
}
make test && make test-e2emake update-oss to pull changes| Task | Location | Command |
|------|----------|---------|
| Add OSS feature | fusionaly-oss | make test |
| Add Pro feature | fusionaly-pro/internal | make test |
| Extend OSS behavior | Pro via fusionaly/app | make test-all |
| Update OSS in Pro | fusionaly-pro | make update-oss |
development
Use when user asks about website analytics, traffic, visitors, page views, referrers, or mentions "fusionaly". Queries Fusionaly analytics via SQL API.
development
Use after code changes, before releases, or when testing features - runs the right level of QA based on what changed
content-media
Use when styling Fusionaly UI components, pages, or charts - applies the Fusionaly design system with black/white palette and brand accents
testing
Use ONLY when explicitly invoked. Deploys Fusionaly to a new Hetzner server or an existing server, with optional hardening and Cloudflare DNS.