Skip to content
Guide

A free Claude Code alternative using the web chat

Without a Claude Code or Cursor subscription, you can still get whole-project edits from the free Claude or ChatGPT web chat: send the project as one ZIP, ask for the change, and write the returned files back. contextzip does the packaging and the writing back. It's a loop you drive, not an agent, so you run the commands and the tests yourself.

What you give up compared with Claude Code

Worth knowing before you start, so the comparison is fair:

  • No agent. The chat can't run your tests, read a new error, or go back and fix it. You do that, and paste the error back in.
  • One round trip per change. Package, paste, download, apply. Each step is one command or one paste, but it's still four steps.
  • Free-plan limits. Message limits and the context window decide how much code you can send and how long the chat can go. Send only what the task needs.

What you keep: your own editor, your git history, and a review of every file before it lands. Nothing touches your project until you run apply-zip.

The loop by hand

You can run this loop with nothing but git. Zip the project from its root, keeping folders and leaving out what git ignores:

macOS / Linux
cd my-appgit ls-files --cached --others --exclude-standard | zip ../my-app.zip -@
Windows (PowerShell)
cd my-appgit ls-files --cached --others --exclude-standard | Where-Object { Test-Path $_ } | Set-Content files.txttar -a -cf ..\my-app.zip -T files.txtRemove-Item files.txt

git ls-files lists every file git tracks plus new files you haven't committed, and skips anything in .gitignore. So node_modules/, .venv/ and build output stay out, and the folder structure is kept. Windows 10 and 11 ship tar, which can write a ZIP; the list goes through a file because PowerShell 5.1 garbles paths piped straight into it.

Check for secrets before you upload

This takes whatever git sees. A .env that isn't in .gitignore, or a key committed by mistake, goes into the ZIP. List the contents first with unzip -l ../my-app.zip or tar -tf ..\my-app.zip.

Then tell the AI how to answer. Most of the pain comes later, when changed files come back as bare names and you have to work out where each one goes. Ask for full paths up front:

Add to your prompt
For every file you change or create, give the complete file, not a snippet.Put its full path from the project root on the first line,for example: // src/lib/auth.tsKeep the same folder structure. Don't move files to the root.

Ask for the changed files back as a ZIP, then unzip it over the project on a new branch and read git diff. The weak spot is the way back: files that come back flattened, wrapped in an extra folder or cut short, and edits you made in the meantime getting overwritten.

The faster way: contextzip

Here's the whole loop on Claude's free plan, in 72 seconds:

1. Install it once. With Python 3.9 or newer, use pip (pipx and uv work too). Without Python, npm install -g @contextzip/cli, Homebrew or Scoop install the same tool.

bash
pip install contextzip

2. Package the project. Run cz from the project root. It detects your stack, leaves out dependencies, build output, caches, binaries and secret files, and puts the ZIP on your clipboard as a real file.

bash
cz

3. Paste it into Claude or ChatGPT. Click the message box and press Ctrl+V (⌘V on a Mac). The ZIP attaches like any file you copied in your file manager. It also carries a short CONTEXTZIP.md that tells the AI how to reply: complete files, the same paths, secrets left as [REDACTED].

4. Write the answer back. Ask for the changed files as a ZIP, download it, and point cz apply-zip at it. Or drop it in .contextzip/inbox/ and run cz apply-zip with no arguments.

bash
cz apply-zip ~/Downloads/reply.zip

AI replies rarely come back in the shape you sent. A ZIP can arrive wrapped in an extra folder, relative to a subfolder (src/… for frontend/src/…), or flattened to bare file names. apply-zip matches each file to your project by the longest stretch of its path that agrees, and new files follow their siblings. A name that fits several files, like three different page.tsx, is settled by comparing contents. If it's still unclear, you choose. Nothing is written on a guess.

It also compares three versions of every file: what you sent, what's on disk now and what came back. Edits you made in the meantime are merged, not overwritten, and anything that clashes waits for you. How apply-zip works

~/projects/my-app

$ contextzip apply-zip

✓ Resolved · .contextzip/inbox/fix.zip

✓ Compared with snapshot #14 (k3f9a2) · named in the reply's CONTEXTZIP.md

Paths in the zip were remapped: my-app-fixed/… → …

✓ Classified 6 files · 1 modified, 1 merged, 1 new, 1 unchanged

! 1 conflict, 1 partial — needs your call

To stretch free-plan limits, send less each time. cz --git-changes packages only what you've changed, and cz -p "add a dark mode toggle" picks only the files for one task.

FAQ

Is this as good as Claude Code?
No, and it isn't trying to be. Claude Code is an agent that reads, runs and edits your project by itself. This is a manual loop: you send the code, the chat suggests changes, you write them back and run the tests. For many changes that's enough, and it costs nothing extra.
Does it work on Claude's free plan?
Yes. The walkthrough video packages a project with cz, pastes it into Claude on the free plan, and writes the reply back with cz apply-zip. Free-plan usage limits still apply, so smaller ZIPs go further.
Is this also a free Cursor alternative?
The same loop works with ChatGPT, Gemini or any chat that accepts a ZIP upload, so you can use it instead of an AI editor. You keep your own editor and git, and you review every change before it lands.
Is contextzip free?
Yes. It's open source under the MIT license and installs with pip install contextzip. It doesn't need any paid service: the optional AI file picker uses a free Gemini API key.
Does my code go anywhere besides the chat I paste it into?
No. Packaging and apply-zip run on your machine with no network access and no telemetry. The only features that use the network are the optional --prompt file picker, which sends file paths and sizes but never contents, and the update check.