This week I set up an AI model that runs entirely on a computer in my house. There is no subscription, no API key, and nothing leaves my home network. I wanted to answer two questions. Can an old desktop with a graphics card from 2017 run a genuinely useful AI model? And can that model help keep this site in good shape for search engines? The answer to both is yes, with a few surprises along the way, including one about cost that I did not expect.
The Hardware

The whole build is a retired office desktop plus one graphics card:
- Graphics card: XFX Radeon RX 580 with 8 GB of video memory (VRAM)
- Processor: Intel Core i5-4440, 4 cores at 3.1 GHz, from 2013
- Motherboard: ASUS H81M-PLUS
- Memory: 16 GB of DDR3-1600 in two 8 GB sticks
- Storage: 1 TB SSD
- Power supply: 500 W
The number that matters most is VRAM. A model runs fast only when it fits entirely in the graphics card’s memory, and 8 GB is enough for a 9-billion-parameter model compressed to about 4 bits per weight. Once the model is loaded, the old processor barely matters, because the graphics card does nearly all of the math. The H81 board runs its graphics slot at PCIe 2.0 speed, but that only adds a few seconds when the model first loads.

A few BIOS changes were needed before anything else worked. I set Secure Boot’s OS Type to Other OS, because the Linux installer on my USB stick refused to boot otherwise. I turned off Fast Boot, set the computer to power back on by itself after an outage, and, after installing the RX 580, switched the primary display from the motherboard’s video to the PCIe graphics card.
The Software
- Fedora Server 44, installed without a desktop so the full 8 GB of VRAM goes to the model
- Mesa RADV, the open-source Vulkan driver for AMD cards
- Ollama, which downloads and runs AI models, using its Vulkan backend
- Qwen 3.5 9B, an open model from Alibaba’s Qwen team that understands both text and images (about a 6 GB download)
- Open WebUI, a ChatGPT-style chat interface, running in a Podman container that starts on boot
- A small Python script on a systemd timer that does the nightly SEO work
The biggest catch with this card is that AMD’s ROCm toolkit, which most AI software uses on AMD hardware, no longer supports the RX 580’s Polaris chip. Vulkan, a graphics standard that nearly every GPU supports, works instead. Fedora Server’s minimal install did not include Vulkan at all, so I added the vulkan-loader and mesa-vulkan-drivers packages. After that, Ollama found the card right away. These are the Ollama settings I ended up with:
OLLAMA_VULKAN=1 # use the Vulkan backend
OLLAMA_FLASH_ATTENTION=1 # faster, leaner attention math
OLLAMA_KV_CACHE_TYPE=q8_0 # store conversation memory at half size
OLLAMA_CONTEXT_LENGTH=8192 # room for about 6,000 words per request
With those settings, the model loads at 5.6 GB, runs 100% on the graphics card, and writes roughly 9 words per second, a little faster than most people read. The full speed numbers are in the comparison tables at the end of this post.
For security, Ollama has no password, so it only listens on the machine itself. The chat interface is reachable only on my home network or through my home VPN. Nothing on the server is open to the internet.
What I Learned
Turn off thinking for simple jobs
Qwen 3.5 has a thinking mode where it drafts and checks its work before answering. On my first test, it spent about 1,500 tokens thinking before writing a two-sentence answer, which took around two minutes. With thinking off, the same answer took under 8 seconds and was just as good. Thinking is worth it for multi-step chemistry or physics problems, but not for short writing tasks.
Hidden settings can quietly slow everything down

My first chats took over 100 seconds each, and the stats showed about 4,100 tokens going into the model for a page that should have been about 1,400. When I sent the same page straight to Ollama, it took 23 seconds. The difference was Open WebUI’s Builtin Tools setting, which quietly adds instructions for web search, memory, and other tools to every message. Turning it off for my SEO model dropped each request to 1,430 tokens and 26 seconds.
Small models can’t count
I asked for meta descriptions between 140 and 155 characters. The model kept handing me 189 and 197. Small models think in word pieces, not letters, so exact lengths are hard for them. The fix was to let code do the counting. My script measures every description and, if it is too long, tells the model exactly how many words to cut. That works far better than repeating the rule.
Small models copy examples and make things up
When I put a sample description from my AP Chemistry 4.1 page in the instructions, the model started returning that sample almost word for word. Switching to an example from a different subject fixed it. It also invented a topic number, labeling a classroom strategies page as “AP Chemistry 4.1” even though no such number appears on the page. Now the script checks that any topic number in a description actually appears on the page.
Check the disk after installing Fedora Server
Fedora Server’s automatic setup gave the system only 15 GB of my 1 TB drive and left the rest unused. AI models are several gigabytes each, so I expanded the system volume to use the whole drive right after installing.
How I’m Using It on ZornScience

This site has nearly 600 pages, and many of them were missing a meta description, the short summary that appears under a page’s title in search results. Writing those by hand would take days. Now the server does it overnight.
Every night from midnight to 4 a.m., the script finds published English pages without a description and sends each page’s text to Qwen. It checks every result for length, banned words, em dashes, “coming soon” items, and invented topic numbers, then asks for a specific fix when something fails. Descriptions that pass every check are published. Anything that still fails is saved to a spreadsheet for me to review. The script never overwrites a description that already exists, and it uses its own WordPress account with limited permissions. Here is one it wrote:
AP Chemistry 4.1: learn how to tell physical from chemical changes using evidence like gas formation or color shifts. Free notes, slides, and worked examples.
Next, I plan to have it write image alt text (it can see images), Spanish descriptions for the pages under /es/, and summaries of my lesson screencasts. Claude still powers the tutor chatbot on this site and anything that needs careful judgment.
What It Costs
The two tables below compare one job: writing a meta description and an SEO title for every page and post on this site, about 600 in all, English and Spanish. To get a realistic page size, I ran 30 of my lesson pages from AP Chemistry, Chemistry, Physics, and Quantitative Skills through the same text cleanup my script uses. The average page came to about 1,800 tokens of text, ranging from about 1,200 to 2,400, and the instructions add about 360 more, so each request reads about 2,200 tokens. Electricity is figured at $0.19 per kilowatt-hour, a typical delivered rate for my area, with the server drawing about 50 W while idle and 190 W while working. Claude figures use the API prices for Claude Sonnet 5.5 at medium effort. These are estimates, not meter readings or bills.
Speed
| Qwen 3.5 9B on my RX 580 | Claude Sonnet 5.5 (medium effort) | |
|---|---|---|
| Reading a page | about 63 tokens per second, so about 35 seconds for a 2,200-token request | nearly instant |
| Writing | about 12 tokens per second | several times faster |
| Thinking before answering | off | on, about 500 tokens per page |
| Time per page | about 40 seconds (25 to 55 in real runs) | about 10 seconds |
| Whole site | about 7 hours, or 2 nights in my midnight to 4 a.m. window | about 1.5 to 2 hours one page at a time, or usually under an hour with the Batch API |
Cost
| Qwen 3.5 9B on my RX 580 | Claude Sonnet 5.5 (medium effort) | |
|---|---|---|
| Input, per million tokens | about $0.16 in electricity | $2 ($1 with the Batch API) |
| Output, per million tokens | about $0.84 in electricity | $10 ($5 with the Batch API) |
| Tokens per page | about 2,200 in and 60 out | about 2,400 in and 600 out, mostly thinking |
| Cost per page | about $0.0004 (1/25 of a cent) | about $0.011 (about $0.0055 with the Batch API) |
| Fixed cost | about $7 per month to keep the server on 24/7 | none |
| Total for SEO tags on the whole site | about $0.25 | about $6.60 (about $3.30 with the Batch API) |
| Total including one month of keeping the server on | about $7.25 | about $6.60 (about $3.30 with the Batch API) |
Here is the surprise: for SEO alone, Claude is cheaper. Its total for the whole site, even without the Batch API discount, is less than one month of keeping this PC switched on. Time is the other big difference. Claude would finish the whole site in an afternoon, while my RX 580 needs two nights. Since those runs happen while I sleep, the slower speed costs me nothing in practice, and my own time reviewing flagged results is the same either way.
The local server still makes sense for me because SEO is not its only job. It gives me a private, always-on chat assistant, unlimited experiments without watching an API bill, a place to process anything I would rather not send to the cloud, and a second life for hardware that was sitting unused. If I only needed SEO tags, I would use Sonnet with the Batch API, or set the server to sleep during the day and wake up for its nightly run.
Not bad for a graphics card from 2017. I’ll share an update here in Lab Notes once it has worked through the backlog and started on alt text.