---
name: Pinkary
description: "Open-source link-in-bio landing page + social connection platform. Docker/Laravel Sail. PHP/Laravel + Livewire. pinkary-project/pinkary.com. Feed, questions, likes, public profiles."
---

# Pinkary

**Open-source link-in-bio landing page and social connection platform.** Share all your links from a single profile page, discover and follow like-minded people, ask and answer questions, and browse a feed — without the noise of mainstream social media. Built in 15 hours and reached 1,000 users in 24 hours; has since grown into a community-driven project.

Built + maintained by **Nuno Maduro** (Laravel core team member) and contributors. Hosted at [pinkary.com](https://pinkary.com).

- Upstream repo: <https://github.com/pinkary-project/pinkary.com>
- Website: <https://pinkary.com>

## Architecture in one minute

- **PHP 8.3 / Laravel 11** backend + **Livewire** + **Tailwind CSS** frontend (SPA-like UX, full-page SSR)
- **SQLite** — default DB (simple; works well for a single-instance deploy)
- **Redis** — queue + cache (can stub with `array` driver for dev)
- **Laravel Horizon** — queue worker dashboard
- **Laravel Pulse** — real-time app metrics
- Local dev via **Laravel Sail** (Docker Compose with PHP 8.3 + Sail tooling)
- Port: `80` (Sail maps `APP_PORT` → container `80`)
- Resource: **low-to-medium** — PHP-FPM + SQLite + Redis

## Compatible install methods

| Infra              | Runtime                        | Notes                                                                         |
| ------------------ | ------------------------------ | ----------------------------------------------------------------------------- |
| **Laravel Sail**   | Docker Compose (Sail)          | For **local dev** — upstream `docker-compose.yml` uses Sail                   |
| **Bare PHP**       | PHP 8.3 + webserver + Redis    | Production — standard Laravel deployment (Apache/nginx/Octane + Supervisor)   |
| **Hosted**         | <https://pinkary.com>          | The live product; free to use                                                 |

> **Note:** The upstream `docker-compose.yml` is Laravel Sail — a developer-experience wrapper, not a production compose file. For production, deploy as a standard Laravel app on a PHP host (Forge, Ploi, bare VPS) or use Laravel Octane in Docker.

## Inputs to collect

| Input                     | Example                         | Phase    | Notes                                                                                    |
| ------------------------- | ------------------------------- | -------- | ---------------------------------------------------------------------------------------- |
| `APP_URL`                 | `https://links.example.com`     | URL      | Full URL with scheme; sets Laravel's base URL for all generated links                    |
| `APP_KEY`                 | generated by `php artisan key:generate` | Auth | Laravel encryption key — **required**                                         |
| SMTP                      | provider creds                  | Notify   | Email verification + notifications; required for user registration flows                 |
| GitHub OAuth (optional)   | Client ID + Secret              | Auth     | For "Login with GitHub"; configure in `.env` + GitHub OAuth app                         |
| Twitter/X OAuth (optional)| Client ID + Secret              | Auth     | For "Login with Twitter/X"                                                               |
| Redis                     | `localhost:6379` or container   | Queue    | Required for queue workers (Horizon) + cache                                            |

## Local dev via Laravel Sail

```bash
git clone https://github.com/pinkary-project/pinkary.com.git
cd pinkary.com
cp .env.example .env
composer install
php artisan key:generate
touch database/database.sqlite
php artisan migrate
php artisan storage:link
npm install && npm run dev   # separate terminal
php artisan queue:work       # separate terminal
php artisan serve
```

With Sail (Docker-based):

```bash
composer install
./vendor/bin/sail up -d
./vendor/bin/sail artisan migrate
./vendor/bin/sail npm run dev
```

## Production deployment (bare PHP / VPS)

Standard Laravel production deploy:

1. VPS + PHP 8.3 + nginx/Apache + Supervisor + Redis.
2. Clone repo → `composer install --optimize-autoloader --no-dev`.
3. Set `.env` (APP_KEY, APP_URL, DB, SMTP, OAuth creds, Redis).
4. `php artisan migrate --force`.
5. `php artisan storage:link`.
6. `php artisan optimize` (config + route + view cache).
7. Configure Supervisor to run `php artisan horizon` (queue worker).
8. Configure nginx to serve `public/` as webroot.
9. TLS via Let's Encrypt / Certbot.

See [Laravel deployment docs](https://laravel.com/docs/deployment) for the canonical guide.

## Features

| Feature | Details |
|---------|---------|
| **Link-in-bio page** | Customizable public profile with all your links |
| **Feed** | Activity feed from people you follow |
| **Explore** | Discover other users |
| **Questions** | Public Q&A on profiles (ask + answer) |
| **Likes** | Like posts and questions |
| **GitHub login** | OAuth via GitHub + Twitter/X |
| **Email verification** | Required on signup |
| **Pulse dashboard** | Real-time app metrics (admin) |
| **Horizon dashboard** | Queue monitoring (admin) |

## Data & config layout

- `database/database.sqlite` — all user data (SQLite default)
- `storage/app/public/` — uploaded files, avatars (symlinked to `public/storage/`)
- `.env` — secrets: APP_KEY, OAuth creds, SMTP, Redis

## Backup

```sh
# SQLite + uploads
sudo cp database/database.sqlite database/database.sqlite.bak-$(date +%F)
sudo tar czf pinkary-storage-$(date +%F).tgz storage/app/
```

Contents: user accounts, links, questions, answers, follows. PII (emails, profile data). Keep encrypted.

## Upgrade

1. `git pull`
2. `composer install --optimize-autoloader --no-dev`
3. `php artisan migrate --force`
4. `php artisan optimize`
5. Restart queue worker (Supervisor: `supervisorctl restart horizon`)

## Gotchas

- **`docker-compose.yml` is Laravel Sail (dev only).** The upstream compose uses Sail's PHP 8.3 runtime image — it's not a production container. Don't use it directly for production. Build your own production Dockerfile or deploy as bare PHP.
- **SQLite for production.** Pinkary uses SQLite as its default DB. Fine for a personal/small-community instance; if you expect concurrent writes at scale, switch to MySQL/PostgreSQL (`DB_CONNECTION=mysql` in `.env`).
- **`APP_KEY` is the encryption key.** `php artisan key:generate` creates it. Lose it → all encrypted data (passwords stored via Laravel's `encrypt()`, remember tokens) is unrecoverable. Back up `.env`.
- **OAuth apps need correct redirect URIs.** GitHub: `https://your-domain.com/auth/github/callback`. Twitter: `https://your-domain.com/auth/twitter/callback`. Wrong URI = 403 from OAuth provider.
- **Queue worker is required for email.** If `php artisan horizon` (or `queue:work`) isn't running, email verification + notifications queue silently. Users see "check your email" but nothing arrives. Supervisor is the right way to keep it running.
- **Livewire = real-time without writing JS.** PHP-rendered components with WebSocket-like reactivity. Efficient but requires proper session handling — make sure your Redis session driver is configured for multi-server deploys.
- **`php artisan storage:link` must be re-run after deploy.** Creates the symlink `public/storage → storage/app/public`. Forgetting this = blank avatar images and missing file uploads.
- **Contribution culture.** Nuno Maduro is a prolific Laravel community contributor (Pest, Collision, Laravel Pint, etc.). The codebase reflects high-quality Laravel conventions — good reference project for learning modern Laravel patterns.

## Project health

Active, tests, Laravel Pulse + Horizon integrated, GitHub OAuth, growing contributor community. Maintained by Nuno Maduro (Laravel core). MIT license.

## Link-in-bio / social-family comparison

- **Pinkary** — Laravel + SQLite, open-source, Q&A + feed + links, self-hostable
- **Linktree** — SaaS, link-in-bio only, no social features
- **Bento** — SaaS, polished link-in-bio, no self-host
- **Masto/Mastodon** — federated social network; much heavier
- **LinkStack** — PHP, link-in-bio focused, simpler than Pinkary

**Choose Pinkary if:** you want a self-hosted link-in-bio profile + lightweight social community (feed, Q&A, follows) built on clean modern Laravel with SQLite simplicity.

## Links

- Repo: <https://github.com/pinkary-project/pinkary.com>
- Website: <https://pinkary.com>
- Laravel deployment: <https://laravel.com/docs/deployment>
- LinkStack (simpler link-in-bio alt): <https://linkstack.org>
