Hacks/Hackers

hacks/hackers × allbritton journalism institute

Vibe coding
for journalists

Build your own website, then find leads in federal contract data, with Claude Code. Every link and prompt from today is on this page. Keep it.

Fri Nov 20 / 12:00–17:00 ET

Burt Herman, Hacks/Hackers

1

part 1

Get set up

Everything today runs in Claude Code on the web. Claude works on a computer at Anthropic, not on your laptop, and saves your projects to GitHub.

  1. Go to claude.ai/code and sign in with your AJI account.
  2. Connect GitHub when it asks, and approve. When GitHub asks which repositories Claude can use, choose All repositories. If you pick only some, you’ll have to add each new project by hand at github.com/settings/installations (Configure, then Repository access).

Three words you’ll hear all day

Stuck? Ask Claude first. Tell it what you see, or paste the error. Ask what it means and what to do next. Then try it.

2

part 2

Your website

A one-page site with your name, your beat, your About text and your clips, published free on GitHub Pages.

Make your site’s repository

  1. Open the site template and click Use this template, then Create a new repository. Give it a name and leave it Public: GitHub publishes public repositories as websites for free. The template already holds instructions for Claude: use your words exactly and never add facts.
  2. In claude.ai/code, pick your new repository and start a session. Claude can see only the repository you pick.

Ask for your site

Fill in the parts in [brackets] before you send it.

Your site first prompt
Build me a simple one-page personal website. My name is [your name] and I'm a reporting fellow covering [your beat]. Include a headline with my name and beat, an About section, a Clips section for my stories, and a line saying people can reach me at [your email]. Leave the About section as a clearly marked empty spot; I'll give you that text later.

Then give Claude your About text. The words about you are yours.

Your site About text
Here's my About text. Put it in the About section exactly as I wrote it:

[paste your About text]

Turn on GitHub Pages: the one click Claude can’t do

  1. On GitHub, open your repository’s Settings.
  2. Click Pages.
  3. Under Branch, choose main, then Save. Your address is yourname.github.io/your-repository. It can take a minute or two to appear. Open it on your phone, not signed in, the way anyone else would see it.

Make it look like you

Screenshot two or three sites you like and attach the pictures to your message. Say what you like the way you’d brief a designer: the type, the colors, how much space.

Your site style
Here are some sites I like. I like [what you like: the type, the colors, how much space]. Make my site look more like that. Save the style in the project's instructions so future changes keep it, then push.

Don’t like it? Say what’s wrong, not how to fix it. Then refresh your site.

Add your headshot

Attach a photo to your message and say where it goes. No uploading on GitHub.

Your site headshot
This is my headshot. Put it next to my About section.

Make your first skill: /add-clip

A skill is standing instructions: written steps Claude follows the same way every time. Adding clips is the job you’ll repeat, so make it one line.

Skill make /add-clip
Make a skill called add-clip and save it in this project. When I use it with a link to one of my stories: open the link and copy the headline exactly as published, plus the outlet and the date. Never rewrite or shorten the headline. Add the story to the top of the Clips section, newest first. Then push the change so it goes live and tell me what you added. If you can't open the link, ask me for the headline, outlet and date instead of guessing.
  1. Type /reload-skills so this session sees the new skill. A new session picks it up on its own.
  2. Type /add-clip and paste the link to one of your stories.

Let Claude reach your outlet

Claude can visit only the websites your environment allows. Add your outlet yourself:

  1. In the panel on the right, click the gear next to the environment’s name.
  2. Open Network access and add the site Claude named, one per line. *.example.com covers every part of a site.
  3. Click Save changes, then tell Claude: “I added it, try again.” No new session needed. Add each outlet you’ve worked for. If it still won’t work, give Claude the headline, outlet and date yourself.
Later, if you want: use your own domain

If you own a name like yourname.com, you can point it at your site so the address isn’t github.io.

  • Add the domain in your repository’s Pages settings first, so no one else can claim it.
  • Then change the settings where you bought the domain.
  • It can take up to a day to work.

GitHub’s guide: Configuring a custom domain for your GitHub Pages site. Or ask Claude to walk you through it.

3

part 3

Finding leads in public data

Who just got federal money for the first time? A company winning its first contract from an agency isn’t news on its own. It’s a place to start asking: who are they, how did they get it, and was anyone else allowed to bid?

The source: USAspending.gov. Every federal contract, public and free, no sign-up. Claude asks it questions directly and gets back a spreadsheet’s worth of answers in seconds.

Set up a separate, private project

  1. Open the data template, click Use this template, then Create a new repository, and choose Private. This stays off your portfolio. Only you can see it.
  2. Start a session on your data project and choose the Public records data environment. It adds the government data sites to what Claude can visit.

What’s inside the skill

The project comes with a skill called new-money. It’s one page of plain English: read it on GitHub, or find it in your own project at .claude/skills/new-money/SKILL.md. Look for:

Run it on your beat’s agency

Leads run the skill
Use the new-money skill for [your agency]

It takes a minute or two. Your leads open as a page beside the chat. The page is private to you; share it with your editor from its Share button.

Agency names that work

Use a department or agency name from USAspending, or its abbreviation. Offices inside a department go by the department: the Forest Service is under USDA, FEMA under DHS, the Army and Navy under DOD, NIH and CDC under HHS.

TypeAgency
TREASDepartment of the Treasury
HHSDepartment of Health and Human Services
DODDepartment of Defense
SSASocial Security Administration
DHSDepartment of Homeland Security
VADepartment of Veterans Affairs
USDADepartment of Agriculture
OPMOffice of Personnel Management
HUDDepartment of Housing and Urban Development
DOTDepartment of Transportation
EDDepartment of Education
FDICFederal Deposit Insurance Corporation
DOEDepartment of Energy
DOIDepartment of the Interior
DOSDepartment of State
PBGCPension Benefit Guaranty Corporation
DOLDepartment of Labor
DOJDepartment of Justice
USACECorps of Engineers - Civil Works
GSAGeneral Services Administration
EPAEnvironmental Protection Agency
DOCDepartment of Commerce
NASANational Aeronautics and Space Administration
SBASmall Business Administration
USAIDAgency for International Development
DFCU.S. International Development Finance Corporation
NSFNational Science Foundation
FCSICFarm Credit System Insurance Corporation
SECSecurities and Exchange Commission
MCCMillennium Challenge Corporation

The Pentagon and the Army Corps of Engineers make their contracts public 90 days after they’re signed. For them, add “for the last 120 days” and expect a longer wait.

While it runs, in pairs

Reading your leads

New to the agency

No contract from this agency in the five years before, found by the company’s federal ID number.

Not competed

The agency reported that no other company could bid. Sometimes for good reasons, like emergencies. It’s where reporters look first.

Each lead also links to the Federal Election Commission’s search for donations by people who named that company as their employer. Expect small, old and wrong-company matches. A match is a question to report out, not a connection.

Question your top lead

Leads check one
Why did you flag [company] as new? Show me the records you checked.

“New” means only no contract from this agency in five years. The company may have a long history elsewhere.

What this can get wrong

A flag is a lead, not a finding.

Make the skill yours

You change a skill the way you changed your site: by asking. The script stays as tested.

Leads your default
Change the new-money skill so if I don't name an agency, it uses [your agency], with a $250,000 floor.

Then type /new-money on its own. For one run, you can also ask for “contracts over $25,000” or “for the last 60 days.”

How The New York Times did this on the Epstein files

The Times built an AI tool that more than 100 of its journalists used to search the Epstein files. Of about 60 reports it wrote, at least 20 fed published stories. The team says its checking standard worked because most leads didn’t survive it.

4

part 4

Add a website Claude can visit

Your next project may need a source that isn’t on today’s list. Make your own environment and add it.

  1. Open the environment menu under the message box and choose New environment.
  2. Give it a name and set Network access to Limited.
  3. Under Allowed domains, add the sites, one per line. For House roll-call votes: clerk.house.gov
  4. Click Add environment. It’s selected for your next session.
5

part 5

What’s next

Bring it to your editor

Your newsroom’s policy says to talk to your editor if you have an idea for using AI in your reporting. If a lead turns into a story, substantial use of AI must be disclosed to the reader. Ask your editor how.

You can ask Claude for all of this

Pointing your domain at your site. Fixing an error. Explaining what the script does. Trying a new data source. Start by asking Claude.