惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threatpost
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Engineering at Meta
Engineering at Meta
T
The Blog of Author Tim Ferriss
Recent Announcements
Recent Announcements
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
The Register - Security
The Register - Security
MongoDB | Blog
MongoDB | Blog
U
Unit 42
B
Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
L
LangChain Blog
Stack Overflow Blog
Stack Overflow Blog
P
Privacy International News Feed
L
LINUX DO - 最新话题
博客园_首页
博客园 - Franky
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tor Project blog
V
Visual Studio Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
P
Privacy & Cybersecurity Law Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
K
Kaspersky official blog
C
Cisco Blogs
博客园 - 【当耐特】
阮一峰的网络日志
阮一峰的网络日志
I
Intezer
罗磊的独立博客
MyScale Blog
MyScale Blog
Last Week in AI
Last Week in AI
A
About on SuperTechFans
G
GRAHAM CLULEY
Y
Y Combinator Blog
Microsoft Security Blog
Microsoft Security Blog
GbyAI
GbyAI
T
Threat Research - Cisco Blogs
P
Proofpoint News Feed
D
DataBreaches.Net
The Hacker News
The Hacker News
Spread Privacy
Spread Privacy
AWS News Blog
AWS News Blog
I
InfoQ
T
The Exploit Database - CXSecurity.com
Simon Willison's Weblog
Simon Willison's Weblog
博客园 - 叶小钗
Project Zero
Project Zero

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
My Minimalist iPhone + Lightroom Photo Workflow (Like Reusable Components)
Richard Lemo · 2026-05-20 · via DEV Community

Why I treat photos like UI components

I build web experiences for a living, so my brain is wired around components. Small pieces. Clear inputs. Predictable outputs.

When I started taking photography more seriously, I fell into the same trap most devs do. Gear research. Camera reviews. Lens rabbit holes. Editing suite comparison charts with way too many checkmarks.

Meanwhile, my camera roll was a mess and my Instagram was dead.

So I did what I always do when a hobby starts to feel like work. I stripped the whole thing down until it felt more like React props than creative suffering.

Right now my photography workflow is: iPhone camera + Lightroom on my phone. That is it. No DSLR body. No plugin zoo. No 45-minute “mood crafting” sessions per photo.

Everything is built around a component mindset. Reusable pieces. Minimal configuration. Fast feedback. Just enough control to make it mine.

The constraint: photography as a side-quest, not a second job

I have a few non‑negotiables for creative hobbies.

  • I can start in under 10 seconds.
  • I can ship in under 5 minutes.
  • The results look consistent enough to feel intentional.

If any of those break, my interest drops. That is true for side projects, for training plans, and for photography.

I also know myself. If I carry a big camera bag, I will start thinking in “photo session mode” instead of “notice stuff and shoot” mode. That kills the fun for me.

So I made a rule: if it does not fit in my pocket, it does not exist in my workflow.

That leaves me with the device I already use to check stats, answer clients, and record baseball drills. The iPhone.

The capture layer: keeping the raw input simple

In front‑end, if the data that comes into your components is garbage, no clever UI will save it. Same with photos. If the input is bad, Lightroom is just a colorful coping mechanism.

I do not shoot RAW on my phone.

Yes, RAW is technically better. Yes, there is more dynamic range. I have shot RAW. I can tell the difference. I also know it bloats storage and slows down every step that comes after.

For a mobile, Instagram‑first flow, I would rather optimize the system than chase theoretical quality. So I stick to HEIC or JPEG from the stock camera app.

My “componentized” capture settings look like this:

  • Photo mode only. No Pro, no filters, no Portrait for Instagram work. Portrait mode looks nice on the phone then falls apart in editing with weird edges and fake blur.
  • Grid enabled. I treat the grid like a layout system. Rule of thirds, leading lines, horizon sanity check. Same as a CSS grid overlay for a new layout.
  • Exposure control. I tap to focus and slide down slightly to underexpose. Phones love bright, flat images. I prefer a bit of headroom and mood.
  • Lens discipline. I mostly stick to the main wide lens. The ultra‑wide is a special‑purpose component for architecture or big interiors. Digital zoom is basically a bug, so I “disable” it mentally.

I also have a couple of mental capture presets. Not camera presets. Just tiny rules I repeat.

  • “Find the clean background”. Before I raise the phone, I quickly scan behind the subject. I move one or two steps to clean up lines and remove clutter. This is the same thinking as simplifying a DOM tree before styling.
  • “Commit to one light direction”. I walk around the subject until I can clearly see where the light is coming from. I shoot primarily from that side. This keeps shadows intentional instead of random.

That is it. No half‑hearted HDR toggles. No live filters. Clean input.

Lightroom as a component library, not a blank canvas

Lightroom can be a black hole. Infinite sliders. Panels inside panels. If you treat it like a design tool, you will happily tweak a single photo for 30 minutes. Then you will burn out and stop posting.

I treat Lightroom mobile like a component library.

Components have props and sensible defaults. You are not redesigning a button every time. You pick a variant. You override a couple of values. You ship.

My Lightroom setup uses the same idea.

Building my “preset components” from actual use

I did not download a random preset pack from some influencer. I am not against presets, I just do not like trusting a black box that was tuned for Bali sunsets when I am shooting Dutch winter light.

Instead, I shot for a week in my normal routine. Commute. Lunch walks. Baseball field. Home. Every time I edited a photo in Lightroom, I forced myself to notice patterns.

Typical slider changes for me:

  • Exposure slightly down, contrast slightly up.
  • Highlights down, shadows slightly up.
  • Whites up a bit, blacks down a bit.
  • Vibrance up, saturation almost untouched.
  • A small S‑curve in the tone curve panel.

I also realized I almost always desaturate yellow and raise orange luminance, especially for skin. Greens get tamed a bit. Sky blues get a tiny saturation bump.

That observation process is boring but important. It is like scanning your commits over a week and realizing you always add the same utility classes. That is your implicit design system trying to exist.

After a few days I created my first real preset. I applied my “default” edit to one photo, then saved those settings as a preset in Lightroom mobile. I named it something aggressively uncreative like RL_Base_Daylight.

That preset is now my default component. It handles 70 percent of my shots.

Preset variants, like component variants

One preset is not enough, but ten are too many. I treat presets like button variants. A few solid ones. Clear scenarios. No overlap.

Right now I use four Lightroom presets regularly:

  • Base Daylight. For most outdoor daytime shots. Neutral, slightly contrasty, moderate saturation, restrained greens.
  • Soft Overcast. Slightly warmer temp, reduced clarity, gentler contrast. Built for grey Dutch skies that kill depth.
  • Indoor Warm. For home or coffee shops. Temp pushed a bit cooler to fight orange LEDs, plus more noise reduction and less clarity.
  • Field Night. For baseball training under floodlights. More aggressive noise control, cooler white balance, lifted shadows to pull detail out of dark uniforms.

Each preset bakes in everything except crop and local adjustments. White balance is “soft opinionated” so I still tweak it per shot. Same idea as default props that can be overridden.

This is the core of the workflow. Pick a preset like you pick a component variant. Then only touch the necessary knobs.

The micro‑flow: editing a single photo

Here is the actual sequence I use for a photo I plan to post. No theory. Just the real steps.

  1. Pick a favorite. In the Photos app I quickly star or favorite 3–5 candidates from a moment. I only import those into Lightroom. I do not invite my entire camera roll to the party.
  2. Import into Lightroom mobile. One tap from the share sheet. I keep albums very loose: Daily, Field, Travel. Enough to find things, not enough to become a second job.
  3. Apply a preset. I start with Base Daylight or one of the variants. No raw sliders yet. Just a single preset tap.
  4. Fix crop first. I correct horizon, straighten buildings, and tighten the frame. Cropping first is like fixing container width before adjusting typography.
  5. Tune light. I nudge exposure, then check shadows and highlights. If I spend more than 30 seconds here, I restart from the preset and force a smaller adjustment.
  6. Tune color. Small tweaks to temperature and tint. Maybe HSL on orange / yellow if skin tones look off. I try to never open the full HSL panel unless something clearly bothers me.
  7. Detail and effects. A bit of sharpening, lens correction if needed, and sometimes a tiny vignette. No artificial grain. I think fake grain is overrated on phone photos.
  8. Export to camera roll. Highest resolution JPEG back to Photos. Then straight to Instagram.

That whole cycle usually takes under two minutes. If it does not, the photo is not worth it for Instagram. I archive it and move on.

Batching photos like UI states

One nice thing about Lightroom presets is that they behave like the default state for a group of similar shots. I try to think of “sets” of images the same way I think about button states.

Say I shot 10 photos at the field on a cloudy evening. Those are clearly one group. Same light, same environment, similar subject.

My mini‑batch flow:

  • Import all 10 into a Field album.
  • Pick my favorite and edit it fully, using the Field Night preset as a base.
  • Copy the settings in Lightroom and paste them to the other 9.
  • Only adjust exposure and crop on each of the others.

Now the entire set has a consistent look and took maybe 10–15 minutes. I do not love batch editing as a creative act, but as a system design problem it feels honest and efficient.

Constraints that keep it fun

A workflow is only good if you actually use it repeatedly. I have a few constraints that keep this photo thing in the hobby zone instead of the productivity zone.

  • No laptop editing. If I cannot finish the edit on my phone, I do not post it. I spend all day in front of a bigger screen already.
  • No “someday” folders. If an image does not get edited the same day or the next morning, it goes to the archive with zero guilt. No backlog to manage.
  • Instagram only. I am not trying to print gallery pieces. My target medium is a small glowing rectangle people scroll past during coffee. That simplifies choices a lot.
  • One crop rule. I edit for a single aspect ratio per session. Usually 4:5 vertical for Instagram. I do not make web, story, and print crops for the same photo.

Those sound strict, but they are just guardrails. They stop me from turning a relaxing walk into a production pipeline.

Why this feels like front‑end work (in a good way)

The fun part for me is how much this resembles front‑end thinking once you strip away all the drama around “art”.

  • Inputs. Light, subject, environment. Same as data and API shape.
  • Components. Presets and small editing patterns. Like buttons, cards, text styles.
  • System. The capture → edit → export flow. Like your build tooling and deployment script.
  • Constraints. Pocketable gear, Instagram output, phone‑only edits. Same as targeting a specific device range or performance budget.

Once I started to see it that way, it stopped being overwhelming. I do not need the “best” lens any more than I need the “best” JavaScript framework for a static product page.

I need a small, opinionated stack that I actually use on a Tuesday when I am tired and just want to post a photo of late‑night batting practice.

What I would change next

This workflow is not sacred. I treat it like a codebase. Small pull requests. No rewrites.

A few things I am experimenting with:

  • One black and white preset. For rare cases where color distracts. I want a single, bold look, not 8 moody variations.
  • A “story” preset. Slightly higher contrast and clarity to survive Instagram compression on stories.
  • Shooting a tiny bit more RAW. Very selectively. Maybe one RAW frame per interesting scene when I know I might want a print later.

If any of these start slowing down the main flow, they get reverted. Same rules as any healthy component library. If a new component adds more cognitive load than value, it goes.

Keeping a hobby frictionless

I like building complex things at work. I like keeping my hobbies aggressively simple.

iPhone camera. Lightroom mobile. A handful of presets I actually understand. A capture habit that fits around coaching, building products, and generally living a normal day.

If photography currently feels heavy or guilt‑shaped for you, try cutting it until it feels closer to shipping a small UI component. Limited props. Clear output. Low drama.

It is supposed to be fun.