Inspiration
Recommendation feeds AKA "the algorithms" can take months or years to learn what someone actually values. That work disappears when someone creates a new account, moves to another platform, shares an account, or simply wants a different kind of feed for a few hours.
Today, people must repeatedly like, hide, follow, and unfollow content until each platform eventually reacts. Curate treats feed preferences as something a person should be able to describe, inspect, move, temporarily replace, share selectively, and reverse.
What it does
Curate turns a natural-language request into a portable feed Passport.
The request can be broad:
I want less ragebait and more science-based pages.
Or highly specific:
Make my feed 50% astronomy, 15% coding, 12% drawing, 3% anime, 10% Naruto, 5% One Piece, and 5% perfumes.
A Strands agent interprets the request, examines the selected platform's available controls, and creates a bounded action plan. Curate then shows the starting feed, the proposed changes, the resulting feed, a measurable topic shift, and a route back to the original state.
Curate also supports:
- Copy Feed: carry an existing feed Passport into a new account or platform.
- Incognito: temporarily replace the active feed and restore it automatically afterward.
- Blend: selectively combine interests from two different Passports.
- Drift checks: compare the current feed against the user's intended mix.
- Rollback: reverse an applied plan using its retained action receipt.
- Guided platforms: provide direct native links and relevant actions when a platform does not expose a suitable public API.
YouTube and Bluesky use owner-bound OAuth connections for reversible subscription and follow controls. Our dummy-account conformance runs applied one action, verified the provider state, restored the original state, and revoked the connection.
Instagram portability uses a user-provided Accounts Center following export. Curate never pretends to control a platform capability that its public interfaces do not expose.
How I built it
Curate is a responsive React and Vite application designed around a passport and customs metaphor.
The agent layer uses the Strands Agents SDK to translate flexible human requests into structured feed plans. An account-free local workflow uses Qwen through llama.cpp, while the retained managed path runs through Amazon Bedrock AgentCore with Amazon Nova Lite.
The backend uses FastAPI, SQLite, and deterministic policy services. These services manage identity, action limits, temporary expiry, measurements, execution receipts, and rollback while the agent focuses on understanding the user's intent.
AWS CDK defines the cloud deployment. Amazon Cognito protects judge access using authorization code flow with PKCE, while Amazon CloudWatch retains the AgentCore execution evidence shown in the demonstration.
The platform layer includes the YouTube Data API, AT Protocol OAuth with DPoP for Bluesky, an Instagram Accounts Center export parser, ten platform-shaped practice environments, and guided routes for platforms without suitable APIs.
The public application is hosted on Cloudflare Pages at curate.elfeel.me.
Playwright tests the complete interaction flow, responsive layouts, connection boundaries, and demonstration experience.
Challenges I ran into
The central challenge was separating interpretation from authority. An agent should understand an ambiguous human request, but that does not mean it should silently authorize itself, invent unsupported capabilities, or claim that a private recommendation model changed.
Every platform also exposes a different set of controls and some are very limiting. Curate must preserve the person's intention while translating only the parts that each destination can actually support.
Making live actions reversible required durable action journals, exact-revision receipts, reconciliation after uncertain provider responses, temporary-expiry handling, and verified rollback.
Another challenge was making the feed transformation visibly measurable without treating a few recommendations as definitive proof of how a platform's private ranking system works. Our demonstration combines reviewed dummy-account samples, deterministic practice feeds, topic measurements, and visible before-and-after comparisons.
Accomplishments that I'm proud of
Curate supports both conversational and percentage-based feed requests, a functioning Strands planning loop, capability-aware proposals, measurable before-and-after feeds, execution receipts, and rollback.
The completed product includes ten platform-shaped practice environments, Copy Feed, temporary Incognito feeds, selective two-person Blend, creator continuity, drift checks, YouTube and Bluesky OAuth boundaries, local Instagram portability, and guided routes for unsupported platform APIs.
It also includes a retained Amazon Bedrock AgentCore deployment, Amazon Nova planning, CloudWatch execution evidence, private judge access through Cognito, a public custom-domain application, a public MIT-licensed repository, and a tested end-to-end tutorial.
What I learned
People do not need another long page of recommendation settings. They need a way to describe what they want at their own level of precision and understand what survived translation to each platform.
I also learned that a useful agent does not need unlimited authority. The strongest architecture lets the agent handle ambiguous interpretation while deterministic systems retain control over identity, execution, limits, measurement, expiry, and rollback.
What's next
The next step is broader owner-authorized platform certification and longer-running dummy-account studies that compare recommendation samples over time.
Curate can also add more official platform connectors as their APIs permit, richer creator identity matching, scheduled drift correction, and reusable Passport communities for common feed goals.
Built With
- amazon-bedrock
- amazon-bedrock-agentcore
- amazon-cloudwatch
- amazon-cognito
- amazon-nova
- aws-cdk
- bluesky
- fastapi
- llama.cpp
- python
- qwen
- react
- sqlite
- strands-agents-sdk
- vite
- webmcp
- youtube-data-api
Log in or sign up for Devpost to join the conversation.