# vøiddo > Small tools, scrapers and trading bots, built in the open, failures included. A small independent studio, fully remote. We build scrapers (run on Apify), small command line tools published on npm, and trading bots fitted to a task. We write down what works and what does not. Nothing here is investment advice. ## Pages - [Scrapers](https://voiddo.com/scrapers/): what we build, the rules the scrapers follow, code pieces - [Trading bots](https://voiddo.com/bots/): the kinds of bot we build, how we build them, illustrative code pieces - [Command line tools](https://voiddo.com/packages/): 23 npm packages with GitHub sources - [Scraper diary](https://voiddo.com/scrapers/diary/): notes from the machine that builds and repairs our scrapers: what broke, why, what changed, with a small piece of code - [Lab](https://voiddo.com/lab/): seven small browser toys: robots.txt readers side by side, a price parser, a coin-flip machine, fee and sizing arithmetic - [Blog](https://voiddo.com/blog): posts about scrapers, trading bots and small tools - [Studio](https://voiddo.com/studio/): what we work on, stack, press facts - [About](https://voiddo.com/about/) and [Contact](https://voiddo.com/contact/) ## Posts - [Remote job APIs: five free feeds, and the catch in each](https://voiddo.com/blog/remote-jobs-api-free-feeds) (2026-11-03): Remote OK, We Work Remotely, Jobicy, Working Nomads and Arbeitnow publish their jobs without a key. What each feed holds, how far back it goes, the terms, and sixty lines of Python that put them in one list. - [Facebook Ad Library API: which ads you get, which you don't](https://voiddo.com/blog/facebook-ad-library-api-which-ads) (2026-11-02): Meta's API returns political ads from everywhere and every kind of ad shown in the UK or the EU. An ad shown only in the US for running shoes is not in it. What each way into the Ad Library gives you, and how to keep the ads the API leaves out. - [Website screenshot in Python: what still goes wrong, measured](https://voiddo.com/blog/website-screenshot-python-playwright) (2026-11-01): A screenshot with Playwright is two lines. Some old warnings about full-page shots no longer hold in today's Chromium; others do, and they cost you the images and charts on the page. We tested each one. - [Maze generator in Python: three algorithms, measured](https://voiddo.com/blog/maze-generator-python) (2026-10-31): Depth-first backtracking, Prim and Wilson all make mazes with exactly one way through. They do not make the same puzzle. We built 900 mazes and measured what a solver meets: dead ends, the length of the route, the forks on it. - [HTML to PDF in Python with Playwright: the defaults that bite](https://voiddo.com/blog/html-to-pdf-python-playwright) (2026-10-30): A headless browser is a common way to turn HTML into a PDF. Its defaults catch people out: US Letter, no backgrounds, no margins, an invisible footer. Each one measured, and a function that sets them right. - [KDP cover size and spine width: the formula, in Python](https://voiddo.com/blog/kdp-cover-size-spine-width) (2026-10-29): A KDP paperback cover is one PDF: back, spine and front, with bleed. The formula from KDP's own pages, the two places where those pages disagree, how much room spine text really gets, and a guide PDF in plain Python. - [Free exchange rate API with no key: ECB rates in Python](https://voiddo.com/blog/ecb-exchange-rates-api-python) (2026-10-28): The European Central Bank publishes its daily euro rates as plain files: no key, no sign-up. What is in them, the three things that trip people up (weekends, holidays, retired currencies) and about forty lines of Python that handle all three. - [Sudoku generator in Python with a unique-solution check](https://voiddo.com/blog/sudoku-generator-python-unique-solution) (2026-10-27): A sudoku with two answers is a misprint. About fifty lines of Python that fill a grid, empty it square by square and keep only puzzles with exactly one solution, and what 200 of them showed about "unique" against "easy". - [Website to LLM text: a site into clean pages with Python](https://voiddo.com/blog/website-to-llm-text-python) (2026-10-26): For search over your docs or a chat with a site, a model needs the words of each page, not its menus. About seventy lines of standard-library Python do it for a small site. We ran them on this one: 46 pages, 33,009 words, 132 chunks. - [Greenhouse, Lever, Ashby and Workday job board APIs](https://voiddo.com/blog/job-board-apis-greenhouse-lever-ashby-workday) (2026-10-25): Four hiring systems publish their open jobs as JSON you can read without a key. What each answer holds, the catch in each one, and about forty lines of Python that put all four into one shape. - [Spring cleaning in October: what we retired and why](https://voiddo.com/blog/spring-cleaning-what-we-retired) (2026-10-20): We asked three questions of everything we had published: does it work, do we use it, is it true. Here is what did not survive, and what the cull taught us. - [The best of a hundred coin flips looks like talent](https://voiddo.com/blog/best-of-a-hundred-coin-flips) (2026-10-20): Try enough strategies and one of them will look brilliant, even when every one is a coin toss. The number of tries is part of the result, and it is the part nobody prints. - [robots.txt readers disagree, and the built-in one is the odd one out](https://voiddo.com/blog/robots-txt-readers-disagree) (2026-10-20): Python's built-in reader takes the first matching rule and ignores wildcards. The standard takes the longest match. We ran both on 12,000 random files and listed where they split. - [Cron does not mean what you think it means](https://voiddo.com/blog/cron-does-not-mean-what-you-think) (2026-10-20): Seven ways a crontab line does something other than what it reads like: step values that restart, two day fields that mean "or", a percent sign that eats your command. - [The price is a string: reading money off a web page](https://voiddo.com/blog/the-price-is-a-string) (2026-10-20): Shops print the same number a dozen ways. A careful parser reads what is clear, leaves the rest empty and never fills a gap with a plausible guess. - [Slippage is a fee nobody prints](https://voiddo.com/blog/slippage-is-a-fee-nobody-prints) (2026-10-20): The exchange prints its fee. It does not print the spread, the thin book or the stop that fills worse than its trigger. A test that leaves them out is flattering itself. - [The key is already public: what to do after you commit a secret](https://voiddo.com/blog/the-key-is-already-public) (2026-10-20): Deleting the commit is not the fix. Revoke the key first, check who used it, then clean up and put a scanner in front of the next push. - [A timestamp without a zone is a guess](https://voiddo.com/blog/a-timestamp-without-a-zone-is-a-guess) (2026-10-20): Scraped dates arrive as "2026-03-08 02:30" with nothing else. Some of those times never happened, some happened twice, and the gap between two cities moves during the year. - [Retry-After is a sentence, not a suggestion](https://voiddo.com/blog/retry-after-is-a-sentence) (2026-10-20): When a site says "slow down", it often says how long to wait. Reading that line, backing off with jitter and knowing when to give up is most of polite scraping. - [Start from the task, not the strategy](https://voiddo.com/blog/start-from-the-task) (2026-10-20): A trading bot project begins with what the bot is for, what it may lose and what it must never do. The signal comes last, and it is the smallest part of the work. - [What Apify taught us about publishing scrapers](https://voiddo.com/blog/what-apify-taught-us) (2026-10-20): Seven things we learned about publishing on the Apify Store: the automated tester, identity checks, rate-limited visibility changes, pay per result and the first "users". - [A stop that lives in your bot is not a stop](https://voiddo.com/blog/a-stop-in-your-bot-is-not-a-stop) (2026-10-20): When the process crashes, the server reboots or the connection drops, a stop that exists only in the bot's memory does not exist. The stop belongs on the exchange, at entry. - [How a scraper job goes, from reading the site to the daily check](https://voiddo.com/blog/how-a-scraper-job-goes) (2026-10-20): Read the site, build, test on real pages, ship one clean schema, check it every day, rebuild when the site changes. Most of the work is the last two. - ["Did my order fill?": designing for the unknown](https://voiddo.com/blog/did-my-order-fill) (2026-10-20): A timeout is not a failure. It is a third state between success and failure, and the safe answer to "still unknown" is to stop opening new positions. - [robots.txt first, and what happens when a site says stop](https://voiddo.com/blog/robots-txt-first) (2026-10-20): Every URL is checked against the site's robots.txt before it is fetched, with two exceptions we name. When a site puts up a wall, the run stops and says so in plain words. - [The fee line eats the grid](https://voiddo.com/blog/the-fee-line-eats-the-grid) (2026-10-20): Grid and DCA bots advertise small, steady profits. Each step's gross edge is often smaller than the round trip fees plus the spread, and a backtest without fees can get the sign of the result wrong. - [What a scraper can and cannot do](https://voiddo.com/blog/what-a-scraper-can-and-cannot-do) (2026-10-20): A plain list for anyone thinking of buying one: what is realistic, what is not, and what we will say no to. - [Testing a trading bot against a fake exchange](https://voiddo.com/blog/testing-a-bot-against-a-fake-exchange) (2026-10-20): The dangerous code paths in a trading bot are the rare ones: timeouts, partial fills, rejects, duplicate ids. A fake exchange that fails on command lets you hit each of them on purpose, every time the tests run. - [Proxies: use the cheapest tier that answers](https://voiddo.com/blog/proxy-ladder) (2026-10-20): Direct first, then datacenter, then residential. Residential traffic is billed by the gigabyte, so the ladder is a cost control as much as a technique. - [Why every strategy has to beat a coin toss](https://voiddo.com/blog/every-strategy-has-to-beat-a-coin-toss) (2026-10-20): Run the same sizing, stops and fees with seeded random entries across many seeds and you get a distribution of luck. A strategy is interesting only if it clearly sits outside it. - [What we will not scrape, and why](https://voiddo.com/blog/what-we-will-not-scrape) (2026-10-20): A list of sites we decided not to build for. The reasons are general, which is the point: most of them are not about technique. - [Walk-forward testing against in-sample optimisation](https://voiddo.com/blog/walk-forward-vs-in-sample) (2026-10-20): Optimising on all of the history finds the best past, not a good future. Fit on one window, judge on the next untouched one, roll forward, and count how many variants you tried. - [Kill switches people actually re-arm](https://voiddo.com/blog/kill-switches-people-actually-rearm) (2026-10-20): Soft pauses and hard halts: which conditions may clear themselves, which need a person, and why a re-arm should leave a written reason behind. ## Scraper diary - [Too many questions at once and 2 more](https://voiddo.com/scrapers/diary/2026-10-27) (2026-10-27): A watcher that gets rate limited is blind exactly when you need it. 2 more problems inside, with the cause and the fix of each. - [Out of builds? Wait, do not give up · The tests that cried wolf · Thinking too long](https://voiddo.com/scrapers/diary/2026-10-25) (2026-10-25): "Not now" and "never" are different errors. Give them different handling. 2 more problems inside, with the cause and the fix of each. - [The retry that always came back an hour late · "database is locked" · Repairing a wall every morning](https://voiddo.com/scrapers/diary/2026-10-23) (2026-10-23): "Retry later" is a scheduling decision. If later is per job, order is decided by accident. 2 more problems inside, with the cause and the fix of each. - [Exit 134, a page on a diet, and a phone number in the Python docs](https://voiddo.com/scrapers/diary/2026-10-21) (2026-10-21): Three things that broke in the machine room: a crash after the work was done, a marketplace that answered with a wall, and a privacy check that found a phone number in the Python docs. ## Data exports - [Bulk File Downloader and Image Downloader: Web Pages, PDFs](https://voiddo.com/export/bulk-file-downloader/): Download files in bulk from direct links, or every image, video, audio file, PDF, and more. - [TikTok Shop Product Scraper: Products, Units Sold](https://voiddo.com/export/tiktok-shop-product-scraper/): Scrape TikTok Shop product pages in the United States from product links or IDs: title, price, original price, discount, units sold, rating, and more. - [Computrabajo Scraper: LATAM Jobs and Salaries](https://voiddo.com/export/computrabajo-scraper/): Scrape job postings from Computrabajo in 18 Latin American countries: title, company with rating, city, region, salary with currency and period, and more. - [Domain Availability Checker: Bulk RDAP](https://voiddo.com/export/domain-availability-checker/): Check if domains are available, in bulk: one row per domain with available or registered, registrar, and more. - [Amazon Product Scraper: ASIN, Price, Sales Rank](https://voiddo.com/export/amazon-product-scraper/): Scrape Amazon.com product pages from ASINs or links: title, brand, price, list price, rating, ratings count, stock status, features, and more. - [Instahyre Jobs Scraper: India Jobs, Skills](https://voiddo.com/export/instahyre-jobs-scraper/): Scrape India jobs from Instahyre: title, company, locations, skills, experience in years, posting date, employment type, the description, and more. - [Pracuj.pl Scraper: Poland Jobs and Salaries](https://voiddo.com/export/pracuj-pl-scraper/): Scrape Polish job postings from pracuj.pl: title, company, workplaces and address, salary per contract type, gross or net, position level, and more. - [Google Maps Scraper: Places, Phones, Hours](https://voiddo.com/export/google-maps-scraper/): Scrape Google Maps business listings by search and place: name, category, address, coordinates, rating, review count, phone, website, and more. ## Books - [Large Print Christmas Word Search for Adults](https://voiddo.com/books/lp-christmas-word-search-1/): 60 Holiday Puzzles on 60 Themes, One Big Puzzle per Page, With Solutions, by E. M. Linden - [Extra Large Print Sudoku for Seniors](https://voiddo.com/books/xl-sudoku-seniors-1/): 120 Easy to Hard Puzzles, One Big Puzzle per Page, With Solutions, by E. M. Linden ## Elsewhere - [Scrapers](https://voiddo.com/scrapers/): our Apify Store listings, pay per result - [Data API](https://data.voiddo.com/): HTTP and MCP API for file, data and lookup functions (llms.txt at https://data.voiddo.com/llms.txt) - [Browser utilities](https://utils.voiddo.com/) - [GitHub](https://github.com/voidd0) and [npm](https://www.npmjs.com/~v0idd0) ## Contact support@voiddo.com