Skyline: Programming Your Own Social Vibe
How LLM embeddings and the AT Protocol are turning the engagement trap into a user-controlled mood regulator.

The way custom algorithms work in Skyline is via LLM embeddings. You can write a positive prompt "I want to see more of...", and posts matching will be brought to the top, and a negative prompt "I want to see less of..." which decides which posts to push to the bottom.
- Skyline uses LLM embeddings to replace rigid keyword filtering with semantic content moderation.
- The application calculates cosine similarity between posts and natural language prompts to rank content by user intent.
- The decentralized AT Protocol allows the client to re-rank the global data firehose without server-side permission.
- This architecture shifts the goal of social media from engagement optimization to user-controlled mood regulation.
The Vibe-Shift Button
Most social platforms optimize for time on site. They feed anger, outrage, and engagement. Skyline, an alternative client for the Bluesky network, takes a fundamentally different approach. It treats the social feed as a programmable mood regulator.
Built with Next.js and TypeScript, Skyline leverages the decentralized nature of the AT Protocol. It bypasses server-side engagement algorithms entirely. Instead, it allows users to filter the global firehose through a semantic lens using natural language.
My goal with this project was to create a social media that makes you happy, not just optimizes engagement.
Beyond the Boolean
Traditional content filtering relies on keyword muting. If you mute a specific political term, the system blindly hides posts containing that exact string. This boolean approach is brittle. Users easily bypass it with misspellings or related context.
Skyline introduces semantic muting. It understands intent. If a user asks for a "Wholesome" feed, the client calculates the mathematical distance between a post and the user's prompt. It understands that a post about a local political bill is political, even if the user never explicitly blacklisted the bill's name.
| Feature | Official Clients | Skyline |
|---|---|---|
| Control Plane | Server-side, fixed | Client-side, programmable |
| Filtering Logic | Regex and Keywords (Brittle) | LLM Embeddings (Semantic) |
| Core Incentive | Time on Site (Engagement) | User Intent (Vibe) |
The Vector Engine Under the Hood
The architecture relies heavily on client-side processing combined with lightweight API proxying. When a user loads a feed, the Next.js application fetches raw records from the AT Protocol. It then sends this data to a local API route.
The API route passes the text to OpenAI to generate vector embeddings. The client then calculates the cosine similarity between the post's vector and the user's configured prompts. This produces a score that dictates the post's final rank in the UI.
Sovereignty by Design
Skyline works because the AT Protocol decoupled the data layer from the application layer. Skyline does not need permission to re-rank the feed. The data lives on decentralized Personal Data Servers.
The Transhumanist Feed
The project is explicitly philosophical. It explores memetic engineering and the idea that software should actively prioritize user well-being over metrics. It is an experiment in principled software design.

Everyone knows "social media makes you angry" - but maybe the tech is finally here for "social media makes you kinder"?
By placing the algorithm directly in the hands of the user, Skyline offers a glimpse into a future where we program our digital environments rather than letting them program us.