{"id":15058746,"url":"https://github.com/mattholy/wand","last_synced_at":"2026-02-25T12:04:20.941Z","repository":{"id":214000772,"uuid":"735196849","full_name":"mattholy/wand","owner":"mattholy","description":"Wand is an ActivityPUB relay, to establish connection for Fediverse.","archived":false,"fork":false,"pushed_at":"2024-02-05T10:08:51.000Z","size":2367,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"storyline","last_synced_at":"2025-03-15T09:13:50.599Z","etag":null,"topics":["activitypub","activitypub-protocol","fediverse","fediverse-tool","mastodon-app","mastodon-relays","misskey","relay"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"wtfpl","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mattholy.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":"2023-12-24T02:36:55.000Z","updated_at":"2024-04-20T22:46:53.000Z","dependencies_parsed_at":"2024-11-21T05:43:06.499Z","dependency_job_id":"a2c3f301-dde6-4f31-8e5d-bd9472ccb820","html_url":"https://github.com/mattholy/wand","commit_stats":null,"previous_names":["mattholy/lighthouse","mattholy/wanderor"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/mattholy/wand","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattholy%2Fwand","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattholy%2Fwand/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattholy%2Fwand/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattholy%2Fwand/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mattholy","download_url":"https://codeload.github.com/mattholy/wand/tar.gz/refs/heads/storyline","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattholy%2Fwand/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268531912,"owners_count":24265250,"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-08-03T02:00:12.545Z","response_time":2577,"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":["activitypub","activitypub-protocol","fediverse","fediverse-tool","mastodon-app","mastodon-relays","misskey","relay"],"created_at":"2024-09-24T22:29:16.571Z","updated_at":"2025-10-29T21:12:32.453Z","avatar_url":"https://github.com/mattholy.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"./docs/logo.png\" alt=\"Wand\" width=\"300\"/\u003e\n\n**Wand is yet another awesome ActivityPub relay, in Python. 😘**\n----\n![GitHub License](https://img.shields.io/github/license/mattholy/wand)\n![GitHub top language](https://img.shields.io/github/languages/top/mattholy/wand)\n![GitHub commit activity](https://img.shields.io/github/commit-activity/m/mattholy/wand)\n![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/mattholy/wand/ci.yml)\n[![codecov](https://codecov.io/github/mattholy/wand/graph/badge.svg?token=E9FLI822U9)](https://codecov.io/github/mattholy/wand)\n![GitHub Release](https://img.shields.io/github/v/release/mattholy/wand)\n\n[![delightful](https://codeberg.org/teaserbot-labs/delightful/media/branch/main/assets/delightful-badge.png)](https://codeberg.org/teaserbot-labs/delightful)\n\n\n[🇬🇧English](README.md) | [🇨🇳中文](README_zh-CN.md)\n\n\n\u003cimg src=\"./docs/fedi.png\" height=\"100\"/\u003e\n\u003c/div\u003e\n\n----\n\n\u003e [!CAUTION]\n\u003e This project is currently under developing, not all functions are ready to launch. Do not use it in production. Do read the release note.\n\n\u003cdiv\u003e\n\n\n\n## Philosophy \u0026 Features\n\n### Connecting Through the Fediverse\n\nThe internet, humanity's grandest achievement in history, now spans like a vast ocean of stars, tightly connecting the farthest reaches of the world. It has accelerated the spread of knowledge and information, enabling people in every corner of the globe to glimpse the full panorama of our world. However, this digital realm, originally limitless and open for sharing, is gradually losing its true spirit. Various corporations and government institutions are building walls and barriers within this expansive network, turning our once interconnected world into a series of isolated islands. The voices on YouTube cannot leap to Bilibili, messages from WeChat cannot directly reach WhatsApp users, and insights from Reddit cannot freely flow to 2ch forums. This is an era of internet fragmentation!\n\nWe long for the golden age of the internet, an era tethered by email, where every message could travel freely through standardized protocols between different service providers. The internet was meant to be this free and open. Therefore, in this era of fragmented networks, we bear a significant responsibility to create new digital bonds, reconnecting this broken world. ActivityPub and the burgeoning Fediverse it fosters are rising. In this new digital universe, all forms of communication will adhere to a unified standard protocol. Servers, interconnecting like galaxies, will enable everyone to reach any corner of the globe from their own little world. As it should be.\n\nWand, as a strand in the Fediverse, will devote all its strength to tirelessly work for the connection and integration of this world. We are committed to reweaving this fragmented world, to reconnect information once again. This is our mission and our promise for the future—a new era of a boundless, shared, and free internet.\n\n### Wand Provides\n\n- Ability to connect each other as a relay or a strand\n- Ability to see the Fediverse your Wand connected\n- Dashboard to view data stats, like how many services your Wand connected\n- Easy-to-use modern interface\n- Distributed deployment, easy to scale\n- Discover other Wand in Fediverse\n- GPG identity, not username/password, for security\n- Anti-spam\n- Both forward and broadcast\n- A stats about your fediverse\n\n\u003c/div\u003e\n\n\n\n\u003cdiv style=\"clear: both;\"\u003e\u003c/div\u003e\n\n## Getting Start with hosting a Wand\nActivityPUB **need** to connect through https while Wand is a naive python ASGI.\n\nSo you have to deploy a [TLS Termination Proxy](https://en.wikipedia.org/wiki/TLS_termination_proxy) server in front of Wand. There are several choice:\n- Traefik\n- Caddy\n- Nginx\n- HAProxy\n- Cloudflare Tunnel\n\n### Docker Compose (Recommended)\nUse a `docker-compose.yml` to deploy wand, recommended file as follow (**Change environment for your own !**) :\n```yaml\nversion: \"3.8\"\nservices:\n  wand:\n    image: mattholy/wand:latest\n    hostname: wand\n    container_name: Wand\n    # ports:\n    #   - 80:80\n    # We don't need ports forwarding this time\n    volumes:\n      - /etc/timezone:/etc/timezone:ro\n      - /etc/localtime:/etc/localtime:ro\n    environment:\n      - WD_SERVER_URL=your.domain.name # Change this for your own\n      - WD_REDIS_SERVER=redis\n      - WD_REDIS_PORT=6379 # Optional, default is 6379\n      - WD_REDIS_PWD=redis # Optional, default is None\n      - WD_POSTGRES_SERVER=wand-postgres\n      - WD_POSTGRES_PORT=5432 # Optional, default is 5432\n      - WD_POSTGRES_DBNAME=wand # Change this for your own\n      - WD_POSTGRES_USER=wand # Change this for your own\n      - WD_POSTGRES_PWD=wand # Change this for your own\n    restart: always\n    depends_on:\n      - wand-redis\n      - wand-postgres\n\n  wand-redis:\n    image: redis\n    hostname: wand-redis\n    container_name: Wand-Redis\n    volumes:\n      - /etc/timezone:/etc/timezone:ro\n      - /etc/localtime:/etc/localtime:ro\n      - ./data/redis:/data # This is where your data stored\n      - ./data/redis.conf:/usr/local/etc/redis/redis.conf\n    command: [\"redis-server\",\"/usr/local/etc/redis/redis.conf\"]\n    # ports:\n    #   - 6379:6379\n    # We don't need ports forwarding this time\n    restart: always\n\n  wand-postgres:\n    image: postgres\n    hostname: wand-postgres\n    container_name: Wand-Postgres\n    volumes:\n      - /etc/timezone:/etc/timezone:ro\n      - /etc/localtime:/etc/localtime:ro\n      - ./data/db:/var/lib/postgresql/data # This is where your data stored\n    environment:\n      POSTGRES_USER: wand # Change this for your own\n      POSTGRES_DB: wand # Change this for your own\n      POSTGRES_PASSWORD: wand # Change this for your own\n    # ports:\n    #   - 5432:5432\n    # We don't need ports forwarding this time\n    restart: always\n```\nAnd my `./data/redis.conf` looks like :\n```\nappendonly yes\n```\n\nThen run `docker compsoe up -d` to start your service.\n\nFinally, access `https://your.domain.name` to configure further options.\n#### GPG Key\n*You can pass this section if you know this already.*\n\nWand uses GPG instead of username/password to identify you as the server administrator.\nGPG is a modern identity verify system, to learn more about it see this [link](https://gnupg.org/)\n\nFor the green hand, there is a short guide.\n\n- Install GPG from [https://gnupg.org/download/index.html](https://gnupg.org/download/index.html)\n- Generate your GPG key by running command `gpg --full-gen-key` and follow the instructions promoted\n- [Optinal] Send your GPG public key to a keyserver `gpg --send-keys [your key id]`\n- Export your public key `gpg --export -a [your key id] \u003e publickey.asc`\n- The `publickey.asc` is your gpg public key. It is safe to share with Wand and anywhere else you like (e.g. Github)\n- Be make sure to store your private key in a safe place (e.g. YubiKey)\n\n## Getting Start with subscribing a Wand\nSend a DM to `wand` to get a login code.\n\nFor example, say you subscribed `relay.example.com`. Just send any DM to `@wand@relay.example.com` (use your server admin account of course), then you will receive a code, use it to login to `https://relay.example.com/management`.\nYou can configure your site-specific settings there. \n\nThere are some options you can change, but admin can override your options, or even freeze it.\n\nOn management page:\n\n- Stats of your site\n- Decide which account Wand will relay, which one will not(whitelist/blacklist)\n- Decide which site you don't want to receive message\n- Content filter\n\n## Dev \u0026 Contribute\nJust clone this repo.\nOr used issue.\n\n### Frontend\n- `cd service/frontend/wand-zero`\n- `npm install`\n- `npm run dev`\n### Backend\n- `cd service/backend`\n- `pip install -r requirements.txt`\n- `python run_dev.py`\n\n## Future Plan \u0026 Request\n- See to Issues\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmattholy%2Fwand","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmattholy%2Fwand","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmattholy%2Fwand/lists"}