{"id":40712837,"url":"https://github.com/btouchard/ackify-ce","last_synced_at":"2026-01-21T13:00:53.992Z","repository":{"id":314089183,"uuid":"1054246528","full_name":"btouchard/ackify-ce","owner":"btouchard","description":"🔏 Proof of Read. Compliance made simple.","archived":false,"fork":false,"pushed_at":"2026-01-20T14:40:44.000Z","size":34262,"stargazers_count":180,"open_issues_count":0,"forks_count":6,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-01-20T18:47:21.178Z","etag":null,"topics":["acknowledgments","audit-trail","compliance","document-management","document-tracking","enterprise","enterprise-solutions","gdpr-compliance","open-source","policy-management","rgpd"],"latest_commit_sha":null,"homepage":"https://ackify.eu","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/btouchard.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":"COPYRIGHT","agents":null,"dco":null,"cla":null},"funding":{"github":null,"patreon":"benjamin_touchard","open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":null,"thanks_dev":null,"custom":null}},"created_at":"2025-09-10T15:08:38.000Z","updated_at":"2026-01-20T14:43:32.000Z","dependencies_parsed_at":"2026-01-20T11:15:51.582Z","dependency_job_id":null,"html_url":"https://github.com/btouchard/ackify-ce","commit_stats":null,"previous_names":["btouchard/ackify","btouchard/ackify-ce"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/btouchard/ackify-ce","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/btouchard%2Fackify-ce","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/btouchard%2Fackify-ce/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/btouchard%2Fackify-ce/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/btouchard%2Fackify-ce/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/btouchard","download_url":"https://codeload.github.com/btouchard/ackify-ce/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/btouchard%2Fackify-ce/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28633747,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-21T04:47:28.174Z","status":"ssl_error","status_checked_at":"2026-01-21T04:47:22.943Z","response_time":86,"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":["acknowledgments","audit-trail","compliance","document-management","document-tracking","enterprise","enterprise-solutions","gdpr-compliance","open-source","policy-management","rgpd"],"created_at":"2026-01-21T13:00:21.442Z","updated_at":"2026-01-21T13:00:53.984Z","avatar_url":"https://github.com/btouchard.png","language":"Go","funding_links":["https://patreon.com/benjamin_touchard"],"categories":[],"sub_categories":[],"readme":"# 🔐 Ackify\n\n\u003e **Proof of Read. Compliance made simple.**\n\nSecure document reading validation with cryptographic signatures and irrefutable proof.\n\n[![Build](https://github.com/btouchard/ackify-ce/actions/workflows/ci.yml/badge.svg)](https://github.com/btouchard/ackify-ce/actions/workflows/ci.yml)\n[![codecov](https://codecov.io/gh/btouchard/ackify-ce/branch/main/graph/badge.svg)](https://codecov.io/gh/btouchard/ackify-ce)\n[![Security](https://img.shields.io/badge/crypto-Ed25519-blue.svg)](https://en.wikipedia.org/wiki/EdDSA)\n[![Go](https://img.shields.io/badge/go-1.24.5-blue.svg)](https://golang.org/)\n[![License](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](LICENSE)\n\n\u003e 🇫🇷 [Version française disponible ici](README_FR.md)\n\n**Website**: https://www.ackify.eu\n\n---\n\n## 🎯 Why Ackify?\n\nProve that collaborators have read and acknowledged important documents with **Ed25519 cryptographic signatures**.\n\n**Use Cases**:\n- Security policy validation\n- Training attestations\n- GDPR acknowledgment\n- Contractual agreements\n- Compliance procedures\n\n**Key Features**:\n- ✅ Ed25519 cryptographic signatures\n- ✅ **Flexible authentication**: OAuth2 (Google, GitHub, GitLab, custom) or MagicLink (passwordless email)\n- ✅ One signature per user/document (database enforced)\n- ✅ Immutable audit trail\n- ✅ Expected signers tracking with email reminders\n- ✅ Document checksum verification (SHA-256/512, MD5)\n- ✅ Optional document storage (local filesystem or S3-compatible)\n- ✅ Public embeddable widgets (Notion, Outline, etc.)\n- ✅ Admin dashboard (Vue.js 3 + dark mode)\n- ✅ Multilingual (fr, en, es, de, it)\n\n---\n\n## ⚡ Quick Start\n\n### Prerequisites\n\n- Docker \u0026 Docker Compose\n- **At least ONE authentication method**:\n  - OAuth2 credentials (Google, GitHub, or GitLab), OR\n  - SMTP server for MagicLink (passwordless email authentication)\n\n### Installation\n\n#### Option 1: Automated Installation Script (Recommended)\n\n```bash\n# Download and run installation script\nbash \u003c(curl -fsSL https://raw.githubusercontent.com/btouchard/ackify-ce/main/install/install.sh)\n\n# Navigate to installation directory\ncd ackify-ce\n\n# Edit configuration with your OAuth2 credentials\nnano .env\n\n# Start services\ndocker compose up -d\n\n# Access web interface\nopen http://localhost:8080\n```\n\n**What the script does:**\n- Downloads `compose.yml` and `.env.example`\n- Generates secure secrets automatically:\n  - `ACKIFY_OAUTH_COOKIE_SECRET` (AES-256 session encryption)\n  - `POSTGRES_PASSWORD` (database password)\n- Creates ready-to-use `.env` file\n- You only need to add your OAuth2 credentials\n\n#### Option 2: Manual Installation\n\n```bash\n# Clone repository\ngit clone https://github.com/btouchard/ackify-ce.git\ncd ackify-ce\n\n# Configure\ncp .env.example .env\nnano .env  # Edit with your OAuth2 credentials and generate secrets\n\n# Start services\ndocker compose up -d\n\n# Verify\ncurl http://localhost:8080/api/v1/health\n# Expected: {\"status\":\"healthy\",\"database\":\"connected\"}\n\n# Access web interface\nopen http://localhost:8080\n```\n\n### Required Environment Variables\n\n```bash\n# Application\nAPP_DNS=sign.your-domain.com\nACKIFY_BASE_URL=https://sign.your-domain.com\nACKIFY_ORGANISATION=\"Your Organization\"\n\n# Database\nPOSTGRES_USER=ackifyr\nPOSTGRES_PASSWORD=your_secure_password\nPOSTGRES_DB=ackify\n\n# Security (generate with: openssl rand -base64 32)\nACKIFY_OAUTH_COOKIE_SECRET=your_base64_secret\n\n# ============================================================================\n# Authentication (choose AT LEAST ONE method)\n# ============================================================================\n\n# Option 1: OAuth2 (Google, GitHub, GitLab, custom)\nACKIFY_OAUTH_PROVIDER=google\nACKIFY_OAUTH_CLIENT_ID=your_client_id\nACKIFY_OAUTH_CLIENT_SECRET=your_client_secret\n\n# Option 2: MagicLink (passwordless email authentication)\n# ACKIFY_MAIL_HOST=smtp.example.com\n# ACKIFY_MAIL_PORT=587\n# ACKIFY_MAIL_USERNAME=your_smtp_username\n# ACKIFY_MAIL_PASSWORD=your_smtp_password\n# ACKIFY_MAIL_FROM=noreply@example.com\n```\n\n**Auto-detection**:\n- OAuth is enabled automatically if `ACKIFY_OAUTH_CLIENT_ID` and `ACKIFY_OAUTH_CLIENT_SECRET` are set\n- MagicLink is enabled automatically if `ACKIFY_MAIL_HOST` is configured\n- You can use **both methods simultaneously** for maximum flexibility\n\nSee [docs/en/configuration.md](docs/en/configuration.md) for all options.\n\n---\n\n## 📸 Screenshots\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\u003cstrong\u003eHome\u003c/strong\u003e\u003cbr\u003e\u003ca href=\"screenshots/1-home.png\"\u003e\u003cimg src=\"screenshots/1-home.png\" width=\"200\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003cstrong\u003eDocument Upload\u003c/strong\u003e\u003cbr\u003e\u003ca href=\"screenshots/2-new-doc-upload.png\"\u003e\u003cimg src=\"screenshots/2-new-doc-upload.png\" width=\"200\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003cstrong\u003eAdd Readers\u003c/strong\u003e\u003cbr\u003e\u003ca href=\"screenshots/3-add-confirm-request.png\"\u003e\u003cimg src=\"screenshots/3-add-confirm-request.png\" width=\"200\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003cstrong\u003eIntegrated Reader\u003c/strong\u003e\u003cbr\u003e\u003ca href=\"screenshots/4-internal-reader.png\"\u003e\u003cimg src=\"screenshots/4-internal-reader.png\" width=\"200\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd align=\"center\"\u003e\u003cstrong\u003eReading Confirmed\u003c/strong\u003e\u003cbr\u003e\u003ca href=\"screenshots/5-read-confirmed.png\"\u003e\u003cimg src=\"screenshots/5-read-confirmed.png\" width=\"200\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003cstrong\u003eMy Confirmations\u003c/strong\u003e\u003cbr\u003e\u003ca href=\"screenshots/6-all-my-confirmations.png\"\u003e\u003cimg src=\"screenshots/6-all-my-confirmations.png\" width=\"200\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003cstrong\u003eMy Documents\u003c/strong\u003e\u003cbr\u003e\u003ca href=\"screenshots/7-manage-my-docs.png\"\u003e\u003cimg src=\"screenshots/7-manage-my-docs.png\" width=\"200\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003ctd align=\"center\"\u003e\u003cstrong\u003eAdmin Settings\u003c/strong\u003e\u003cbr\u003e\u003ca href=\"screenshots/8-admin-settings.png\"\u003e\u003cimg src=\"screenshots/8-admin-settings.png\" width=\"200\"\u003e\u003c/a\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\n---\n\n## 📚 Documentation\n\n### Getting Started\n- **[Getting Started](docs/en/getting-started.md)** - Installation \u0026 first steps\n- **[Configuration](docs/en/configuration.md)** - Environment variables\n- **[OAuth Providers](docs/en/configuration/oauth-providers.md)** - Google, GitHub, GitLab, Custom\n- **[Email Setup](docs/en/configuration/email-setup.md)** - SMTP configuration\n\n### Features\n- **[Signatures](docs/en/features/signatures.md)** - Ed25519 cryptographic flow\n- **[Expected Signers](docs/en/features/expected-signers.md)** - Tracking \u0026 reminders\n- **[Checksums](docs/en/features/checksums.md)** - Document integrity verification\n- **[Document Storage](docs/en/features/storage.md)** - Optional upload (local or S3)\n- **[Embedding](docs/en/features/embedding.md)** - oEmbed, iframes, integrations\n- **[i18n](docs/en/features/i18n.md)** - Internationalization (5 languages)\n\n### Technical\n- **[Architecture](docs/en/architecture.md)** - Tech stack \u0026 design principles\n- **[Database](docs/en/database.md)** - PostgreSQL schema \u0026 migrations\n- **[API Reference](docs/en/api.md)** - REST endpoints \u0026 examples\n- **[Deployment](docs/en/deployment.md)** - Production with Docker Compose\n- **[Development](docs/en/development.md)** - Contributing \u0026 setup\n\n---\n\n## 🚀 Usage\n\n### Request a Signature\n\n```\nhttps://your-domain.com/?doc=security_policy_2025\n```\n\nUser authenticates (OAuth2 or MagicLink) and signs with one click.\n\n### Embed in Your Tools\n\n**iFrame**:\n```html\n\u003ciframe src=\"https://your-domain.com/embed?doc=policy_2025\"\n        width=\"600\" height=\"200\" frameborder=\"0\"\u003e\u003c/iframe\u003e\n```\n\n**oEmbed** (Notion, Outline, Confluence):\n```\nPaste the embed URL: https://your-domain.com/embed?doc=policy_2025\nAutomatic embed via oEmbed discovery\n```\n\n**Open Graph** (Slack, Teams):\n```\nPaste direct URL: https://your-domain.com/?doc=policy_2025\nURL unfurls automatically with signature count\n```\n\n\u003e **Important**: Use `/embed?doc=...` for iframe integrations (Notion, Outline) and `/?doc=...` for direct links (emails, Slack).\n\nSee [docs/en/features/embedding.md](docs/en/features/embedding.md) for details.\n\n---\n\n## 🛡️ Security\n\n- **Ed25519** - State-of-the-art elliptic curve signatures\n- **SHA-256** - Payload hashing for tampering detection\n- **PKCE** - OAuth2 security (automatic)\n- **AES-256-GCM** - Encrypted refresh tokens\n- **Immutable timestamps** - PostgreSQL triggers\n- **Rate limiting** - 5 auth/min, 100 req/min\n- **HTTPS enforced** - Secure cookies only\n\nSee [docs/en/architecture.md](docs/en/architecture.md) for full security details.\n\n---\n\n## 🔧 Tech Stack\n\n**Backend**: Go 1.24.5, PostgreSQL 16, Chi Router, OAuth2, Ed25519\n\n**Frontend**: Vue 3, TypeScript, Vite, Pinia, Tailwind CSS, shadcn/vue\n\n**DevOps**: Docker, Multi-stage builds, Distroless image (\u003c 30MB)\n\n**i18n**: 5 languages (fr, en, es, de, it)\n\n**Coverage**: 72.6% (180+ unit tests, 33 integration tests)\n\n---\n\n## 🤝 Support\n\n- **Issues**: [GitHub Issues](https://github.com/btouchard/ackify-ce/issues)\n- **Discussions**: [GitHub Discussions](https://github.com/btouchard/ackify-ce/discussions)\n- **Email**: contact@ackify.eu\n\n---\n\n## 📄 License\n\nAGPLv3 - See [LICENSE](LICENSE) for details.\n\n---\n\n**Developed with ❤️ by [Benjamin TOUCHARD](https://www.kolapsis.com)**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbtouchard%2Fackify-ce","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbtouchard%2Fackify-ce","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbtouchard%2Fackify-ce/lists"}