{"id":49007741,"url":"https://github.com/caveman8080/acmecertmanager","last_synced_at":"2026-05-05T23:05:06.468Z","repository":{"id":347490515,"uuid":"1193370443","full_name":"caveman8080/ACMECertManager","owner":"caveman8080","description":"Modern Windows GUI for Let's Encrypt certificates","archived":false,"fork":false,"pushed_at":"2026-04-24T21:58:10.000Z","size":369,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-24T22:38:03.064Z","etag":null,"topics":["acme-client","acme-v2","certificate-management","csharp","dns-01","dotnet","gui-application","http-01","letsencrypt","rfc-8555","tls-alpn-01","windows-arm64","windows-x64","windows-x86"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/caveman8080.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-27T06:33:41.000Z","updated_at":"2026-04-24T21:58:14.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/caveman8080/ACMECertManager","commit_stats":null,"previous_names":["caveman8080/acmecertmanager"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/caveman8080/ACMECertManager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/caveman8080%2FACMECertManager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/caveman8080%2FACMECertManager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/caveman8080%2FACMECertManager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/caveman8080%2FACMECertManager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/caveman8080","download_url":"https://codeload.github.com/caveman8080/ACMECertManager/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/caveman8080%2FACMECertManager/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32586189,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T06:36:36.687Z","status":"ssl_error","status_checked_at":"2026-05-03T06:36:09.306Z","response_time":103,"last_error":"SSL_read: 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":["acme-client","acme-v2","certificate-management","csharp","dns-01","dotnet","gui-application","http-01","letsencrypt","rfc-8555","tls-alpn-01","windows-arm64","windows-x64","windows-x86"],"created_at":"2026-04-18T21:12:16.219Z","updated_at":"2026-05-05T23:05:06.436Z","avatar_url":"https://github.com/caveman8080.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ACME Certificate Manager\n\n[![CI (.NET 10)](https://github.com/caveman8080/ACMECertManager/actions/workflows/ci.yml/badge.svg)](https://github.com/caveman8080/ACMECertManager/actions/workflows/ci.yml)\n[![CodeQL](https://github.com/caveman8080/ACMECertManager/actions/workflows/codeql.yml/badge.svg)](https://github.com/caveman8080/ACMECertManager/actions/workflows/codeql.yml)\n[![Dependabot Updates](https://github.com/caveman8080/ACMECertManager/actions/workflows/dependabot/dependabot-updates/badge.svg)](https://github.com/caveman8080/ACMECertManager/actions/workflows/dependabot/dependabot-updates)\n[![Release](https://github.com/caveman8080/ACMECertManager/actions/workflows/release.yml/badge.svg)](https://github.com/caveman8080/ACMECertManager/actions/workflows/release.yml)\n[![Channel Release](https://github.com/caveman8080/ACMECertManager/actions/workflows/channel-release.yml/badge.svg)](https://github.com/caveman8080/ACMECertManager/actions/workflows/channel-release.yml)\n\n**The friendliest Windows app for free Let's Encrypt certificates**  \n\n## ✅ Quick Start (30 seconds)\n1. Download the latest package from **Releases** for your architecture (win-x86, win-x64, or win-arm64)\n2. Extract the package and run `acm.exe`\n3. Go to “Issue New Certificate” tab and click the big button\n\n**Defaults to Let's Encrypt production** (real certificates). Use the advanced options in Issue New Certificate to switch to staging when testing.\n\n## Requirements\n- Minimum runtime for development and source builds: .NET 10 (net10.0-windows).\n- Minimum SDK for local build/test/publish commands: .NET SDK 10.0.\n- Windows 10/11.\n\n## Features\n- Dashboard with big friendly buttons\n- Issue wizard (domains, wildcards, HTTP-01 auto, DNS-01 plugin workflow)\n- Manage certificates (list, expiry, renew/revoke)\n- Logs tab with colored output\n- Runtime folders auto-created next to the executable (plugins/, logs/, certs/, storage/)\n- Self-contained single .exe (runs on any Windows 10/11)\n\n## Screenshots\n\n### Manage Certificates\n![Manage Certificates](docs/screenshots/manage-certificates.png)\n\n### Issue New Certificate\n![Issue New Certificate](docs/screenshots/issue-new-certificate.png)\n\n### Logs\n![Logs](docs/screenshots/logs.png)\n\n### Settings\n![Settings](docs/screenshots/settings.png)\n\n## Runtime Folder Layout\nAt startup the app creates these folders beside the executable:\n- plugins/ for DNS plugin DLL files\n- logs/ for persistent log files\n- certs/ for generated certificate files\n- storage/ for account/config/secrets JSON files\n\nLegacy root files are migrated to storage/ on startup.\n\nExpected extracted structure:\n- ACMECertManager/acm.exe\n- ACMECertManager/plugins/\n- ACMECertManager/logs/\n- ACMECertManager/certs/\n- ACMECertManager/storage/\n\n## Updating to a New Release\nUse an in-place upgrade so your certificates and settings stay intact.\n\nSimple update steps:\n1. Close ACMECertManager if it is running.\n2. Download the new release package for your architecture.\n3. Extract/copy the new files into your existing ACMECertManager folder.\n4. Allow overwrite of app binaries (including acm.exe).\n5. Make sure these folders are still present after update: plugins/, logs/, certs/, storage/.\n6. Launch acm.exe.\n\nWhat is preserved on upgrade (if you keep the same folder):\n- certs/ (issued certificate files)\n- storage/certificates.json (certificate list/metadata)\n- storage/acme-account.json (ACME account key)\n- storage/dns-secrets.json (saved DNS plugin credentials)\n- storage/ui-settings.json (UI settings)\n- logs/ (log history)\n- plugins/ (DNS plugin DLLs you added)\n\nWhat can be lost:\n- If you delete the old folder before copying the new release, you lose local data unless you backed up and restored certs/, storage/, logs/, and plugins/.\n- If certs/ is missing but storage/certificates.json exists, entries may remain but certificate files referenced by those entries may be missing.\n\n## DNS-01 Plugin Workflow\n1. Put provider DLLs in plugins/.\n2. Launch the app and open Issue New Certificate.\n3. Select DNS-01 and choose a plugin from the dropdown.\n4. Fill required plugin fields.\n5. Issue certificate.\n\nOperational sequence:\n1. Download the pre-built package for your architecture (x86, x64, ARM64).\n2. Extract the ACMECertManager directory from the archive.\n3. Verify acm.exe, plugins, logs, certs, and storage exist.\n4. Place desired DNS plugin DLLs into plugins/.\n5. Start the app to auto-scan and load plugin DLLs.\n6. Choose DNS-01 and select the plugin from the DNS dropdown.\n7. Enter plugin-required credentials and provider data.\n8. After issuance, certificate files are saved in certs/ and shown in Manage Certificates.\n9. Use Revoke Selected (CA) and Delete Selected (Local) for certificate lifecycle actions.\n\nWarning: DNS plugin secrets are currently stored in plaintext in storage/dns-secrets.json.\n\nSaved DNS credentials now default to the current certificate hostname as Domain/Context when available. Blank Domain/Context is only used when no hostname is provided.\n\nAdvanced ACME options (Issue New Certificate):\n- Use Let's Encrypt staging server for test issuance.\n- Optionally override with a custom ACME directory URL.\n\nCertificate output and visibility:\n- If PFX output is selected, issuance now validates that certificate.pfx was actually created.\n- Issued certificates are persisted to storage/certificates.json and immediately reloaded into the Manage Certificates grid.\n\n## How to Get Your .exe (2 ways)\n\n**Way 1 – Easiest (GitHub Release assets)**\n- Go to **Releases** and download the archive for your architecture:\n\t- ACMECertManager-vX.Y.Z-win-x86.zip\n\t- ACMECertManager-vX.Y.Z-win-x64.zip\n\t- ACMECertManager-vX.Y.Z-win-arm64.zip\n\n**Way 2 – Build yourself**\n1. Install free **Visual Studio Code** with .NET 10 support (or install .NET SDK 10.0).\n2. Open `ACMECertManager.sln`\n3. Press **F5** to run immediately\n4. To create single .exe: right-click project → Publish → self-contained win-x64 → Publish\n\n## CI and Release Workflows\n- `.github/workflows/ci.yml`\n\t- Runs on push to main and on pull requests.\n\t- Guarded by paths: only runs when `src/**`, `tests/**`, `samples/**`, or `.github/workflows/**` changes.\n\t- Validates restore, build, and tests only.\n\t- Uses .NET 10.\n- `.github/workflows/release.yml`\n\t- Runs only when a tag is pushed (format: vMAJOR.MINOR.PATCH).\n\t- Builds release packages for win-x86, win-x64, and win-arm64.\n\t- Publishes zipped assets to GitHub Releases.\n\t- Publishes stable (non-prerelease) releases.\n- `.github/workflows/channel-release.yml`\n\t- Runs on pushes to `develop` and `release/*` branches.\n\t- Guarded by paths: only runs when `src/**` or `.github/workflows/**` changes.\n\t- Builds release packages for win-x86, win-x64, and win-arm64.\n\t- Publishes prerelease assets to GitHub Releases.\n\n## Versioning and Release Process\n- Baseline project version is `1.0.0`.\n- Stable release workflow enforces SemVer tags in this format: `vMAJOR.MINOR.PATCH`.\n- Channel workflow auto-generates prerelease tags from branch updates:\n\t- `develop` -\u003e `v1.0.0-alpha.\u003crun\u003e.\u003cattempt\u003e`\n\t- `release/*` -\u003e `v1.0.0-rc.\u003crun\u003e.\u003cattempt\u003e`\n- The app version metadata is automatically set by workflow at build time.\n\nRelease steps:\n1. Update code and merge to main.\n2. Create and push a release tag, for example:\n\t - `git tag v1.0.0`\n\t - `git push origin v1.0.0`\n3. GitHub Actions runs the release workflow and publishes release assets.\n\nChannel prerelease steps:\n1. Push updates to `develop` for alpha builds, or `release/*` for RC builds.\n2. GitHub Actions automatically creates a prerelease with channel tag/version.\n\nVersion bump guidance:\n- Patch update (bug fixes): `v1.0.1`\n- Minor update (new backward-compatible features): `v1.1.0`\n- Major update (breaking changes): `v2.0.0`\n\n## Contributing Notes\n- Docs-only changes (for example README or LICENSE updates) intentionally do not trigger CI.\n- CI runs only when code/test/sample/workflow paths change, based on workflow path guards.\n- If you need a full validation run for a docs PR, include a small relevant workflow change or run local checks before opening the PR.\n\n## Security Tips\n- Production is the default. Use staging from advanced options when testing to avoid rate limits.\n- Run as Administrator first time (for HTTP-01 on port 80)\n- Certificates auto-saved in `certs/` folder\n- DNS plugin credentials are stored unsecured (plaintext) in `storage/dns-secrets.json`\n\n## Plugin Development\nSee PLUGIN_DEVELOPMENT.md for instructions on building custom DNS plugin DLLs.\n\nSample implementation included: samples/HurricaneElectricDnsPlugin\n\n**License:** GPL v3  \n\nRepo: https://github.com/caveman8080/ACMECertManager\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcaveman8080%2Facmecertmanager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcaveman8080%2Facmecertmanager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcaveman8080%2Facmecertmanager/lists"}