{"id":13581445,"url":"https://github.com/neilalexander/yggmail","last_synced_at":"2025-10-09T18:38:39.770Z","repository":{"id":43736167,"uuid":"383873010","full_name":"neilalexander/yggmail","owner":"neilalexander","description":"End-to-end encrypted email for the mesh networking age","archived":false,"fork":false,"pushed_at":"2024-12-18T22:37:30.000Z","size":137,"stargazers_count":144,"open_issues_count":26,"forks_count":19,"subscribers_count":8,"default_branch":"main","last_synced_at":"2025-05-18T02:06:34.052Z","etag":null,"topics":["email","imap","imap-server","mesh","mesh-networking","mesh-networks","smtp","smtp-server","yggdrasil","yggdrasil-network"],"latest_commit_sha":null,"homepage":"https://matrix.to/#/#yggmail:matrix.org","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/neilalexander.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":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-07-07T17:16:02.000Z","updated_at":"2025-05-14T02:24:23.000Z","dependencies_parsed_at":"2022-08-27T08:00:44.826Z","dependency_job_id":"6afaf725-8c66-40b7-8741-4ed25f51e961","html_url":"https://github.com/neilalexander/yggmail","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/neilalexander/yggmail","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neilalexander%2Fyggmail","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neilalexander%2Fyggmail/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neilalexander%2Fyggmail/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neilalexander%2Fyggmail/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/neilalexander","download_url":"https://codeload.github.com/neilalexander/yggmail/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/neilalexander%2Fyggmail/sbom","scorecard":{"id":678795,"data":{"date":"2025-08-11","repo":{"name":"github.com/neilalexander/yggmail","commit":"890ef4ada94a0422f6146ee8a0908686b2e88ab5"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.9,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/24 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":9,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/docker.yml:13","Warn: no topLevel permission defined: .github/workflows/docker.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/docker.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/neilalexander/yggmail/docker.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docker.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/neilalexander/yggmail/docker.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docker.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/neilalexander/yggmail/docker.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docker.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/neilalexander/yggmail/docker.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/docker.yml:29: update your workflow using https://app.stepsecurity.io/secureworkflow/neilalexander/yggmail/docker.yml/main?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:1","Warn: containerImage not pinned by hash: Dockerfile:9: pin your Docker image by updating docker.io/alpine to docker.io/alpine@sha256:4bcff63911fcb4448bd4fdacec207030997caf25e9bea4045fa6c8c44de311d1","Info:   0 out of   1 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   4 third-party GitHubAction dependencies pinned","Info:   0 out of   2 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Mozilla Public License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/docker.yml:9"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: github.com/neilalexander/.github/SECURITY.md:1","Info: Found linked content: github.com/neilalexander/.github/SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: github.com/neilalexander/.github/SECURITY.md:1","Info: Found text in security policy: github.com/neilalexander/.github/SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 8 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":6,"reason":"4 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2025-3487 / GHSA-hcg3-q754-cr77","Warn: Project is vulnerable to: GO-2024-3333","Warn: Project is vulnerable to: GO-2025-3503 / GHSA-qxp5-gwg8-xv66","Warn: Project is vulnerable to: GO-2025-3595 / GHSA-vvgc-356p-c3xw"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-21T22:25:47.810Z","repository_id":43736167,"created_at":"2025-08-21T22:25:47.810Z","updated_at":"2025-08-21T22:25:47.810Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279001894,"owners_count":26083226,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-09T02:00:07.460Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["email","imap","imap-server","mesh","mesh-networking","mesh-networks","smtp","smtp-server","yggdrasil","yggdrasil-network"],"created_at":"2024-08-01T15:02:01.937Z","updated_at":"2025-10-09T18:38:39.753Z","avatar_url":"https://github.com/neilalexander.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"# Yggmail\n\nIt's email, but not as you know it.\n\n## Introduction\n\nYggmail is a single-binary all-in-one mail transfer agent which sends and receives email natively over the [Yggdrasil Network](https://yggdrasil-network.github.io/).\n\n* Yggmail runs just about anywhere you like — your inbox is stored right on your own machine;\n* Implements IMAP and SMTP protocols for sending and receiving mail, so you can use your favourite client (hopefully);\n* Mails are exchanged between Yggmail users using built-in Yggdrasil connectivity;\n* All mail exchange traffic between any two Yggmail nodes is always end-to-end encrypted without exception;\n* Yggdrasil and Yggmail nodes on the same network are discovered automatically using multicast or you can configure a static Yggdrasil peer.\n\nEmail addresses are based on your public key, like `89cd1ea25d99b8ccf29e454280313128c234ffb82aa0eb2e3496f6f156d063d0@yggmail`.\n\n## Why?\n\nThere are all sorts of messaging services in the world but there is still a lot of value in asynchronous communication. Email is something that a lot of people understand reasonably well and there is still a huge volume of software in the world which supports email. Yggmail is designed to comply with the standards that people know and expect.\n\nYggdrasil is well-suited for ad-hoc mail delivery and allows Yggmail to work even in closed networks, where Internet or other connectivity is restricted or simply not available. It guarantees end-to-end encryption and handles networks with changing topologies reasonably well.\n\n## Quickstart\n\nUse a recent version of Go to install Yggmail:\n\n```\ngo install github.com/neilalexander/yggmail/cmd/yggmail@latest\n```\n\nIt will then be installed into your `GOPATH`, so add that to your environment:\n\n```\nexport PATH=$PATH:`go env GOPATH`/bin\n```\n\nCreate a mailbox and set your password. Your Yggmail database will automatically be created in your working directory if it doesn't already exist:\n\n```\nyggmail -password\n```\n\nStart Yggmail, using the database in your working directory, with either multicast enabled, an [Yggdrasil static peer](https://publicpeers.neilalexander.dev/) specified or both:\n\n```\nyggmail -multicast\nyggmail -peer=tls://...\nyggmail -multicast -peer=tls://...\n```\n\nYour mail address will be printed in the log at startup. You will also use this as your username when you log into SMTP/IMAP.\n\nConnect your mail client to Yggmail. In the above example:\n\n* SMTP is listening on `localhost` port 1025, username is your mail address, plain password authentication, no SSL/TLS\n* IMAP is listening on `localhost` port 1143, username is your mail address, plain password authentication, no SSL/TLS\n\nThen try sending a mail to another Yggmail user!\n\n## Parameters\n\nThe following command line switches are supported by the `yggmail` binary:\n\n* `-peer=tls://...` or `-peer=tcp://...` — connect to a specific Yggdrasil node, like one of the [Public Peers](https://publicpeers.neilalexander.dev/);\n* `-multicast` - enable multicast peer discovery for Yggdrasil nodes on your LAN\n* `-mcastregexp=\".*\"` - regexp used in muticast peer discovery for interface name selection.\n* `-database=/path/to/yggmail.db` — use a specific database file;\n* `-smtp=listenaddr:port` — listen for SMTP on a specific address/port\n* `-imap=listenaddr:port` — listen for IMAP on a specific address/port;\n* `-password` — set your IMAP/SMTP password (doesn't matter if Yggmail is running or not, just make sure that Yggmail is pointing at the right database file or that you are in the right working directory).\n\n## Notes\n\nThere are a few important notes:\n\n* Yggmail needs to be running in order to receive inbound emails — it's therefore important to run Yggmail somewhere that will have good uptime;\n* Yggmail tries to guarantee that senders are who they say they are. Your `From` address must be your Yggmail address;\n* You can only email other Yggmail users, not regular email addresses on the public Internet;\n* You may need to configure your client to allow \"insecure\" or \"plaintext\" authentication to IMAP/SMTP — this is because we don't support SSL/TLS on the IMAP/SMTP listeners yet;\n* Yggmail won't transport mails larger than 1MB right now.\n\n## Bugs\n\nThere are probably all sorts of bugs, but the ones that we know of are:\n\n* IMAP behaviour might not be entirely spec-compliant in all cases, so your mileage with mail clients might vary;\n* IMAP search isn't implemented yet and will instead return all mails.\n\nThe code's also a bit of a mess, so sorry about that.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fneilalexander%2Fyggmail","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fneilalexander%2Fyggmail","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fneilalexander%2Fyggmail/lists"}