Investigating with AI

Connecting to the course server

You have an account on investigatingwithai.com. It gives you a Linux working environment with Python, uv and Claude Code already available, plus 25 GB of space. SSH is the terminal; SFTP is the file transfer. Both use the same username and password.

Your teacher will give you a username and an initial password privately.

SSH — working in the terminal

macOS / Linux — open Terminal:

ssh yourlogin@investigatingwithai.com

Windows — open PowerShell and use the same command. (Windows 10 and 11 include an SSH client.)

The first time you connect you'll see a message about the authenticity of the host and a fingerprint. Type yes. This is normal and happens only once.

Then type your password. The cursor will not move while you type it — no dots, no stars. That is expected; type it and press Enter.

Change your password

Once you're in, set a password only you know:

passwd

It asks for the current password first, then the new one twice.

Log in without a password (recommended)

Typing a long password every time gets old, and key-based login is safer. On your own computer, run this once:

ssh-keygen -t ed25519          # press Enter three times to accept the defaults
ssh-copy-id yourlogin@investigatingwithai.com

On Windows, if ssh-copy-id is missing:

type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh yourlogin@investigatingwithai.com "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

After that, ssh yourlogin@investigatingwithai.com just lets you in.

SFTP — moving files

SFTP runs over the same SSH connection, so there is nothing extra to install on the server and nothing extra to configure.

With a graphical client — FileZilla, Cyberduck, or WinSCP:

Field Value
Protocol SFTP — SSH File Transfer Protocol (not "FTP", not "FTPS")
Host investigatingwithai.com
Port 22
Logon type Normal
User your login
Password your password

From the terminal:

sftp yourlogin@investigatingwithai.com
put localfile.csv  projects/
get outputs/figures/plot.png
bye

Copy a whole folder with scp or rsync (faster for many files):

rsync -av ./my-analysis/ yourlogin@investigatingwithai.com:~/projects/my-analysis/

What's where

Path What it is
~ (your home) Yours alone. No other student can read it. 25 GB quota.
~/projects/ Your own analysis projects. Private to you.
~/project-<name>/ Your research team's folder. Your team can read and edit; nobody else can even list it.
~/datasets-shared/ Shared reference datasets. Read-only — copy what you need.
~/class-common/ Course-wide scratch space. Everyone on the course can read and edit these files.
/data/shared/dropbox/ Hand-in folder. You can write into it but not list or read it — submissions stay private.

Check your remaining space at any time:

quota -s

~/class-common/ has no undo. Anyone on the course can overwrite or delete anything there. Keep your work in git, and treat it as a shared table, not a safe.

Running Jupyter

The easy way is https://investigatingwithai.com/jupyter — sign in with the same username and password you use here, and you get JupyterLab in your browser with no tunnel and no token.

Each student's Lab is capped at 6 GB of memory and 2 cores, and is shut down after two hours idle. Files are never touched by that shutdown.

The kernel

Notebooks run on Course (data science), the only kernel offered. It is the shared environment with pandas, NumPy, scikit-learn, matplotlib and nltk already installed, and it is where %claude works — so there is nothing to choose and nothing to get wrong.

You do not install packages into it yourself. If something you need is missing, ask, and it is added for everyone.

Or run it yourself

You rarely need this; the browser route above is simpler. It is useful if you want a notebook server entirely under your own control.

cd ~/projects/my-analysis
/data/shared/venvs/ds/bin/jupyter lab --no-browser --port 8888

That is the same environment as the Course (data science) kernel. If you prefer your own, uv venv in your project folder and install what you need there — but then %claude and the shared libraries will not be present unless you add them.

Then, in a second terminal on your own computer, forward the port:

ssh -L 8888:localhost:8888 yourlogin@investigatingwithai.com

Now open the http://localhost:8888/... link that Jupyter printed, in your own browser. Keep both terminals open while you work.

Claude Code on the server

Claude Code is already installed for everyone. You do not need to install anything — just start it:

claude

The first time, it asks you to sign in. Login opens a browser — but there is no browser on the server. Press c, open the URL on your own computer, log in, and paste the code back into the terminal. Use the course Claude account, not a personal one. You do this once; it remembers you afterwards.

Asking Claude from inside a notebook

In JupyterLab you can also ask Claude directly from a cell, without leaving your analysis:

%claude why is my dataframe empty?

Write a question in a cell and press the ✨ button in the cell toolbar, or use %%claude with the question on the lines below it. If the answer contains code, it appears in a new cell underneath, ready for you to read and run.

Claude sees the variables you have defined and your recent cells, so you can refer to df without explaining it. It does not see the contents of your data — only the shape and column names — and it never edits your notebook by itself.

This runs on your own course Claude account, exactly like claude in the terminal, so there is nothing extra to set up and nothing to pay for.

Working with your research team

Each research team has a folder on the server. It appears in your home directory as ~/project-<name>/, where <name> is your project's short name.

cd ~/project-inequality

Three things are worth knowing about it.

It is private to your team. Students on other teams cannot open it, and cannot even list what is inside. You do not need to hide anything.

Files you create there belong to the team automatically. Whoever created a file, any teammate can edit it — whether it arrived over SSH, by SFTP, or from JupyterLab. There is no permission dance to perform.

There is no undo. A teammate can overwrite or delete your work, exactly as you can theirs. So, from the first day:

cd ~/project-inequality
git init
git add -A
git commit -m "first commit"

Commit early and often, and push to a private GitHub repository as a backup. The server is backed up nightly, but a restore brings back the whole machine, not the paragraph you deleted twenty minutes ago. Git is what protects your work from your team, and from yourself.

One quirk to expect: the team folder has its own 100 GB allowance, but your own 25 GB quota still counts every file you personally created, wherever it sits. If you hit "Disk quota exceeded" while writing into the team folder, it is your personal quota you have filled, not the team's.

When things go wrong

"Permission denied, please try again." Wrong password, or wrong username. Passwords are case-sensitive. Ask for a reset rather than guessing repeatedly.

"Connection refused" or it just hangs. Some university and hotel networks block outbound port 22. Try tethering to your phone to confirm, then tell your teacher.

You're locked out after several failed attempts. The server blocks an address for 15 minutes after 8 failures. Wait it out — it clears on its own.

"Disk quota exceeded". You've hit 25 GB. Run du -sh ~/* | sort -h to find the big folders. Raw data you can re-download does not belong in your home directory.

A command keeps running after you disconnect. It doesn't — closing SSH kills it. For long jobs use tmux: run tmux, start the job, press Ctrl-b then d to detach, and tmux attach to come back later.