{"id":39269053,"url":"https://github.com/karloscodes/fusionaly-oss","last_synced_at":"2026-04-02T14:10:03.536Z","repository":{"id":332434628,"uuid":"1118432356","full_name":"karloscodes/fusionaly-oss","owner":"karloscodes","description":"Single tenant and self-hosted analytics","archived":false,"fork":false,"pushed_at":"2026-03-21T18:29:38.000Z","size":6119,"stargazers_count":5,"open_issues_count":6,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-22T01:43:03.113Z","etag":null,"topics":["golang","sqlite","web-analytics"],"latest_commit_sha":null,"homepage":"https://fusionaly.com","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/karloscodes.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"docs/SECURITY_SEC_FETCH.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-12-17T18:42:11.000Z","updated_at":"2026-03-21T10:05:02.000Z","dependencies_parsed_at":"2026-02-20T20:01:38.032Z","dependency_job_id":null,"html_url":"https://github.com/karloscodes/fusionaly-oss","commit_stats":null,"previous_names":["karloscodes/fusionaly-oss"],"tags_count":82,"template":false,"template_full_name":null,"purl":"pkg:github/karloscodes/fusionaly-oss","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/karloscodes%2Ffusionaly-oss","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/karloscodes%2Ffusionaly-oss/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/karloscodes%2Ffusionaly-oss/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/karloscodes%2Ffusionaly-oss/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/karloscodes","download_url":"https://codeload.github.com/karloscodes/fusionaly-oss/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/karloscodes%2Ffusionaly-oss/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31307585,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T12:59:32.332Z","status":"ssl_error","status_checked_at":"2026-04-02T12:54:48.875Z","response_time":89,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["golang","sqlite","web-analytics"],"created_at":"2026-01-18T00:43:04.206Z","updated_at":"2026-04-02T14:10:03.494Z","avatar_url":"https://github.com/karloscodes.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Fusionaly\n\n[![Latest Release](https://img.shields.io/github/v/release/karloscodes/fusionaly-oss)](https://github.com/karloscodes/fusionaly-oss/releases/latest)\n[![License: AGPL-3.0](https://img.shields.io/github/license/karloscodes/fusionaly-oss)](./LICENSE)\n[![CI](https://github.com/karloscodes/fusionaly-oss/actions/workflows/pr.yml/badge.svg)](https://github.com/karloscodes/fusionaly-oss/actions)\n[![Docker](https://img.shields.io/docker/pulls/karloscodes/fusionaly)](https://hub.docker.com/r/karloscodes/fusionaly)\n\nPrivacy-first, self-hosted web analytics. No cookies, no fingerprinting, no personal data stored.\n\n**One script tag. One attribute. You own everything.**\n\n[Website](https://fusionaly.com) · [Documentation](https://fusionaly.com/docs) · [Installation](https://fusionaly.com/docs/installation/) · [Free vs Pro](https://fusionaly.com/docs/editions/)\n\n---\n\n## Install\n\n```bash\ncurl -fsSL https://fusionaly.com/install | bash\n```\n\nOr with Docker:\n\n```bash\ndocker pull karloscodes/fusionaly:latest\n```\n\nSee the [Installation Guide](https://fusionaly.com/docs/installation/) for full setup instructions.\n\n## How It Works\n\nAdd the tracking script to your site:\n\n```html\n\u003cscript defer src=\"https://your-domain.com/y/api/v1/sdk.js\"\u003e\u003c/script\u003e\n```\n\nPage views and button clicks are tracked automatically. Want more? One attribute works on any element:\n\n```html\n\u003cbutton data-fusionaly-event-name=\"signup_clicked\"\u003eSign Up\u003c/button\u003e\n\u003ca href=\"/pricing\" data-fusionaly-event-name=\"pricing_viewed\"\u003ePricing\u003c/a\u003e\n\u003cform data-fusionaly-event-name=\"contact_submitted\"\u003e...\u003c/form\u003e\n\u003csection data-fusionaly-event-name=\"testimonials_seen\"\u003e...\u003c/section\u003e\n```\n\nThe SDK does the right thing based on element type — click, submit, sendBeacon, or scroll into view. [Read the docs](https://fusionaly.com/docs/automated-tracking/).\n\n## Features\n\n- **Page views \u0026 SPA navigation** — automatic, zero config\n- **Button \u0026 link tracking** — automatic or named with one attribute\n- **Form tracking** — tracks on submit, suppresses button double-events\n- **Section tracking** — fires when scrolled into view (50% visible)\n- **Revenue tracking** — purchases with price, currency, metadata\n- **Custom events** — JavaScript API for dynamic data\n- **Goal conversions** — track signups, purchases, any event as a goal\n- **User flows** — see how visitors navigate entry to exit\n- **Annotations** — mark deployments, campaigns, incidents on your timeline\n- **Shareable dashboards** — public links to your analytics\n- **Bot filtering \u0026 spam protection** — clean data by default\n- **Subdomain tracking** — first-party, ad-block proof\n\n## Tech Stack\n\n- **Backend**: Go, Fiber, GORM, SQLite\n- **Frontend**: React, Inertia.js, Tailwind CSS, shadcn/ui\n- **Testing**: Go testing, Playwright E2E\n\n## Development\n\n**Requirements:** Go 1.25+, Node.js 22+, SQLite\n\n```bash\nmake install      # Install dependencies\nmake db-migrate   # Apply migrations\nmake dev          # Start dev server (hot reload)\n```\n\nAccess at `http://localhost:3000`\n\n```bash\nmake test         # Unit tests (~3s)\nmake test-e2e     # Playwright E2E (~5min)\nmake lint         # Run linters\nmake build        # Production binaries\n```\n\n## Project Structure\n\n```\nfusionaly/\n├── cmd/\n│   ├── fusionaly/     # Main server binary\n│   ├── fnctl/         # CLI tool (migrations, admin tasks)\n│   └── manager/       # Production manager (health checks, upgrades)\n├── internal/          # Core business logic (Phoenix Contexts pattern)\n├── api/v1/            # Public tracking API + SDK\n├── web/               # React frontend (Inertia.js + Tailwind)\n├── e2e/               # Playwright E2E tests\n└── storage/           # Runtime data (database, GeoLite2)\n```\n\n## Configuration\n\nDefaults work out of the box for development.\n\nFor production, set:\n- `FUSIONALY_DOMAIN` — your domain name\n- `FUSIONALY_PRIVATE_KEY` — generate with `openssl rand -hex 32`\n\nSee [Installation Guide](https://fusionaly.com/docs/installation/) for Docker setup and [SDK Configuration](https://fusionaly.com/docs/configuration/) for tracking options.\n\n## Contributing\n\n1. **Open an issue first** — discuss features or significant changes before starting\n2. **Bug fixes** — PRs welcome with clear problem/solution description\n3. **Run `make lint`** before submitting\n4. **Run `make test` and `make test-e2e`** to verify changes\n\n## License\n\n[AGPL-3.0](./LICENSE)\n\n---\n\n[Website](https://fusionaly.com) · [Docs](https://fusionaly.com/docs) · [Issues](https://github.com/karloscodes/fusionaly-oss/issues) · [Docker Hub](https://hub.docker.com/r/karloscodes/fusionaly)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkarloscodes%2Ffusionaly-oss","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkarloscodes%2Ffusionaly-oss","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkarloscodes%2Ffusionaly-oss/lists"}