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.