Because swiping through a 10-slide Instagram carousel just to get a basic pancake recipe is peak human productivity.
unscroll is a visual document extraction engine designed for people who value their time slightly more than the average Instagram user.
Instead of manually squinting at low-res carousel slides, screenshotting them, and then typing out ingredients or workout sets like it's 2005, unscroll grabs the post, downloads the slides, feeds them to high-speed Vision AI models, resolves all the hidden canonical links, and outputs formatted Markdown ready for Notion, Apple Notes, or your favorite note-taking void.
- Instagram Carousel Unscroller: Hand it a public Instagram post URL, and watch it extract every slide before Instagram tries to make you log in.
- Manual Image Dropzone: Drag & drop 1 to 20 slide screenshots. Yes, up to 20. If a post has 20 slides, it probably could have been a blog post, but here we are.
- Sub-3-Second Dynamic Parallel Extraction: We dynamically scale parallelism (
Math.min(totalSlides, maxLimit)). While local Ollama models spent 2 minutes thinking about life choices, Google Gemini Flash processes 7 slides in under 2.5 seconds. - Zero Hallucination Canonical Link Resolver: Extracts YouTube, GitHub, and web URLs mentioned in visual text, searches for verified canonical links, and generates clickable markdown badges.
- Paranoid Input Sanitizer: Rejects loopback IPs (
127.0.0.1), local network targets, and AWS metadata endpoints (169.254.169.254). Nice try, script kiddies.
Because one package.json was obviously too simple:
unscroll/
├── apps/
│ └── web/ # Next.js 14 App Router UI & REST API endpoints
├── packages/
│ ├── domain/ # Core TypeScript types & document entities
│ ├── schemas/ # Zod validation schemas & paranoid input sanitizers
│ ├── adapters/ # Instagram scrapers & upload capture adapters
│ ├── cache/ # Thread-safe ephemeral document store
│ └── ai/ # Vision & Reasoning AI providers + parallel pipeline
└── cli.ts # Terminal CLI for terminal nerds
- Bun (v1.3 or higher)
- A
GEMINI_API_KEY(unless you like waiting around for slow local VLMs)
# Clone the repo (you know the drill)
git clone https://github.com/PiKa919/unscroll.git
cd unscroll
# Install workspace dependencies using Bun
bun installDon't want to open a browser? We built a CLI just for you:
# Set your API Key
export GEMINI_API_KEY="your-gemini-api-key"
# Unscroll an Instagram carousel post directly in your terminal
bun run cli.ts "https://www.instagram.com/p/C_samplePost123/"=================================================
UNSCROLL VISUAL KNOWLEDGE & NOTION ENGINE
=================================================
Target URL : https://www.instagram.com/p/C_samplePost123/
>>> STEP 1: Capturing Instagram post slides...
✓ Capture Complete! Post Title: "High Protein Meal Prep"
✓ Total Carousel Slides Captured: 6
>>> STEP 2: Running Live Vision AI Processing & Canonical Link Resolution...
Configured Provider: Google Gemini (gemini-flash-lite-latest) | Dynamic Parallel Concurrency: 7
🎉 DOCUMENT PROCESSING COMPLETE! Status: COMPLETE
Primary Document Category: RECIPE
=================================================
NOTION / NOTES FORMATTED MARKDOWN EXPORT
=================================================
# High Protein Meal Prep
*Extracted via unscroll Visual Knowledge Engine*
## 🛒 Ingredients
- 500g Chicken Breast [Slide 1, 2]
- 2 tbsp Olive Oil [Slide 2]
- 1 cup Jasmine Rice [Slide 3]
## 📋 Instructions
1. Season chicken breast with spices and sear on high heat for 6 mins per side. [Slide 3]
2. Cook jasmine rice in chicken broth until fluffy. [Slide 4]
=================================================
✓ Ready to copy and paste into Notion, Notes, or Calendar!
=================================================# Start the Next.js development server
GEMINI_API_KEY="your-gemini-api-key" bun dev
# Open http://localhost:3000 in your browserBecause tests are the only reason we sleep at night:
# Run all 40+ monorepo unit tests
bun test
# Build Next.js production bundle
bun --filter unscroll-web buildMIT © PiKa919. Enjoy swiping less.