Setting Up My First Notion Worker on Windows: What Nobody Tells You About WSL2
Installing Notion Workers on Windows isn't plug-and-play yet. Here's the three-hour story of WSL2 setup, cross-OS gotchas, and the workaround that finally got my first Worker shipping live data into Notion.
Or, how I tried to sync Garmin data into Notion, ended up debugging two operating systems at once, and finally understood what
~ really means.I had a plan tonight. Connect my Garmin watch to Notion using the new Notion Workers platform, so all the sleep and run data I never look at could finally live somewhere I actually open every day. By 1 AM, I had a working sync. Not for Garmin. For weather. And I'd learnt more about Windows Subsystem for Linux than I ever planned to.
Here's the journey, in case you're about to walk down the same path.
The dream: Garmin in Notion
I wear my Garmin most days. Sleep scores, runs, the occasional weight check-in. All of it sits in Garmin Connect doing absolutely nothing useful for me. I figured I'd pipe it into a Notion database so I could see patterns over time and stop pretending I'll remember last Tuesday's resting heart rate.
Then I opened the Garmin developer portal.
OAuth dance. Application approval. Token-based auth since their March 2025 update. The learning curve was big enough that show me a working demo by tonight was off the table.
So I pivoted. Weather data first. Open-Meteo has a free forecast API with no authentication and a clean daily endpoint. If I could get weather flowing into Notion through a Worker, the Garmin version would just be a swap of the data source later.
The toolchain
I'd already installed
ntn, the Notion CLI, inside WSL2 Ubuntu on my Windows machine. ntn is macOS and Linux only, so WSL2 is the official path for Windows users. That bit was working.I'd also been using Qwen Code as my AI pair programmer for a few weeks. Fast model, generous free tier through Alibaba Cloud Model Studio, plays nicely with custom skills. I'd even taught it a custom skill for using the Notion CLI.
So I opened Qwen, told it to scaffold a new worker, and watched it run.
$ ntn workers new weather-sync /usr/bin/bash: line 1: ntn: command not found
Wait. I literally installed
ntn an hour ago.The first wall: two operating systems, two ~ folders
This is the bit nobody tells you when you first set up WSL2.
When you're inside Ubuntu,
~ means /home/<your-linux-user>/. When you're in PowerShell or Git Bash on Windows, ~ means C:\Users\<your-windows-user>\. They are completely separate folders. Files in one are invisible to the other unless you cross the bridge mount at /mnt/c/....Qwen Code, it turned out, was installed on the Windows side. So when I launched it from a Windows shortcut, it ran in a Windows context. When it shelled out to call
ntn, it called the Windows shell. Windows had no ntn because ntn was on the Linux side.Two worlds talking past each other.
Pivot: install Qwen inside WSL2
Easy fix, right? Just install Qwen on the Linux side too.
I ran the official Alibaba install script inside Ubuntu. It completed without errors. I typed
qwen --version and got:/mnt/c/Users/User/AppData/Roaming/npm/qwen: 15: exec: node: not found
Excuse me?
This is the Windows PATH leak. By default, WSL2 appends Windows's PATH to its own. So all my Windows-installed npm tools were visible from Linux too. The official Linux install script hadn't properly placed a Linux
qwen binary anywhere on PATH, so the Windows one was winning. But the Windows qwen was then trying to call a Windows node that Linux couldn't see.Three layers of cross-OS confusion in a single error message.
The actual fix: nvm, npm, and a Linux-native install
Notion AI walked me through what was actually happening. The three pieces that turned out to matter:
- The default Node on Ubuntu doesn't ship
npm. When I triedsudo npm install, I gotsudo: npm: command not found. Ubuntu'snodejspackage andnpmpackage are separate, and onlynodejswas installed.
- I had
nvminstalled but not loaded. A.nvmfolder sat in my home directory, but~/.bashrchad no init lines for it. My shell was using system Node (no npm) instead of nvm Node (with npm).
- The right move was to activate nvm, install a recent Node through it, then install Qwen via that npm. All on the Linux side. No
sudoneeded, because nvm installs everything under my home folder.
The dance that worked:
source ~/.nvm/nvm.sh nvm install --lts nvm use --lts npm install -g @qwen-code/qwen-code hash -r which qwen qwen --version
which qwen finally returned a path inside ~/.nvm/.... The version printed cleanly. We were Linux-native at last.To make this stick across new shells, I appended the nvm init lines to
~/.bashrc. One-time cost. Future me's problem solved.The interactive CLI deadlock
I thought I was home free. I launched Qwen inside my project folder, pasted my weather sync spec, and watched it confidently scaffold the worker, then run the deploy.
Then it froze.
ntn workers deploy was prompting for a worker name. The agent had run it in a sandboxed subprocess that couldn't accept stdin from me. So ntn was waiting forever for input. Qwen was waiting for ntn to finish. I was waiting for either of them to do something. We were all just staring at each other politely.The fix is brutally simple once you know it. Open a second terminal, run the interactive command yourself, then tell the agent "done, continue." I also added a
## Shell commands section to my QWEN.md project rules so the agent would avoid interactive commands going forward.The win
Three hours after starting, I refreshed my Notion Weather Log database and saw seven rows. Today through next Tuesday. Day, Date, Location, Condition, Temp Max, Temp Min, Feels Like, Precipitation, Rain Probability, Wind, UV Index, Sunrise, Sunset. All populated. All updating on a daily schedule. Welcome to Singapore in May, where apparently every single day this week is a thunderstorm.
It worked.
What I actually learnt
Forget the weather data for a second. The real lesson from tonight:
Pick a side. If your CLI lives in WSL2, everything that calls it must also live in WSL2. That means your coding agent, your project files, your terminal. Cross the boundary and things break in confusing ways.
That's it. That's the whole rule. If I'd known it two hours earlier, I would have saved myself a lot of pacing and a lot of squinting at PATH variables.
A few related rules that fell out of the same lesson:
- Project files belong in
~/projects/, not on/mnt/c/.... File operations across the Windows/Linux mount are slow and produce weird permission and line-ending bugs over time.
- VS Code with the WSL extension is a perfect bridge. Open it from inside a WSL terminal with
code .and its integrated terminal is already WSL. No more wondering which world you're in.
- A good
QWEN.md(orCLAUDE.md, orAGENTS.md) saves you hours. Tell the agent your environment rules up front so it doesn't have to rediscover them through failed commands.
What's next
Garmin sync, version 2. Now that I have the worker pattern, the schedule, and the database shape figured out, swapping in a different data source is the easy bit. I'll write that one up when it works.
Until then, here's the honest take.
Notion Workers is not yet a smooth experience if you're on Windows.
ntn doesn't ship a native Windows build, the WSL2 path drags a whole second operating system into your setup, and the cross-OS gotchas above are real, undocumented, and easy to trip over even if you're already comfortable in a terminal. I'd love to see Notion ship a first-class Windows experience for the Workers platform, because the platform itself is genuinely promising.The good news: there is a workaround, and it does work. WSL2 plus a Linux-native install of your coding agent gets you to the same place as a Mac or Linux user, just with more setup tax up front. Once you've paid that tax once, future projects take minutes instead of hours, because all the foot-guns above are already disarmed.
So if you're a Windows user eyeing Notion Workers right now, go in with eyes open. It's not plug-and-play yet. But the workaround is there, and the moment you get your first sync running, the rest of the platform starts to feel like the future of Notion automation.
Pick a tilde and stick with it.