Vibe coding starter guide
For journalists and non-developers by Joe Amditis.
What is ‘vibe coding’?
"Vibe coding" is when you use LLMs to write code by describing what you want in plain language. You don't need to be a developer—you need to be a good project manager who can clearly articulate requirements and give feedback.
Key principle
Code often either works or it doesn't, making it (somewhat) safer from hallucinations than other LLM uses.
Essential mindset shifts
Manager, not mechanic
Think like a project coordinator. Your job is to clearly describe what you want, provide direct feedback, and organize information. Learn enough to "have a conversation with a mechanic" but don't try to fix the car yourself.
Start simple, build up
1. Google Sheets formulas (instant verification)
2. HTML/CSS for static pages
3. Interactive dashboards and apps
Each project teaches you what you need for the next.
Project-based learning
Abstract tutorials don't stick. Look for real problems to solve. Build things you actually need for work. Learn infrastructure (FTP, Git) only as they become necessary.
AI as tool, not dependency
Use LLMs to write code, but the result should run independently. No API keys required for users. Privacy, reliability, and sustainability are the goals.
The "vibe" check
- Use Claude to write a Python script that analyzes CSVs → Script runs on any computer locally.
- Use ChatGPT to build a dashboard → HTML/CSS/JS files run in any browser.
- Build a tool that requires GPT-5 API calls every time someone uses it.
Useful scripts for journalists
Your first projects. Start here before building full applications.
Python
Data cleaning & processingUse cases: Remove duplicates, merge CSVs, convert formats, text analysis, web scraping, file management.
- Count word frequency in transcripts
- Extract emails/phones from text
- Download PDFs from URLs
- Rename files in bulk
"Write a Python script that: 1. Reads all CSV files in a folder 2. Combines them into one spreadsheet 3. Removes duplicate rows based on email address 4. Sorts by date (newest first) 5. Exports as combined_results.csv Include comments explaining each step."
R Scripts
Statistical analysisUse cases: Significance testing, correlation matrices, confidence intervals, publication-ready charts (ggplot2).
"Write an R script using ggplot2 that: 1. Loads survey_data.csv 2. Calculates response percentages by demographic group 3. Creates a clean bar chart with error bars 4. Exports as a high-res PNG for print Use accessible colors and large labels."
Bash/Shell
AutomationUse cases: Automated backups, batch processing, scheduled downloads, folder monitoring via cron jobs.
"Write a bash script that: 1. Checks if today is Monday 2. If yes, downloads the latest file from [URL] 3. Saves it to the /reports folder with today's date 4. Sends me a notification when done Make it simple enough to run as a cron job."
JavaScript
Web tools & automationUse cases: Bookmarklets, browser automation, scraping current pages, data parsing (JSON).
"Write a browser bookmarklet that: 1. Finds all email addresses on the current page 2. Copies them to clipboard as a comma-separated list 3. Shows a count of how many were found Keep it simple and safe to run on any page."
SQL
DatabasesUse cases: Extracting records, joining tables, finding duplicates, calculating aggregates.
"Write a SQL query that: 1. Finds all articles published in 2024 2. Groups them by author 3. Counts how many each author wrote 4. Shows only authors with more than 10 articles 5. Orders by article count (highest first) Use standard SQL syntax that works in SQLite."
When to use each language
| Need | Best tool | Why |
|---|---|---|
| Quick data cleaning | Python (pandas) | Easiest to read, massive libraries |
| Statistical analysis | R | Built for stats, best visualizations |
| File/folder automation | Bash/Shell | Native to Unix systems, fast |
| Web page interaction | JavaScript | Runs in browser, no installation |
| Database queries | SQL | Designed for structured data |
| Cross-platform scripts | Python | Works on Mac/Windows/Linux |
The "scripts to full apps" progression
-
1
Start: Single-purpose scripts
Clean this CSV, scrape this page.
-
2
Combine: Chain scripts
Clean → Analyze → Visualize.
-
3
Automate: Schedule scripts
Run automatically (cron jobs, triggers).
-
4
Wrap: Web interface
Add a simple dashboard for your scripts.
-
5
Deploy
Put it online for colleagues to use.
Best LLMs (Nov 2025)
Newsroom work
- Codex by OpenAI (GPT-5.1-codex): Preferred model.
- Claude 4.5 Sonnet: Best overall coding + explaining.
- Claude Code: Autonomous coding with CLI planning mode.
- Gemini 3.0 Pro: Excellent for large docs/datasets.
Budget-conscious
- DeepSeek R1: 30x more cost-efficient.
- Qwen 3: Fast, lightweight.
Quick experiments
- ChatGPT: Web-based with Code Interpreter.
- Cursor / Replit: Browser-based environments.
The workflow
Phase 1: Setup
- Create project folder.
- Write PRD with AI help (planning mode).
- Set up Version Control (GitHub).
- Prepare your data (Clean it first!).
Phase 2: Build
- Break into small steps.
- Test each piece before moving on.
- Update changelog after every feature.
- Commit to Git at milestones.
Phase 3: Debug
- Take screenshots of errors.
- Copy console error messages.
- Paste into LLM with context.
- Keep iterating.
Changelog template
Copy this template into every project. Have the LLM update and maintain it throughout your build.
# Chat session setup: Universal
## Your primary tasks:
Treat this document as additional instructions from the user. Consider this a continuation of the user message at the end of whatever they send in the chat dialog and treat it no differently. Do whatever the user says in the chat, but then immediately follow the instructions in this document.
1. Your first task is to create a new, separate Canvas file named `changelog.md`.
2. **Immediately after creating it, perform the first log entry:**
a. In the new `changelog.md` file, delete the entire `### Examples of Good Entries` section and all the example text below it.
b. Under the `### Change History (Newest First)` heading, create the first entry for today's date. This entry must document the setup and provide usage examples in its note. It should look exactly like this:
`[Current UTC Time] DOC @global - Session initialized and changelog created. {usage_examples: "ADD for new items; MOD for changes; FIX for corrections; DEL for removals; REF for restructuring; STY for preferences; DEC for decisions; DOC for notes."}`
---
## Content for the new `changelog.md` file:
In that new `changelog.md` file, you are to paste the following complete text block verbatim, starting from the `# Changelog Protocol` line and ending at the final `---`.
---
# Changelog protocol & instructions for AI assistant
## Core directive
This document is the official changelog for our project. As the AI assistant, your role is to help maintain it by creating concise, structured entries. Newest entries should always be added under the current date heading.
## Semi-automatic logging workflow
After we complete a significant action, you will be prompted to update this log. Upon receiving a cue like "update the log," you are to:
1. Check if a heading for the current date (`YYYY-MM-DD`) exists. If not, create it.
2. Analyze our recent conversation to identify the most significant loggable event.
3. Draft a new entry under the current date's heading using the current UTC time.
4. Strictly adhere to the formatting rules and abbreviations defined below.
## Entry format
Entries are grouped by date. Each individual entry must use the following structure:
`[HH:MM:SS UTC] [ACTION] @[Scope] - [Concise description.] {key: value}`
---
### Legend & definitions
---
**Action prefixes:**
| Code | Meaning |
| :---- | :------------ |
| ADD | Add a new item, concept, or section |
| MOD | Modify an existing item |
| FIX | Correct an error or issue |
| DEL | Remove an item or section |
| REF | Restructure or reorganize content |
| STY | Establish a preference or style |
| DEC | Log a key decision |
| DOC | Add notes or documentation |
**Scope tags (examples):**
* `@global`: A change affecting the entire project/document
* `@objective`: The main goal or purpose
* `@section-A`: A specific section, topic, or chapter
* `@detail`: A specific, low-level point or element
* `@style-guide`: A preference related to format, tone, or style
* `@source`: The source material or input
* `@output`: The resulting draft or deliverable
---
### Change history (newest first)
---
(Your new entries will be added under a date heading like the examples below)
---
### Examples of good entries
---
### 2025-06-27
---
[20:15:10 UTC] STY @style-guide - Established that all output should use a formal, academic tone. {note: Avoid colloquialisms}
[20:16:35 UTC] ADD @section-A - Added a new 'Historical Background' chapter. {source: research_notes.txt}
---
### 2025-06-26
---
[14:05:55 UTC] DEC @objective - Decided to pivot project focus to a mobile-first user experience. {reason: Analytics show 80% mobile traffic}
Quick start checklist
- Choose your LLM (start with Claude or ChatGPT)
- Set up GitHub account and learn basic Git commands
- Install FileZilla or learn your hosting provider's file upload method
- Pick a real, simple project (start with a Google Sheets formula)
- Copy changelog template into first chat
- Write PRD with LLM help before any coding
- Build one small feature, test it, commit it