- HTML 38.8%
- C# 37.9%
- CSS 21%
- JavaScript 2.3%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| .github | ||
| src | ||
| .gitignore | ||
| LICENSE.md | ||
| README.md | ||
FediProfile - The Decentralized Link-in-Bio
Your links, badges, and identity - powered by the Fediverse.
The open-source, federated alternative to Linktree.
What is FediProfile?
FediProfile is a free, privacy-respecting link-in-bio tool built on ActivityPub. Your profile page is itself a first-class Fediverse actor — people on Mastodon, Pleroma, Misskey, and any other ActivityPub platform can discover and interact with it directly.
It's designed for two audiences:
Newcomers — A clean, fast link-in-bio with no trackers, no ads, and no account lock-in. It also serves as a gateway into the Fediverse: your profile link is an ActivityPub actor, encouraging exploration of open platforms.
Fediverse power users — If you juggle multiple accounts (Mastodon, Pixelfed, Loops, a federated blog…), FediProfile gives you a single persona to share. It doesn't post on its own, but it automatically boosts content from your other accounts and has its own ActivityPub inbox — including the ability to receive and display verifiable badges issued through BadgeFed.
Features
- Unlimited Links — Add as many links as you want, organize them your way.
- ActivityPub Native — Your profile is discoverable and followable from any Fediverse instance.
- Badge Collection — Receive and showcase verifiable badges from issuers across the Fediverse via BadgeFed.
- Login with Mastodon — No new password required. Authenticate with your existing Mastodon account from any instance.
- Auto-Boost & Relay — Consolidate your Fediverse presence by automatically boosting posts from your other accounts.
- Self-Hostable — Run your own instance with full control over your data.
- No Tracking — Zero analytics sold, zero ads, zero corporate surveillance.
How It Works
- Sign in with Mastodon — Enter your instance domain and authorize FediProfile.
- Pick your username — Choose a short, memorable slug. Your profile goes live instantly.
- Add links & badges — Drop in your links. Badges arrive automatically from issuers across the Fediverse.
Getting Started
Choose one of the following ways to start FediProfile.
If you want admin access, set these environment variables before starting the app:
export AdminAuthentication__MastodonUser=mapache
export AdminAuthentication__MastodonDomain=hachyderm.io
After signing in with that Mastodon account, the hidden admin page is available at /admin/root.
Run a Precompiled .NET Build
Use this if you want to run FediProfile without building from source.
Prerequisites:
- A Mastodon account (on any instance) for authentication
Download the latest Windows or Linux release from:
https://github.com/tryvocalcat/fediprofile/releases/
Then extract the archive and run the app.
Windows:
Expand-Archive .\fediprofile-windows.zip .\fediprofile-windows
cd .\fediprofile-windows
.\FediProfile.exe
Linux:
tar -xzf fediprofile-linux.tar.gz
cd fediprofile-linux
chmod +x ./FediProfile
./FediProfile
The precompiled app listens on http://localhost:5000 by default unless you set ASPNETCORE_URLS.
Clone, Build, and Run from Source
Use this if you want to develop locally or build the app yourself.
Prerequisites:
- .NET 9.0 SDK
- A Mastodon account (on any instance) for authentication
git clone https://github.com/tryvocalcat/fediprofile.git
cd fediprofile/src/FediProfile
dotnet run
When started with dotnet run, the app uses http://localhost:5099 by default.
Run with Docker
Use this if you want an isolated deployment with persistent data and generated profile files.
Prerequisites:
- Docker
- A local
appsettings.jsonfile based onsrc/FediProfile/appsettings.json.example
docker run -d -p 8080:8080 --name fediprofile \
-v $(pwd)/fediprofile/data:/app/App_Data \
-v $(pwd)/fediprofile/appsettings.json:/app/appsettings.json \
-v $(pwd)/fediprofile/uploads:/app/wwwroot/uploads \
-e DB_DATA="/app/data" \
-e ASPNETCORE_URLS="http://+:8080" \
ghcr.io/tryvocalcat/fediprofile:latest
This publishes FediProfile at http://localhost:8080, stores SQLite databases under /app/data, and persists generated profile pages under /app/wwwroot/profiles.
Configuration
Edit appsettings.json to configure your instance:
{
"AdminAuthentication": {
"MastodonUser": "your-mastodon-username",
"MastodonDomain": "your-instance.social"
},
"Domains": ["localhost", "localhost:5099"],
"DomainConfig": {
"localhost": {
"SingleUserInstance": false
}
},
"SingleUserInstance": false,
"RegistrationOpen": true,
"InvitationCode": "",
"Authentication": {
"LinkedIn": {
"ClientId": "",
"ClientSecret": "",
"UseProfileBasicInfo": false
}
}
}
| Key | Description |
|---|---|
AdminAuthentication |
Mastodon account that has admin access to the instance |
Domains |
Domains this instance will respond to |
DomainConfig.{domain}.SingleUserInstance |
Optional per-domain override; falls back to the root-level SingleUserInstance value |
SingleUserInstance |
Default for all domains. If omitted it is treated as false |
RegistrationOpen |
Set to true to allow new sign-ups |
InvitationCode |
Optional invite code required for registration |
Authentication.LinkedIn.UseProfileBasicInfo |
Enable r_profile_basicinfo and the identityMe fetch only after LinkedIn has approved that scope |
Self-Hosting in Production
dotnet publish -c Release -r linux-x64
Deploy the output from bin/Release/net9.0/linux-x64/publish/ behind a reverse proxy (nginx, Caddy, etc.) with HTTPS enabled — ActivityPub federation requires a valid TLS certificate.
Project Structure
src/FediProfile/
├── Components/ # Blazor pages & layouts
├── Controllers/ # ActivityPub inbox endpoints
├── Core/ # ActivityPub & actor helpers
├── Identity/ # Mastodon OAuth integration
├── Models/ # Data models (actors, badges, links, etc.)
├── Services/ # Database, crypto, follow, profile services
├── wwwroot/ # Static assets & generated profiles
├── Program.cs # App entry point & service registration
└── appsettings.json # Configuration
Tech Stack
- Runtime: .NET 9.0 / ASP.NET Core
- UI: Blazor Server
- Database: SQLite (zero-config, file-based)
- Auth: Mastodon OAuth
- Protocol: ActivityPub / ActivityStreams
Comparison
| Feature | FediProfile | Linktree | Others |
|---|---|---|---|
| Unlimited links | ✓ Free | ✓ Free | Varies |
| Federated identity | ✓ | ✗ | ✗ |
| Badge / credential system | ✓ Built-in | ✗ | ✗ |
| ActivityPub integration | ✓ Native | ✗ | ✗ |
| Self-hostable | ✓ | ✗ | Some |
| Open source | ✓ | ✗ | Some |
| No tracking / analytics sold | ✓ | ✗ | ✗ |
| Price | Free forever | Free / $9+ | Varies |
Contributing
Contributions are welcome! Here's how to get involved:
- Fork the repository
- Create a branch for your feature or fix:
git checkout -b my-feature - Commit your changes:
git commit -m "Add my feature" - Push to your fork:
git push origin my-feature - Open a Pull Request against
main
If you find a bug or have an idea, open an issue.
Support
FediProfile is free and open source. If it's useful to you, consider buying me a coffee to help cover hosting costs and fuel development:
License
Licensed under the GNU Lesser General Public License v3.