Build a Personal n8n Automation Server

Self-host n8n in Docker and build an RSS feed monitor with keyword filtering.

Introduction

30 Second Summary

Every day, hundreds of blog posts go live across the tech sites you follow. Most of them are noise. Wouldn't it be nice if something quietly watched those feeds for you and only surfaced the posts that match your interests?

In this project, you will build a personal automation server on your Windows machine using n8n and Docker. You will create a visual workflow that monitors an RSS feed, filters posts by keywords you choose, and runs automatically in the background.

What You'll Build

You will open your browser, see the n8n workflow editor, and watch as your automation pulls in live blog posts, checks them against your keywords, and logs the matches for you to review anytime.

By the end of this project, you'll have:

  • A running automation server you can open in your browser to build, edit, and monitor workflows with your data persisted across restarts.
  • A live RSS monitoring workflow that polls a tech blog feed and shows you new posts as they are published.
  • A keyword filter that cuts through the noise and surfaces only the posts matching your interests.
  • Secret Mission: Scale your automation to monitor multiple RSS feeds at once using n8n's Loop Over Items pattern.

Are there any prerequisites?

You need a Windows 10 or 11 PC (64-bit) with hardware virtualization enabled in BIOS. No prior Docker or automation experience is required.

Before We Start

Before we dive in, let's lock in what you're about to build and why it matters. This step is your chance to commit to the goal before any hands-on work begins.

Set Up Docker and Launch n8n

n8n is a workflow automation server that needs a runtime environment with specific dependencies. Docker packages all of those dependencies into an isolated container, so you can run n8n reliably on Windows without managing Node.js versions or library conflicts yourself.

In this step, you will install Docker Desktop, pull the official n8n image, and launch your personal automation server with persistent storage.

In this step, get ready to:
  • Install Docker Desktop with WSL 2 support on Windows.
  • Launch an n8n container with persistent data storage.
  • Create your n8n owner account and reach the dashboard.
Install Docker Desktop

Docker Desktop provides the engine that runs containers on Windows. It uses WSL 2 (Windows Subsystem for Linux) under the hood to run Linux-based container images like n8n.

Why Per-user installation?

Per-user mode does not require administrator privileges to install or update Docker Desktop. It installs to your local user directory and uses WSL 2 as the Linux containers backend.

  • If the installer prompts you to enable WSL 2, accept it. Enabling WSL 2 is a one-time setup that may require a restart.
  • After installation completes (and any required restart), press the Windows key to open your search bar.
  • Type Docker Desktop and press Enter to launch it.
  • Wait for the Docker engine to start. The whale icon in the system tray will stop animating when the engine is ready.

Now verify that Docker is accessible from the command line.

  • Press the Windows key, type PowerShell, and press Enter to open a PowerShell window.
  • Verify Docker is running by entering this command:
docker --version

✔️ I see a version number

Docker is installed and running. You are ready to launch n8n.

ⓧ Command not found or error

This means Docker Desktop has not finished starting, or the installation did not complete.

  • Check the system tray for the whale icon. If it is still animating, Docker is still starting. Wait until it stops.
  • If there is no whale icon, open Docker Desktop from the Start menu again.
  • If you were prompted to restart after enabling WSL 2, make sure you have restarted your computer and relaunched Docker Desktop.
  • Close and reopen PowerShell after Docker Desktop is running, then try the command again.

Still not working?

Make sure your system meets the requirements: Windows 10/11 64-bit with hardware virtualization enabled in BIOS. Docker Desktop requires WSL version 2.1.5 or later and at least 8GB of system RAM.

help me troubleshoot Docker Desktop not starting on Windows

Run the n8n container

With Docker running, you can now pull the official n8n image and start your automation server. A Docker volume will persist your workflows and settings even when the container is stopped.

  • Create a persistent volume for n8n data by running this command in PowerShell:
docker volume create n8n_data

You should see n8n_data printed back in the terminal, confirming the volume was created.

  • Start n8n with persistent storage by running this command:
docker run -it --rm --name n8n -p 5678:5678 -e GENERIC_TIMEZONE="[[TIMEZONE="America/New_York"]]" -e TZ="[[TIMEZONE="America/New_York"]]" -e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true -e N8N_RUNNERS_ENABLED=true -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n

What does this command do?

  • -it runs the container interactively so you can see its logs in real time.
  • --rm removes the container automatically when it stops. Your data is safe because it lives in the n8n_data volume, not in the container itself.
  • -p 5678:5678 maps port 5678 inside the container to port 5678 on your machine.
  • GENERIC_TIMEZONE sets the timezone for schedule-oriented nodes like the Schedule Trigger.
  • TZ sets the system timezone inside the container.
  • -v n8n_data:/home/node/.n8n mounts your persistent volume so workflows, credentials, and execution history survive restarts.

💡 Find your timezone

Replace America/New_York with your timezone from the list of tz database time zones. For example, use Europe/London for the UK or Asia/Tokyo for Japan.

Docker will download the n8n image on first run, which may take a minute. Wait until you see output that includes:

n8n ready on 0.0.0.0, port 5678
Editor is now accessible via:
http://localhost:5678/
  • Open your browser and go to http://localhost:5678.

You should see the n8n setup screen asking you to create an owner account.

Not seeing the n8n setup screen?

  • Check your PowerShell window for error messages. If you see a port conflict, another application is using port 5678. Close that application and re-run the command.
  • Make sure you typed the URL exactly as http://localhost:5678 (not https).
  • If the container exited immediately, make sure Docker Desktop is still running (whale icon in the system tray).

help me troubleshoot why n8n is not loading in my browser

Create your n8n account

The first time you visit your n8n instance, it shows a setup wizard to create the owner account. This account secures your local instance.

  • On the setup screen, enter your first name and last name.
  • Enter an email address (this is your login username).
  • Enter a password. It must be at least 8 characters and include at least one number and one capital letter.
  • Click Next to create your account.
  • n8n may show optional questions about your company and role. You can skip these or answer them. They do not affect functionality.

Before you look at the result, what do you think you will see after completing the setup?

After completing setup, you land on the n8n dashboard. This is your personal automation server, running locally on your machine.

What is stored in the n8n_data volume?

The n8n_data volume stores your workflows, credentials, execution history, and an encryption key. Because you mounted this volume, everything persists even when the container is removed and re-created.

Your automation server is live. Next up, you will build your first RSS workflow and watch live data flow through n8n.

Build Your First RSS Workflow

Your automation server is up and running. Now it's time to make it do something useful.

Right now, n8n is an empty canvas. You need to connect it to a live data source so you can see real information flowing through a workflow. In this step, you'll wire up an RSS feed and watch your server pull in posts from the internet for the first time.

In this step, get ready to:
  • Create a new workflow and add an RSS Feed Trigger node.
  • Configure the trigger to poll a live tech blog feed.
  • Test the workflow and see real RSS items appear in n8n's output panel.
Create a new workflow and add the RSS Feed Trigger

Workflows in n8n start with a trigger node. A polling trigger checks a source on a schedule and pulls in any new data it finds.

  • In the n8n dashboard, click Create Workflow (or click the + icon).
  • Click Add first step to open the nodes panel.
  • Search for RSS Feed Trigger and select it.

You should see the RSS Feed Trigger node appear on your canvas with its configuration panel open on the right.

  • In the node configuration, set the Feed URL field to:
https://dev.to/feed
  • Under Poll Times, select Mode: Every Hour.
  • Set Minute to 0.
  • Close the node configuration panel to return to the canvas.

What is the RSS Feed Trigger?

The RSS Feed Trigger starts your workflow whenever new items appear in an RSS feed. It checks the feed on the schedule you set (every hour, at minute 0) and compares against previously seen items.

The https://dev.to/feed URL points to dev.to's public blog feed. It updates frequently with tech articles, so you'll always have fresh data to work with.

🙋‍♀️ Don't see the RSS Feed Trigger in the search?

Make sure you're searching for the full name RSS Feed Trigger (not just "RSS"). The regular "RSS Read" node is different and won't work as a trigger.

help me find the RSS Feed Trigger node in n8n

Test the workflow

Your trigger is configured, but you haven't seen it pull any data yet. Before you run the test, think about what you expect to see. An RSS feed is structured data about blog posts. What fields do you think each post will have?

  • Click Test workflow at the bottom of the canvas.

n8n executes the RSS Feed Trigger and fetches the latest items from dev.to's feed.

  • Click on the RSS Feed Trigger node to open it.
  • Look at the OUTPUT panel on the right side of the configuration.

You should see multiple items, each containing fields like title, link, pubDate, and content. This is live data from dev.to flowing through your automation server.

  • Browse through the items to see what a full RSS feed contains. Each item is a blog post with its metadata.

Why does the first test return so many items?

On the first run (or manual test), the RSS Feed Trigger returns all current items in the feed because it hasn't tracked any previous items yet. Once the workflow is active and running on its hourly schedule, it only returns new posts that appeared since the last check.

No items appearing in the output?

Check that the Feed URL is exactly https://dev.to/feed with no extra spaces or characters.

If you see a connection error, make sure your computer has an active internet connection. The n8n container needs to reach dev.to to fetch the feed.

help me debug why my RSS Feed Trigger test returns no items

Your automation server just pulled live data from the internet for the first time. Next up, you'll add filtering so only the posts you actually care about make it through.

Filter the Noise

Your RSS Feed Trigger is pulling live posts from dev.to straight into your workflow. That is your automation server doing real work for the first time.

There is a problem though. The trigger returns every post in the feed, including topics you have zero interest in. In this step, you will add conditional logic to surface only posts that match your keywords.

In this step, get ready to:
  • Add an If node to filter posts by keyword.
  • Add an Edit Fields node to format clean output.
  • Test the complete filtering workflow.
Add an If node for keyword filtering

Right now, every single post from dev.to flows through your workflow. You need a way to ask a question about each post: does its title contain a keyword I care about? The If node does exactly this.

  • Click the + connector on the right side of the RSS Feed Trigger node to add a new node.
  • In the search panel, type If and select it.

The If node opens its configuration panel. You need to set up a condition that checks each post's title for your keyword.

  • Click Add Condition and select String.
  • In the left Value field, click the small expression editor icon (it looks like a pair of braces).
  • Type {{ $json.title }} into the expression editor. This tells n8n to read each post's title.
  • Set the operation dropdown to Contains.
  • In the right Value field, type a keyword you are interested in, such as javascript, python, docker, or ai. Pick something broad enough to get matches from a tech blog.
  • Close the node configuration panel to return to the canvas.

What does this condition do?

The expression {{ $json.title }} reads the title field from each RSS item flowing through the node. The Contains operation checks whether that title includes your keyword.

Items that match go out the true branch. Items that do not match go out the false branch. This is how you split a stream of data based on a condition.

On the canvas, you should see the If node connected to the RSS Feed Trigger with two output connectors labeled true (top) and false (bottom).

Don't see two branches on the If node?

Make sure you selected the If node, not the Switch node. The Switch node looks similar but has multiple named outputs. The If node has exactly two: true and false.

If the node is not connected to the RSS Feed Trigger, drag a line from the RSS Feed Trigger's output connector to the If node's input.

Why isn't my If node showing two branches?

Add an Edit Fields node for clean output

RSS feed items contain many fields you do not need, like raw HTML content and author metadata. The Edit Fields node lets you pick only the fields worth keeping so your output stays readable.

  • Click the + connector on the true output (the top branch) of the If node.
  • Search for Edit Fields and select it. This node may also appear as Set in the results.

The Edit Fields configuration panel opens. You will add three fields that represent the useful information from each matching post.

  • Click Add Field and set the Field Name to title and the Value to {{ $json.title }}.
  • Click Add Field again and set the Field Name to link and the Value to {{ $json.link }}.
  • Click Add Field one more time and set the Field Name to published and the Value to {{ $json.pubDate }}.
  • Toggle on Include Only Set Fields at the top of the configuration panel. This strips out every other field and keeps your output clean.
  • Close the configuration panel to return to the canvas.

Why strip the extra fields?

Without Include Only Set Fields enabled, the node passes along the original item plus your new fields. That means you still see raw HTML content, author metadata, and other noise.

Toggling it on means only your three chosen fields (title, link, published) appear in the output. This makes results easy to scan at a glance.

On the canvas, the Edit Fields node should now be connected to the true (top) branch of the If node.

Test the filtered workflow

Your workflow now has three nodes connected in sequence. Time to run it and see the filtering in action.

Before you click the test button, predict what you expect to happen. Will every item from the RSS feed end up in the true branch, or only some of them?

  • Click Test workflow at the bottom of the canvas to run the entire chain.
  • Click on the If node to open it and view the output panel.

You should see items split into two groups. The true tab shows posts whose titles contained your keyword. The false tab shows everything else that was filtered out.

  • Click on the Edit Fields node to see your clean, filtered output with just the title, link, and publish date for each matching post.

No matches in the true branch?

If your keyword did not match any titles, go back to the If node and try a more common term. Words like web, react, or api tend to appear frequently on dev.to. Use a lowercase keyword for more reliable matching.

🙋‍♀️ Seeing an error when you test?

Make sure the expression in the If node's left Value field is exactly {{ $json.title }} with the double curly braces. A missing brace or extra space will cause an evaluation error.

Check that the Edit Fields node is connected to the true output of the If node (the top connector), not the false output.

Help me fix my n8n workflow test error

Your workflow now filters the noise and surfaces only what matters to you. Next up, you will publish it so it runs automatically in the background without you lifting a finger.

Publish Your Automation

Your workflow filters RSS posts exactly the way you want. You tested it, saw keywords get matched, and confirmed clean output in the Edit Fields node.

There is one gap remaining. Right now, the workflow only runs when you manually click Test workflow. To make this a true automation, you need to publish it so it runs on its configured hourly schedule without you touching the browser.

In this step, get ready to:
  • Publish the workflow so it runs automatically on its schedule.
  • Verify that an automatic execution completes successfully.
  • Learn how to stop, restart, and background your n8n container.
Save and publish your workflow

n8n autosaves your edits as a draft. To make the workflow run on its schedule, you need to publish it.

  • In the workflow editor, click the Publish button in the top-right corner of the canvas header.
  • A publishing modal appears. Leave the default version name and click Publish to confirm.

The button now shows that your workflow is published. Your RSS Feed Trigger schedule is live and will fire every hour at minute 0.

What does publishing do?

Publishing locks your workflow to a specific version and activates its triggers. Schedule-based triggers like the RSS Feed Trigger start running at their configured times.

Any future edits you make stay in draft until you publish again. This means you can experiment without disrupting the live automation.

🙋‍♀️ Publish button is greyed out?

The Publish button stays disabled if there are no new changes to publish. Make a small edit (like toggling a node setting) to activate it. Also ensure your workflow has a trigger node connected. A workflow without a trigger has nothing to schedule.

Still stuck? Help me figure out why my n8n workflow won't publish.

Verify automatic execution

Your workflow is published, but you have not seen it run on its own yet. To confirm it works without manual intervention, you will check the Executions tab for a completed run.

  • To see results faster without waiting a full hour, open the RSS Feed Trigger node by double-clicking it on the canvas.
  • Under Poll Times, change Mode to Every X and set Minutes to 1.
  • Close the node configuration, then click Publish again to push this change live.
  • Wait about 1-2 minutes for the next polling interval to trigger.

Before you check the results, predict what you expect to see. Do you think the execution will show the full RSS feed items, or just the filtered ones from your keyword?

  • Click the Executions tab at the top of the canvas to view execution history for this workflow.

You should see a new execution entry with a timestamp and a status of Success. The execution processed all nodes in your workflow chain automatically.

  • Click on the execution entry to open it and review the data that flowed through each node.
  • Confirm that the RSS Feed Trigger pulled items, the If node split them by your keyword, and the Edit Fields node produced clean output on the true branch.

What does the execution show?

Each execution records the full data flow. The RSS Feed Trigger shows all fetched items. The If node shows how many matched (true) versus how many did not (false). The Edit Fields node shows only the filtered, formatted results.

The execution ran entirely in the background. You did not click anything to trigger it.

  • Now change the poll time back to its normal schedule. Double-click the RSS Feed Trigger node and set Mode back to Every Hour with Minute set to 0.
  • Close the node, then click Publish to push the restored schedule live.

No execution appearing?

Make sure you published the workflow after changing the poll time to 1 minute. Unpublished changes stay in draft and do not trigger automatically.

Also check that your Docker container is still running in PowerShell. If you accidentally closed the terminal window, n8n stopped and no executions can fire.

Need more help? Help me troubleshoot why my n8n workflow is not executing automatically.

Manage your n8n container

Your n8n server runs as long as the Docker container is running. Here is how to control it going forward.

To stop n8n, press Ctrl+C in the PowerShell window where you started it. The container stops and is removed (because of the --rm flag). Your data is safe in the n8n_data volume.

  • To restart n8n later, open PowerShell and run the same docker run command you used in Step 1. Your workflows, credentials, and execution history persist in the volume.

If you want n8n running in the background without tying up a terminal window, use detached mode. This replaces -it --rm with -d.

  • Run n8n in detached mode by running this command:
docker run -d --name n8n -p 5678:5678 -e GENERIC_TIMEZONE="[[TIMEZONE="America/New_York"]]" -e TZ="[[TIMEZONE="America/New_York"]]" -e N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true -e N8N_RUNNERS_ENABLED=true -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8n

What changed from the original command?

The -it flags (interactive terminal) and --rm flag (auto-remove on stop) are gone. The -d flag runs the container in the background.

Without --rm, the container persists after stopping. You need to explicitly remove it before re-running with the same name.

  • To stop a detached container, run:
docker stop n8n
  • To remove the stopped container (so you can start a fresh one with the same name), run:
docker rm n8n

Leave it running for the Secret Mission

If you plan to tackle the Secret Mission next, keep your n8n container running. You will extend this workflow to monitor multiple RSS feeds.

Secret mission

Monitor Multiple RSS Feeds

Your workflow monitors a single feed. Real-world automation usually pulls from multiple sources at once. In this bonus challenge, you will replace the RSS Feed Trigger with a Schedule Trigger, a Code node listing feed URLs, and a Loop Over Items pattern that reads each feed individually before passing all items through your keyword filter.

Clean Up Your Resources

Clean Up Your Resources

Decide whether to keep your resources running, pause them to come back later, or delete them entirely. This project runs entirely locally, so there are no ongoing costs.

Resources you used:

  • Docker volume n8n_data (stores your workflows, credentials, and execution history locally).
  • n8n Docker container (runs locally on port 5678, no cloud costs).
  • Docker Desktop application (installed on your Windows machine).

Keep everything running

No action needed. Choose this if you are still actively building or want n8n running in the background.

  • To keep n8n running after you close the PowerShell window, stop the current container with Ctrl+C and restart it in detached mode using the -d flag (covered in Step 4).
  • To have Docker Desktop start automatically when Windows boots, open Docker Desktop, go to Settings, then General, and enable Start Docker Desktop when you sign in to your computer.
  • Your workflows, credentials, and execution history persist in the n8n_data volume regardless of whether the container is running.

Pause - I'll come back to this later

Shut down running processes to free up system memory. Your workflow data is preserved in the Docker volume and will be there when you return.

  • Stop the n8n container by pressing Ctrl+C in the PowerShell window where it is running. If you ran it in detached mode, run this command instead:
  • Quit Docker Desktop by right-clicking the whale icon in the system tray and selecting Quit Docker Desktop.
  • When you are ready to come back, launch Docker Desktop again and run the same docker run command from Step 1. Your workflows will be exactly as you left them.
docker stop n8n

Why does my data survive?

The n8n_data volume lives on your machine independently of the container. Stopping or removing the container does not touch the volume. Your workflows, credentials, and execution history are safe.

Delete - I don't want to use this again

Remove all project resources and start fresh. This permanently deletes your n8n workflows and execution history.

  • Stop the n8n container. If it is running interactively, press Ctrl+C. If it is running in detached mode, run:
  • Remove the stopped container (skip this if you started it with the --rm flag, since it removes itself automatically):
docker stop n8n
docker rm n8n
  • Delete the n8n_data volume to remove all stored workflows, credentials, and execution history:
docker volume rm n8n_data
  • To uninstall Docker Desktop entirely, open Windows Settings, then Apps, then Apps & features.
  • Find Docker Desktop in the list, select it, and click Uninstall.
  • Confirm the uninstall when prompted.

What about leftover Docker files?

After uninstalling Docker Desktop, some residual files may remain on your machine. You can optionally delete these folders if you want a completely clean slate:

  • C:\Users\<your username>\AppData\Local\Docker
  • C:\Users\<your username>\AppData\Roaming\Docker
  • C:\Users\<your username>\AppData\Roaming\Docker Desktop

Nice Work!

Nice Work!

You just built a personal automation server from scratch. You have a fully functional n8n instance running in Docker on your Windows machine, monitoring RSS feeds and filtering posts by your keywords on autopilot.

Here's what you learned:

  • Launched a personal n8n automation server inside a Docker container with persistent data storage that survives restarts.
  • Built a visual RSS monitoring workflow using trigger nodes, conditional logic with the If node, and clean output formatting with Edit Fields.
  • Published the workflow to run on an automatic schedule without needing the browser open.
  • Secret Mission: Scaled the workflow to monitor multiple RSS feeds using the Loop Over Items pattern.

Ready to quiz yourself?