<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Spicanet</title>
    <description>The latest articles on DEV Community by Spicanet (@spicanet).</description>
    <link>https://dev.to/spicanet</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4196347%2F1b7034ff-2cc6-4009-82ad-ae87ad118d0c.jpg</url>
      <title>DEV Community: Spicanet</title>
      <link>https://dev.to/spicanet</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/spicanet"/>
    <language>en</language>
    <item>
      <title>Dry-run first, rollback always: the brakes on SpicaSEO's autopilot</title>
      <dc:creator>Spicanet</dc:creator>
      <pubDate>Thu, 12 Nov 2026 14:29:57 +0000</pubDate>
      <link>https://dev.to/spicanet/dry-run-first-rollback-always-the-brakes-on-spicaseos-autopilot-12l6</link>
      <guid>https://dev.to/spicanet/dry-run-first-rollback-always-the-brakes-on-spicaseos-autopilot-12l6</guid>
      <description>&lt;p&gt;Most SEO work is a queue of small, boring fixes. The damage happens when software works through that queue at 3 a.m. and you find out from the traffic graph. &lt;a href="https://spicaseo.com" rel="noopener noreferrer"&gt;SpicaSEO&lt;/a&gt; is an SEO operations tool still in development, and the part I care about most is not the autopilot. It is the brakes: every proposed change starts as a dry-run diff, every change can be rolled back, and high-impact edits wait for a human.&lt;/p&gt;

&lt;p&gt;The idea is straightforward. You connect Search Console or your CMS — it is built to work with SpicaCMS, WordPress and connector-compatible sites — and it builds a baseline of rankings, traffic and crawl health. From there it looks for the usual work: pages sitting just outside better rankings, broken links, wrong or missing canonicals, structured data that needs repair, content that may need a refresh grounded in what currently ranks.&lt;/p&gt;

&lt;p&gt;Autonomous is a loaded word, so the loop is designed around inspection. Spot an issue, draft the change as a diff you can actually read, apply only the low-risk technical fixes automatically, and hold the rest. Fixing a broken link is one kind of action. Rewriting a page that brings in most of your traffic is another. That second kind belongs in an approval inbox, with a preview of what will change, why, and what the risk is. Outreach emails, if they are ever in that inbox, should be read in full before anyone sends them.&lt;/p&gt;

&lt;p&gt;Rollback is not a nice-to-have. A tool you cannot undo is a tool you will not trust. Search also has a long memory. A bad canonical or a botched refresh can take weeks to show up in results and longer to undo there, even when the rollback on your own site is instant. The gates are cheap. The mistakes they prevent are not.&lt;/p&gt;

&lt;p&gt;The easy lie in SEO is: I changed something and traffic went up, so the change worked. Traffic goes up for all sorts of reasons. Lift is meant to be measured per action with difference-in-differences: changed pages compared with similar unchanged ones over the same period. It is not magic. It is more honest than a before-and-after screenshot.&lt;/p&gt;

&lt;p&gt;SpicaSEO can also run SpicaCMS sites on any VPS, which is useful if you want the CMS and the SEO loop on your own server. What is not ready is a finished product pitch. The public site has sign-in and a way to enable the autopilot, but I am not going to tell you it is done. Pricing is not published yet — there are planned tiers, from free up to agency, and the amounts will appear when they are real. The boundary between auto-applied and approval-required will keep moving as I learn where it belongs.&lt;/p&gt;

&lt;p&gt;If I were rolling this out on a real site, I would build a baseline first, read the first batch of diffs without applying any of them, allow only low-risk technical fixes to run on their own, and keep content refreshes behind approval until the lift numbers earn some trust. Widen the autopilot only where the measurements say it is helping.&lt;/p&gt;

&lt;p&gt;SpicaSEO: &lt;a href="https://spicaseo.com" rel="noopener noreferrer"&gt;https://spicaseo.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Read the full article on spicanet.dev: &lt;a href="https://spicanet.dev/blog/spicaseo-an-seo-autopilot-that-asks-first" rel="noopener noreferrer"&gt;https://spicanet.dev/blog/spicaseo-an-seo-autopilot-that-asks-first&lt;/a&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>automation</category>
      <category>wordpress</category>
      <category>webdev</category>
    </item>
    <item>
      <title>If the date isn't confirmed, Trip2Fest leaves the field blank</title>
      <dc:creator>Spicanet</dc:creator>
      <pubDate>Thu, 12 Nov 2026 13:16:30 +0000</pubDate>
      <link>https://dev.to/spicanet/if-the-date-isnt-confirmed-trip2fest-leaves-the-field-blank-3knl</link>
      <guid>https://dev.to/spicanet/if-the-date-isnt-confirmed-trip2fest-leaves-the-field-blank-3knl</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frjr77i4e8aprt9qkcf43.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frjr77i4e8aprt9qkcf43.png" alt="Trip2Fest whole-trip cost breakdown" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A festival page with a confident date is easy to trust and expensive to get wrong. Sometimes the date is a leftover, a rumour, or a number an assistant filled in because a blank cell looked unfinished. &lt;a href="https://trip2fest.com" rel="noopener noreferrer"&gt;Trip2Fest&lt;/a&gt; is a live site for finding festivals worth travelling for, and it treats an unconfirmed date as missing information, not as a gap to decorate.&lt;/p&gt;

&lt;p&gt;The ticket price is what most festival sites lead with. Fine, as far as it goes. If the festival is in another country, the ticket is often the cheap part. Flights, a place to sleep, the transfer from the city to the site, food for the whole event: that is the trip. Trip2Fest tries to show that wider context, but only for figures that have been through editorial review. If a cost is unknown, it is left out rather than estimated. An empty field is information too. It tells you to check before you book.&lt;/p&gt;

&lt;p&gt;The AI planner sits behind the same boundary, not in front of it. It can help shape a trip around a festival, but it builds on reviewed data rather than generating facts of its own. It is not allowed to invent dates or prices. When it does not know, it is supposed to say so. An assistant that guesses a festival date is not a planner. It is a very confident way to miss a festival.&lt;/p&gt;

&lt;p&gt;You can browse festivals by location, month and genre, from electronic and psytrance to rock and hip hop. Travel guides pair festivals with city stays, because most people do not fly in, watch one set and fly out. You can save the festivals and plans you are considering, and sign in with Google or email to keep them. Tickets and travel can be booked through partner links, and those links are disclosed. Using the site is free.&lt;/p&gt;

&lt;p&gt;A reasonable way to use it looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Filter festivals by month and genre.&lt;/li&gt;
&lt;li&gt;Shortlist a few by location.&lt;/li&gt;
&lt;li&gt;Compare full-trip cost context instead of ticket prices alone.&lt;/li&gt;
&lt;li&gt;Open the travel guide that pairs the festival with a city stay.&lt;/li&gt;
&lt;li&gt;Ask the planner to sketch the trip around the dates you already have.&lt;/li&gt;
&lt;li&gt;Save the plan, then confirm the dates on the official festival site before you book.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The catalogue covers festivals across a lot of countries. It is real and browsable, and it is also nowhere near every festival out there. If a favourite is missing, that is not a judgement on it; it has not been through review yet. Because unknown figures are left out, some festival pages will look thinner than a competitor's. That is the trade-off of not guessing, and it is intentional.&lt;/p&gt;

&lt;p&gt;Before you book any festival trip, price the whole thing and not just the ticket, check how you get from the city to the site, and treat any missing number as unknown. Then go and confirm the dates where they are actually decided: on the official site.&lt;/p&gt;

&lt;p&gt;Trip2Fest: &lt;a href="https://trip2fest.com" rel="noopener noreferrer"&gt;https://trip2fest.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Read the full article on spicanet.dev: &lt;a href="https://spicanet.dev/blog/trip2fest-festival-trips-without-made-up-numbers" rel="noopener noreferrer"&gt;https://spicanet.dev/blog/trip2fest-festival-trips-without-made-up-numbers&lt;/a&gt;&lt;/p&gt;

</description>
      <category>travel</category>
      <category>ai</category>
      <category>webdev</category>
      <category>music</category>
    </item>
    <item>
      <title>One snapshot, every page: how Brokeli keeps broker numbers from contradicting themselves</title>
      <dc:creator>Spicanet</dc:creator>
      <pubDate>Tue, 10 Nov 2026 05:45:16 +0000</pubDate>
      <link>https://dev.to/spicanet/one-snapshot-every-page-how-brokeli-keeps-broker-numbers-from-contradicting-themselves-1ppp</link>
      <guid>https://dev.to/spicanet/one-snapshot-every-page-how-brokeli-keeps-broker-numbers-from-contradicting-themselves-1ppp</guid>
      <description>&lt;p&gt;Here's a bug you've probably seen on finance sites without noticing it as a bug. The review says a broker's fee is one thing. The comparison table, a few clicks away, says another. The toplist has yet another number from some earlier year. Nobody lied; the pages just drifted apart. &lt;a href="https://brokeli.com" rel="noopener noreferrer"&gt;Brokeli&lt;/a&gt; is my forex and CFD broker research site, it's live, and the most important design decision in it is boring: every page reads the same published research snapshot, so the numbers agree everywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I was trying to fix
&lt;/h2&gt;

&lt;p&gt;Choosing a forex or CFD broker is a high-stakes decision made with low-quality information. The first question isn't even which broker is best. It's which brokers are available to you at all, because that depends on your country, and a lot of comparison content quietly ignores it.&lt;/p&gt;

&lt;p&gt;The other problem is evidence. Regulator status, licences and pricing are facts with dates attached. A licence that was valid when someone wrote a review isn't necessarily valid today, and a page that doesn't tell you when a fact was captured is asking for blind trust.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The research snapshot&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;How a fact travels from a source to the page you're reading.&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Evidence is collected from sources such as regulator data, licences and published pricing.&lt;/li&gt;
&lt;li&gt;Each fact is captured with the date it was checked.&lt;/li&gt;
&lt;li&gt;Facts are assembled into a published research snapshot.&lt;/li&gt;
&lt;li&gt;Reviews, comparisons, toplists and the fee calculator all read that same snapshot.&lt;/li&gt;
&lt;li&gt;When the snapshot updates, every page updates with it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;illustrative.txt&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Illustration only: the idea, not the real code&lt;/span&gt;
&lt;span class="n"&gt;snapshot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;latest_published_snapshot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;review_page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fee&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;broker&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;compare_table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fee&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;broker&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fee&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;broker&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# one source of truth -&amp;gt; no competing versions of the same number&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Country first
&lt;/h2&gt;

&lt;p&gt;Brokeli starts by filtering brokers by country availability. It sounds like a small UX detail. In practice it removes the most common way people waste an evening: reading glowing reviews of a broker that won't take them as a client.&lt;/p&gt;

&lt;p&gt;Once you have a list that actually applies to you, you can compare a small set of brokers side by side. It's capped on purpose, because a comparison with endless columns isn't a comparison; it's a spreadsheet you'll close.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What lives on Brokeli&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Piece&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Country filter&lt;/td&gt;
&lt;td&gt;Shows brokers available where you are&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Side-by-side compare&lt;/td&gt;
&lt;td&gt;A small set of brokers on the same facts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reviews&lt;/td&gt;
&lt;td&gt;One broker in depth with dated evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Toplists&lt;/td&gt;
&lt;td&gt;Ranked lists built from the same snapshot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forex fee calculator&lt;/td&gt;
&lt;td&gt;Estimates trading costs from published pricing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Learning section&lt;/td&gt;
&lt;td&gt;Forex basics and risk management and MetaTrader&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Not financial advice.&lt;/strong&gt; Brokeli is research, not advice. It can tell you what a broker publishes and what regulators say. It can't tell you whether trading CFDs is a good idea for you, and I'm not going to pretend it can.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  About the affiliate links
&lt;/h2&gt;

&lt;p&gt;Brokeli is free to use and affiliate-funded. Affiliate links never change scores. I know every site says that, so here's how I think about keeping it true: scores come from the research evidence, and a commercial deal isn't evidence of anything except a commercial deal.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I won't claim
&lt;/h2&gt;

&lt;p&gt;Brokeli is live, and it works. What I won't tell you is that it covers every broker in every country, because I'm not going to claim coverage I haven't counted for this post. Coverage is whatever is in the snapshot, nothing more.&lt;/p&gt;

&lt;p&gt;Dated evidence also cuts both ways. A captured date tells you how fresh a fact is, which means it will sometimes tell you a fact is getting old. I'd rather show you that than hide it.&lt;/p&gt;

&lt;p&gt;And the learning section is a starting point. If you've never traded, read it, then read more, then think about risk for longer than feels necessary.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If the review and the table disagree, at least one of them is lying to you. Usually by accident.&lt;/p&gt;

&lt;p&gt;— why everything reads one snapshot&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;What a broker page should always show you&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether the broker accepts clients from your country&lt;/li&gt;
&lt;li&gt;Which regulators and licences apply&lt;/li&gt;
&lt;li&gt;When each fact was last checked&lt;/li&gt;
&lt;li&gt;Fees you can plug into a calculator&lt;/li&gt;
&lt;li&gt;A clear line between research and advertising&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How I'd use it if I were choosing a broker&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set your country and see who's actually available.&lt;/li&gt;
&lt;li&gt;Shortlist a few brokers and compare them side by side.&lt;/li&gt;
&lt;li&gt;Open each review and check the dates on the evidence.&lt;/li&gt;
&lt;li&gt;Run your expected trading through the fee calculator.&lt;/li&gt;
&lt;li&gt;Read the risk management pages before depositing anything.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Where to find it
&lt;/h2&gt;

&lt;p&gt;Brokeli lives at &lt;a href="https://brokeli.com" rel="noopener noreferrer"&gt;brokeli.com&lt;/a&gt;. If you spot a number that looks wrong, I'd genuinely like to know. The rest of my projects are on &lt;a href="https://spicanet.net/products" rel="noopener noreferrer"&gt;spicanet.net/products&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Brokeli: &lt;a href="https://brokeli.com" rel="noopener noreferrer"&gt;brokeli.com&lt;/a&gt;. Originally published on &lt;a href="https://spicanet.dev/blog/brokeli-one-research-snapshot-every-page" rel="noopener noreferrer"&gt;spicanet.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>fintech</category>
      <category>forex</category>
      <category>webdev</category>
      <category>architecture</category>
    </item>
    <item>
      <title>A website for the café down the street, prepared before they ask</title>
      <dc:creator>Spicanet</dc:creator>
      <pubDate>Mon, 09 Nov 2026 09:14:33 +0000</pubDate>
      <link>https://dev.to/spicanet/a-website-for-the-cafe-down-the-street-prepared-before-they-ask-49l</link>
      <guid>https://dev.to/spicanet/a-website-for-the-cafe-down-the-street-prepared-before-they-ask-49l</guid>
      <description>&lt;p&gt;Walk down any street with small shops and cafés and count how many of them have a website that's current. The answer is usually: the ones with a nephew who does computers. Everyone else has a social page, a menu photo from a few seasons ago and a phone number that may or may not be answered. &lt;a href="https://spicasite.com" rel="noopener noreferrer"&gt;SpicaSite&lt;/a&gt; is my attempt to fix that for small local businesses. It prepares a first version of your website from what's already public about your business, a person checks it, and you see a free preview before deciding anything. It's in beta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why small businesses don't have good sites
&lt;/h2&gt;

&lt;p&gt;It isn't that small business owners don't want a website. It's that every path to one asks for something they don't have: time to learn a site builder, money for an agency, or patience for a back-and-forth about fonts.&lt;/p&gt;

&lt;p&gt;And the person running a restaurant is busy running a restaurant. Asking them to write an About page from scratch is asking them to do a second job.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How a SpicaSite preview comes together&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;From a name to a preview you can look at.&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You give your business name and city, or your current website.&lt;/li&gt;
&lt;li&gt;A first version of the site is prepared from what's already public about your business.&lt;/li&gt;
&lt;li&gt;A person checks it before you ever see it.&lt;/li&gt;
&lt;li&gt;You get a free preview with no account and no obligation.&lt;/li&gt;
&lt;li&gt;You decide whether to go ahead.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Nobody should have to write an About page before they've seen whether they like the site.&lt;/p&gt;

&lt;p&gt;— why the preview comes first&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Checked by a person, every time
&lt;/h2&gt;

&lt;p&gt;The step I'm most stubborn about is the human check. What's public about a business online is often out of date or just wrong: old opening hours, a menu from before the chef changed, a photo of the shop next door. Software can collect it. A person has to look at it and ask whether it's actually right before a business owner sees it.&lt;/p&gt;

&lt;p&gt;That's what makes it a personally prepared site rather than a template with your name pasted in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you get&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Piece&lt;/th&gt;
&lt;th&gt;How it works&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Free preview&lt;/td&gt;
&lt;td&gt;No account and no obligation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Your own domain&lt;/td&gt;
&lt;td&gt;The site runs on your address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changes by message&lt;/td&gt;
&lt;td&gt;You ask and they're made and checked and published&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QR menu&lt;/td&gt;
&lt;td&gt;Your menu as a fast web page with a QR code&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Menus that don't need reprinting
&lt;/h2&gt;

&lt;p&gt;Restaurants get one extra thing I'm quite fond of. The menu becomes a fast web page with a QR code you print once. When prices or dishes change, the page changes. The sticker on the table stays the same.&lt;/p&gt;

&lt;p&gt;It's a tiny thing that saves a surprising amount of hassle, and it's the kind of detail that only matters if you've watched someone reprint menus because one dish sold out for good.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Changes by message.&lt;/strong&gt; After you go ahead, you don't learn an editor. You send a message saying what you want changed. It gets made, checked and published.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What's honestly still beta
&lt;/h2&gt;

&lt;p&gt;SpicaSite is in beta. The free preview is real and available. Paid plans aren't published yet, so I'm not going to quote prices in this article or anywhere else until they are.&lt;/p&gt;

&lt;p&gt;There's also no public gallery of finished sites yet. The examples page is empty for now, so the sample preview on the restaurant page is the closest thing to a look at the result today.&lt;/p&gt;

&lt;p&gt;The other honest limit is the starting material. A business with almost nothing public about it gives the first version very little to work with. The preview will still be checked by a person, but it will need more input from the owner before it's ready.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Status: beta&lt;/li&gt;
&lt;li&gt;Preview: free with no account&lt;/li&gt;
&lt;li&gt;Paid plans: not published yet&lt;/li&gt;
&lt;li&gt;Public examples: not there yet&lt;/li&gt;
&lt;li&gt;Thin public info: needs owner input&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Is it a fit for your business?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're a small local business&lt;/li&gt;
&lt;li&gt;You don't have a current website or you've outgrown the old one&lt;/li&gt;
&lt;li&gt;You'd rather send a message than learn a site builder&lt;/li&gt;
&lt;li&gt;You want to see a preview before paying anything&lt;/li&gt;
&lt;li&gt;You run a restaurant or café and want a QR menu&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note: How it's built.&lt;/strong&gt; In general terms: public information about a business goes into a structured draft, a person reviews it, and the approved site is served on the owner's domain. Change requests follow the same path: a message, a change, a check, a publish.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  See what yours would look like
&lt;/h2&gt;

&lt;p&gt;If you run a small business, or you know someone who does, a free preview starts at &lt;a href="https://spicasite.com" rel="noopener noreferrer"&gt;spicasite.com&lt;/a&gt;. My other projects are at &lt;a href="https://spicanet.net/products" rel="noopener noreferrer"&gt;spicanet.net/products&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;SpicaSite: &lt;a href="https://spicasite.com" rel="noopener noreferrer"&gt;spicasite.com&lt;/a&gt;. Originally published on &lt;a href="https://spicanet.dev/blog/spicasite-a-website-prepared-for-small-businesses" rel="noopener noreferrer"&gt;spicanet.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>smallbusiness</category>
      <category>nocode</category>
      <category>productdesign</category>
    </item>
    <item>
      <title>Every field has a date: building a Bali guide that admits when it last checked</title>
      <dc:creator>Spicanet</dc:creator>
      <pubDate>Sat, 07 Nov 2026 03:36:21 +0000</pubDate>
      <link>https://dev.to/spicanet/every-field-has-a-date-building-a-bali-guide-that-admits-when-it-last-checked-54jg</link>
      <guid>https://dev.to/spicanet/every-field-has-a-date-building-a-bali-guide-that-admits-when-it-last-checked-54jg</guid>
      <description>&lt;p&gt;Travel guides have a shelf life problem. A restaurant closes, a beach club changes hands, a market moves to another day, and the guide keeps cheerfully recommending all of it. Bali makes this worse because it changes fast. &lt;a href="https://bagusbali.com" rel="noopener noreferrer"&gt;Bagus Bali&lt;/a&gt; is a local guide built on one idea: places, events and deals should be checked by people actually on the island, and every field should say when it was last checked. It's live and available in many languages. The checking itself hasn't caught up yet: right now every listing says it hasn't been verified, and I'll get to why that's the honest state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why most Bali guides go stale
&lt;/h2&gt;

&lt;p&gt;Most guides treat a listing as one thing with one date, if they show a date at all. But a listing isn't one fact. The address rarely changes. The opening hours change sometimes. The happy-hour deal changes all the time. Putting one date on the whole thing hides which part you should double-check.&lt;/p&gt;

&lt;p&gt;So Bagus Bali is built so that every field carries its own check date. Once a listing is verified, you'll be able to see that the location was confirmed long ago but the hours were checked recently, and decide how much to trust each part.&lt;/p&gt;

&lt;p&gt;Right now, though, the listings show 'Not checked yet'. The verification hasn't happened, and the site says so plainly instead of inventing a date. I'd rather ship the empty field than a fake one.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A guide without dates is a guess with nice photos.&lt;/p&gt;

&lt;p&gt;— the reason for per-field dates&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Organised by where you are in the trip
&lt;/h2&gt;

&lt;p&gt;The guide is organised around where you are: coming to Bali, being in Bali and living in Bali. Someone planning a week and someone sorting out a long stay need different things, and pretending they don't makes a guide worse for both.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Eat and drink&lt;/li&gt;
&lt;li&gt;Stays&lt;/li&gt;
&lt;li&gt;Things to do&lt;/li&gt;
&lt;li&gt;Wellness&lt;/li&gt;
&lt;li&gt;Nightlife&lt;/li&gt;
&lt;li&gt;Services&lt;/li&gt;
&lt;li&gt;Long-term living&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's in the guide&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Piece&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Per-field check dates&lt;/td&gt;
&lt;td&gt;Built in but listings are not verified yet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Area guides&lt;/td&gt;
&lt;td&gt;Canggu and Ubud and Uluwatu and Seminyak and Sanur&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sponsored labels&lt;/td&gt;
&lt;td&gt;Keeps paid placements apart&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event re-confirmation&lt;/td&gt;
&lt;td&gt;Meant to confirm details with organisers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Map and trip planner&lt;/td&gt;
&lt;td&gt;Find places and plan days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ask Bagus&lt;/td&gt;
&lt;td&gt;Questions answered from the guide&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Languages&lt;/td&gt;
&lt;td&gt;Many languages for visitors and residents&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why area guides matter in Bali
&lt;/h2&gt;

&lt;p&gt;In Bali, where you stay shapes the whole trip. Canggu, Ubud, Uluwatu, Seminyak and Sanur feel like different places, and traffic makes the distance between them feel longer than any map suggests. Picking the right base first saves more time than any list of restaurants. That's why the area guides sit next to the categories instead of being buried under them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping sponsored things separate
&lt;/h2&gt;

&lt;p&gt;Local guides make money somehow, and the usual way is to let businesses pay to look better. Bagus Bali has sponsored placements, but they're labelled and kept apart from the regular listings. A sponsored spot doesn't quietly become a recommendation.&lt;/p&gt;

&lt;p&gt;Events get the same suspicion. Event details are meant to be re-confirmed with organisers, because an event page is the most likely thing in any guide to be wrong by the time you read it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sponsored is labelled.&lt;/strong&gt; Sponsored placements are always labelled and kept apart from regular listings. If something is paid for, you'll know.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;How a listing is meant to stay honest&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The process as designed. Listings haven't been through it yet.&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Someone on the island checks the place or event.&lt;/li&gt;
&lt;li&gt;Each field is saved with its own check date.&lt;/li&gt;
&lt;li&gt;Events are re-confirmed with organisers.&lt;/li&gt;
&lt;li&gt;Sponsored placements are labelled and kept separate.&lt;/li&gt;
&lt;li&gt;Readers see exactly how fresh each detail is.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The tools around the guide
&lt;/h2&gt;

&lt;p&gt;There's a map, a trip planner and Ask Bagus for questions you'd otherwise send to a friend who lives there. They're useful, but they're built on top of the checked data, which is the actual product. A planner working from stale listings is just a faster way to arrive at a closed restaurant.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's honestly hard
&lt;/h2&gt;

&lt;p&gt;The biggest gap is the obvious one: listings haven't been verified yet. The structure for dated checks is there, but the checks themselves are still ahead, so for now treat every detail as something to confirm yourself.&lt;/p&gt;

&lt;p&gt;Checking things on the ground doesn't scale like copying listings from somewhere else. Some areas and categories will always be fresher than others, and the per-field dates will show you exactly where. That's the point, but it does mean you'll sometimes see an old date and have to check for yourself.&lt;/p&gt;

&lt;p&gt;Many languages also means many places for a translation to lag behind an update. The dates are there to keep that honest too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How to use any travel guide well&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Look for when a detail was last checked&lt;/li&gt;
&lt;li&gt;Double-check hours and events before you go&lt;/li&gt;
&lt;li&gt;Know which listings are sponsored&lt;/li&gt;
&lt;li&gt;Use area guides to pick a base before picking places&lt;/li&gt;
&lt;li&gt;Trust recent local checks over old reviews&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where to find it
&lt;/h2&gt;

&lt;p&gt;Bagus Bali is at &lt;a href="https://bagusbali.com" rel="noopener noreferrer"&gt;bagusbali.com&lt;/a&gt;. The rest of my projects are at &lt;a href="https://spicanet.net/products" rel="noopener noreferrer"&gt;spicanet.net/products&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Bagus Bali: &lt;a href="https://bagusbali.com" rel="noopener noreferrer"&gt;bagusbali.com&lt;/a&gt;. Originally published on &lt;a href="https://spicanet.dev/blog/bagus-bali-every-field-has-a-date" rel="noopener noreferrer"&gt;spicanet.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>travel</category>
      <category>webdev</category>
      <category>i18n</category>
      <category>productdesign</category>
    </item>
    <item>
      <title>Consent first, exits later: building Proxymist in the open</title>
      <dc:creator>Spicanet</dc:creator>
      <pubDate>Fri, 06 Nov 2026 15:32:13 +0000</pubDate>
      <link>https://dev.to/spicanet/consent-first-exits-later-building-proxymist-in-the-open-4dhl</link>
      <guid>https://dev.to/spicanet/consent-first-exits-later-building-proxymist-in-the-open-4dhl</guid>
      <description>&lt;p&gt;There's a version of the proxy business that nobody likes to talk about: exits that come from devices whose owners have no idea they're exits. I didn't want to build that. &lt;a href="https://proxymist.com" rel="noopener noreferrer"&gt;Proxymist&lt;/a&gt; is a consent-based web access network for testing websites from different locations and for web data work. Every exit is consented, every request is authenticated and every action can be traced back to who made it. It's in development. Today you get an account, a dashboard, documentation and a sandbox API. The actual exits are still being built.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why consent is the starting point
&lt;/h2&gt;

&lt;p&gt;If you've ever needed to see how your site behaves from another country, you know the options aren't great. You either trust a network whose sourcing you can't see, or you don't test at all.&lt;/p&gt;

&lt;p&gt;I decided the sourcing question had to be answered before anything else. An exit that hasn't agreed to be an exit isn't an asset; it's a liability that just hasn't been noticed yet. So consent isn't a feature in Proxymist. It's the foundation the rest has to sit on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The rules the network is built around&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rule&lt;/th&gt;
&lt;th&gt;What it means in practice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Every request is authenticated&lt;/td&gt;
&lt;td&gt;No anonymous traffic through the network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Every exit is consented&lt;/td&gt;
&lt;td&gt;The people providing exits agreed to it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Every action is attributable&lt;/td&gt;
&lt;td&gt;Requests can be traced to an account&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Limits in front of the network
&lt;/h2&gt;

&lt;p&gt;Authentication and consent cover who's on each end. The middle needs rules too. In front of the network sit destination policy, rate limits and spend limits. Destination policy decides where traffic is allowed to go. Rate limits stop one account from hammering a target. Spend limits stop a runaway script from turning into a runaway bill.&lt;/p&gt;

&lt;p&gt;None of these are glamorous. All of them are things I'd want in place before any real exit carries any real request.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What a request goes through&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The path as designed. Today it ends in the sandbox.&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your client authenticates with the API.&lt;/li&gt;
&lt;li&gt;Destination policy checks where the request is going.&lt;/li&gt;
&lt;li&gt;Rate and spend limits are applied to your account.&lt;/li&gt;
&lt;li&gt;The request is routed to a consented exit.&lt;/li&gt;
&lt;li&gt;The action is recorded against your account.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Sandbox only today.&lt;/strong&gt; Right now the API is a sandbox. It's there so you can test authentication and integrations. It does not route through live residential or mobile exits yet.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What you can actually use today
&lt;/h2&gt;

&lt;p&gt;The account, the dashboard, the documentation and the sandbox API are available, and the sandbox is free. If you're building something that will eventually need geo testing or web data access, you can wire up authentication and integration now and find out whether the API shape suits you.&lt;/p&gt;

&lt;p&gt;That's deliberately modest. I'd rather you build against a sandbox that's honest about being a sandbox than sign up for a network that's quietly only partly there.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's still being built
&lt;/h2&gt;

&lt;p&gt;Live residential and mobile exits aren't available yet. Neither are shared nodes. Usage-based pricing isn't published, because there's nothing to price until the exits exist. All of that will be announced when it's verified, and not before.&lt;/p&gt;

&lt;p&gt;I'm not putting dates on any of it. Consent-based sourcing is slower to build than the alternative, and that's the trade I chose.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Residential exits: in development&lt;/li&gt;
&lt;li&gt;Mobile exits: in development&lt;/li&gt;
&lt;li&gt;Shared nodes: in development&lt;/li&gt;
&lt;li&gt;Pricing: usage-based and not published yet&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;An exit that never agreed to be an exit isn't coverage. It's a problem with a delay on it.&lt;/p&gt;

&lt;p&gt;— why Proxymist is slow on purpose&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Who it's for
&lt;/h2&gt;

&lt;p&gt;The obvious users are developers and QA people who need to see a site the way someone in another country sees it: localised prices, redirects, consent banners, content that changes by region. The other group is people doing web data work who want a network where the rules are written down and enforced, not implied.&lt;/p&gt;

&lt;p&gt;If what you need is the cheapest possible pile of IPs with no questions asked, Proxymist is the wrong tool, and that's fine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Questions to ask any web access network&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did the people providing exits agree to it&lt;/li&gt;
&lt;li&gt;Is every request tied to an authenticated account&lt;/li&gt;
&lt;li&gt;Are there destination rules and not just bandwidth&lt;/li&gt;
&lt;li&gt;Can you cap spend before a script runs away&lt;/li&gt;
&lt;li&gt;Will it tell you plainly what isn't live yet&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note: How it's built.&lt;/strong&gt; In general terms: an authenticated API with policy and limits enforced before routing, a dashboard for accounts and usage, and documentation written for the sandbox you can use today rather than for features that don't exist yet.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  If you want to kick the tyres
&lt;/h2&gt;

&lt;p&gt;The sandbox and docs are at &lt;a href="https://proxymist.com" rel="noopener noreferrer"&gt;proxymist.com&lt;/a&gt;. My other projects are on &lt;a href="https://spicanet.net/products" rel="noopener noreferrer"&gt;spicanet.net/products&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Proxymist: &lt;a href="https://proxymist.com" rel="noopener noreferrer"&gt;proxymist.com&lt;/a&gt;. Originally published on &lt;a href="https://spicanet.dev/blog/proxymist-consent-first-exits-later" rel="noopener noreferrer"&gt;spicanet.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>privacy</category>
      <category>webdev</category>
      <category>testing</category>
    </item>
    <item>
      <title>Scoring VPNs without pretending the affiliate money isn't there</title>
      <dc:creator>Spicanet</dc:creator>
      <pubDate>Tue, 03 Nov 2026 03:34:22 +0000</pubDate>
      <link>https://dev.to/spicanet/scoring-vpns-without-pretending-the-affiliate-money-isnt-there-4ak0</link>
      <guid>https://dev.to/spicanet/scoring-vpns-without-pretending-the-affiliate-money-isnt-there-4ak0</guid>
      <description>&lt;p&gt;Let's start with the awkward part, because every VPN review site has it and most of them whisper it in the footer: &lt;a href="https://vpnscorelab.com" rel="noopener noreferrer"&gt;VPNScoreLab&lt;/a&gt; is affiliate-funded. If you click through and buy, the site may get paid. I'm saying it in the first paragraph because the whole project is built around one idea: if you can't hide the money, at least show the method. VPNScoreLab is a live, independent VPN testing site that publishes structured scores from a transparent methodology, and this is how I think about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with VPN reviews
&lt;/h2&gt;

&lt;p&gt;Search for the best VPN and you'll get a wall of best-of lists that look suspiciously alike. Same winners, same adjectives, same breathless lines about military-grade encryption. Nobody tells you why one service is ranked above another, which means the ranking is a vibe with a buy button attached.&lt;/p&gt;

&lt;p&gt;I didn't want to build another vibe. I wanted a site where the score is the output of a method you can read, and where disagreeing with a ranking means disagreeing with a specific criterion rather than with somebody's mood.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What gets scored&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;What it covers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Privacy and logging&lt;/td&gt;
&lt;td&gt;What a service keeps about you and what it says it keeps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real-world speed&lt;/td&gt;
&lt;td&gt;How it behaves in actual use instead of on a spec sheet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security features&lt;/td&gt;
&lt;td&gt;The protections a service actually offers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocols&lt;/td&gt;
&lt;td&gt;Which connection protocols are supported&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Streaming unblocking&lt;/td&gt;
&lt;td&gt;Whether it works for streaming services&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Method before ranking
&lt;/h2&gt;

&lt;p&gt;Every review is broken down into those areas, and the scores come from a methodology that's published on the site. The point isn't that my method is perfect. The point is that it's visible, so you can decide which parts you care about.&lt;/p&gt;

&lt;p&gt;Someone who torrents and someone who travels with a laptop in a hotel lobby want different things from a VPN. That's why there are picks by need, not just one leaderboard:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Streaming&lt;/li&gt;
&lt;li&gt;Privacy&lt;/li&gt;
&lt;li&gt;Travel&lt;/li&gt;
&lt;li&gt;Torrenting&lt;/li&gt;
&lt;li&gt;Gaming&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How a reader is meant to use the site&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Start with the need, not the brand: streaming, privacy, travel, torrenting or gaming.&lt;/li&gt;
&lt;li&gt;Look at the shortlist for that need.&lt;/li&gt;
&lt;li&gt;Compare services side by side on the criteria that matter to you.&lt;/li&gt;
&lt;li&gt;Read the methodology if a score surprises you.&lt;/li&gt;
&lt;li&gt;Check the disclosure before you click anything with money attached.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A score is a model.&lt;/strong&gt; A headline score squashes a lot of nuance. VPNs with close scores can be very different products. Use the score to narrow the list and the breakdown to make the decision.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Rankings move, and that's the point
&lt;/h2&gt;

&lt;p&gt;Rankings are updated weekly. That's a feature, but it does mean the order you saw last month may not be the order today. VPN services change their apps, their policies and their infrastructure, and a review that never moves is a review that's slowly becoming fiction.&lt;/p&gt;

&lt;p&gt;Alongside the reviews there are guides for the questions people actually ask before buying, like whether you need a VPN or antivirus, and how Tor and a VPN fit together.&lt;/p&gt;

&lt;h2&gt;
  
  
  What isn't solved
&lt;/h2&gt;

&lt;p&gt;I'll be straight about the limits. Affiliate funding is a structural conflict of interest, and disclosure manages it rather than removes it. The best I can do is keep the method public and keep the money out of the scoring.&lt;/p&gt;

&lt;p&gt;A testing site also can't promise that every result holds for your connection, your country and your device. Real-world speed in one place is not real-world speed everywhere. I'd rather you read a score as useful evidence than as a guarantee.&lt;/p&gt;

&lt;p&gt;And no methodology survives contact with every edge case. When readers point out a criterion that's weighted badly or missing, that's a methodology change, and it should be visible as one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I'd want from any VPN review site, including mine&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A published methodology you can actually find&lt;/li&gt;
&lt;li&gt;Scores broken down by criterion and not just one number&lt;/li&gt;
&lt;li&gt;Picks by use case and not only an overall winner&lt;/li&gt;
&lt;li&gt;Affiliate relationships disclosed where you'll see them&lt;/li&gt;
&lt;li&gt;Regular updates so old rankings don't linger&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;If you can't hide the money, show the method.&lt;/p&gt;

&lt;p&gt;— the rule the whole site is built on&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note: Building approach.&lt;/strong&gt; It's a content site with a structured review model underneath: every review fills the same criteria, so comparisons and picks by need come from the same data instead of separate hand-written lists.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Have a look
&lt;/h2&gt;

&lt;p&gt;If you want to poke holes in the method, it's all on &lt;a href="https://vpnscorelab.com" rel="noopener noreferrer"&gt;vpnscorelab.com&lt;/a&gt;. The rest of my projects are at &lt;a href="https://spicanet.net/products" rel="noopener noreferrer"&gt;spicanet.net/products&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;VPNScoreLab: &lt;a href="https://vpnscorelab.com" rel="noopener noreferrer"&gt;vpnscorelab.com&lt;/a&gt;. Originally published on &lt;a href="https://spicanet.dev/blog/vpnscorelab-scoring-vpns-honestly" rel="noopener noreferrer"&gt;spicanet.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>vpn</category>
      <category>privacy</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Governance research as an API: reading Polity Atlas as data</title>
      <dc:creator>Spicanet</dc:creator>
      <pubDate>Mon, 02 Nov 2026 03:39:36 +0000</pubDate>
      <link>https://dev.to/spicanet/governance-research-as-an-api-reading-polity-atlas-as-data-3i3j</link>
      <guid>https://dev.to/spicanet/governance-research-as-an-api-reading-polity-atlas-as-data-3i3j</guid>
      <description>&lt;p&gt;A lot of political and institutional knowledge lives in prose: encyclopedia articles, papers and long reports. That is fine for reading, but hard to query. You can't easily ask "which experiments use sortition, and which of the claims about them are disputed?" unless someone has already structured it. &lt;a href="https://polityatlas.org" rel="noopener noreferrer"&gt;Polity Atlas&lt;/a&gt; is built the other way round. The pages are views over a graph, and the graph is published through an open API.&lt;/p&gt;

&lt;p&gt;This post is a short tour for developers and researchers who would rather start from JSON than from a web page.&lt;/p&gt;

&lt;h2&gt;
  
  
  The basics
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Base URL:&lt;/strong&gt; &lt;code&gt;https://polityatlas.org/api/v1&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schema:&lt;/strong&gt; an OpenAPI 3.1 document at &lt;code&gt;/api/v1/openapi.json&lt;/code&gt;, plus interactive docs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication:&lt;/strong&gt; none for reading. Writing (for signed-in contributors) uses the Django session cookie and a CSRF token.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pagination:&lt;/strong&gt; list endpoints take &lt;code&gt;page&lt;/code&gt; and &lt;code&gt;page_size&lt;/code&gt; and return &lt;code&gt;{"items", "count", "page", "page_size"}&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Errors:&lt;/strong&gt; always &lt;code&gt;{"detail": "…"}&lt;/code&gt; with a meaningful status code (400, 401, 403, 404, 409, 422, 429).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Localisation:&lt;/strong&gt; add &lt;code&gt;?lang=ru&lt;/code&gt; (or send &lt;code&gt;Accept-Language&lt;/code&gt;) for Russian fields. Missing translations fall back to English.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Licence:&lt;/strong&gt; the developers page lists content under CC BY-SA 4.0 and data under ODbL.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  One request
&lt;/h2&gt;

&lt;p&gt;The canonical example on the developers page fetches a single entity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://polityatlas.org/api/v1/entities/polycentric-law?lang=en"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;

&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://polityatlas.org/api/v1/entities/polycentric-law?lang=en&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;entity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response is not just a title and a summary. It returns the entity with its &lt;strong&gt;relations grouped by type&lt;/strong&gt; (for example, which mechanisms implement it), its &lt;strong&gt;claims with evidence and sources&lt;/strong&gt;, and its &lt;strong&gt;assessments&lt;/strong&gt;. Each claim carries two separate fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;epistemic_status&lt;/code&gt;: established, theory, disputed, hypothesis or forecast&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;verification_status&lt;/code&gt;: unverified, AI-drafted, in review, verified or rejected&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keeping those apart is the useful bit. "Disputed but verified" is a perfectly normal state: the dispute is real and documented, and the record of it has been checked.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can query
&lt;/h2&gt;

&lt;p&gt;The endpoint reference on the developers page is grouped by the site's sections:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Knowledge&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GET /entities&lt;/code&gt; with filters for kind, theme, tag and free text&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /entities/{slug}/graph&lt;/code&gt; for an ego network, one or two hops deep&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /graph&lt;/code&gt; for the whole published graph&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /claims/{id}&lt;/code&gt; for a claim, its evidence, sources and open disputes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /sources&lt;/code&gt;, &lt;code&gt;GET /glossary&lt;/code&gt;, and &lt;code&gt;GET /search&lt;/code&gt; with keyword or semantic mode&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;POST /ask&lt;/code&gt; for an answer built only from published claims&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Living Atlas&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GET /experiments&lt;/code&gt; with filters including a bounding box, autonomy and whether AI is used&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /experiments/geojson&lt;/code&gt; returns a GeoJSON FeatureCollection, ready for a map&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /experiments/network&lt;/code&gt; for network polities and shared mechanisms&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /experiments/facets&lt;/code&gt; for counts per facet value&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Explorer and Observatory&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GET /criteria&lt;/code&gt; and &lt;code&gt;POST /explorer/compare&lt;/code&gt; for weighted comparisons over known criteria&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /observatory&lt;/code&gt; (signals, news, research, briefings) and &lt;code&gt;GET /scenarios&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Polity Lab&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GET /lab/options&lt;/code&gt; for configuration dimensions and stress scenarios&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /repository/components&lt;/code&gt; for versioned institution components&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And for bulk work there is &lt;code&gt;GET /export/entities.jsonl&lt;/code&gt;, the full graph as JSON Lines, refreshed nightly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The vocabulary
&lt;/h2&gt;

&lt;p&gt;Everything uses one ontology, which is documented on the same page. Entity kinds include concept, mechanism, theory, thinker, experiment, institution type, ideology and organisation. Relations are typed: &lt;code&gt;implements&lt;/code&gt;, &lt;code&gt;tested_in&lt;/code&gt;, &lt;code&gt;proposed_by&lt;/code&gt;, &lt;code&gt;influenced&lt;/code&gt;, &lt;code&gt;criticises&lt;/code&gt;, &lt;code&gt;alternative_to&lt;/code&gt;, &lt;code&gt;part_of&lt;/code&gt;, &lt;code&gt;uses_mechanism&lt;/code&gt; and &lt;code&gt;related_to&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Typed relations are what make the graph worth querying. "Quadratic voting is &lt;em&gt;tested in&lt;/em&gt; these experiments" and "this thinker &lt;em&gt;criticises&lt;/em&gt; that concept" are different statements, and the API keeps them apart instead of flattening everything into "see also".&lt;/p&gt;

&lt;h2&gt;
  
  
  A few things you could build
&lt;/h2&gt;

&lt;p&gt;None of these exist yet as far as we know. They are just the obvious uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A map layer of operating and closed experiments for a teaching site, straight from the GeoJSON endpoint.&lt;/li&gt;
&lt;li&gt;A reading list generator that walks &lt;code&gt;proposed_by&lt;/code&gt; and &lt;code&gt;influenced&lt;/code&gt; edges from a concept to its thinkers.&lt;/li&gt;
&lt;li&gt;A notebook that pulls the JSONL export and checks how many claims about a mechanism are disputed versus established.&lt;/li&gt;
&lt;li&gt;A citation helper that resolves an entity slug to its sources.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you do build something, the licences ask for attribution (CC BY-SA for content, ODbL for data).&lt;/p&gt;

&lt;h2&gt;
  
  
  Notes and limits
&lt;/h2&gt;

&lt;p&gt;Reading is anonymous with "generous rate limits", and the OpenAPI description documents &lt;code&gt;X-RateLimit-*&lt;/code&gt; headers. Be polite with bulk jobs and use the JSONL export rather than paging through everything. Russian is the documented second language for API fields. Governance Explorer scores are described on the methodology page as editorial judgements against stated criteria, so treat them as illustrative rather than as measurements.&lt;/p&gt;

&lt;p&gt;Polity Atlas is built by &lt;a href="https://spicanet.dev" rel="noopener noreferrer"&gt;Spicanet&lt;/a&gt;. The full reference is on the &lt;a href="https://polityatlas.org/developers" rel="noopener noreferrer"&gt;developers page&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Polity Atlas: &lt;a href="https://polityatlas.org" rel="noopener noreferrer"&gt;polityatlas.org&lt;/a&gt;. Originally published on &lt;a href="https://polityatlas.org/developers" rel="noopener noreferrer"&gt;Polity Atlas&lt;/a&gt;. Studio write-up on spicanet.dev: &lt;a href="https://spicanet.dev/blog/polity-atlas-an-atlas-of-how-societies-organise" rel="noopener noreferrer"&gt;Design an institution. Then try to break it.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>opendata</category>
      <category>python</category>
      <category>civictech</category>
    </item>
    <item>
      <title>A Koh Samui guide for a week or a whole season</title>
      <dc:creator>Spicanet</dc:creator>
      <pubDate>Sun, 01 Nov 2026 03:39:36 +0000</pubDate>
      <link>https://dev.to/spicanet/a-koh-samui-guide-for-a-week-or-a-whole-season-6k</link>
      <guid>https://dev.to/spicanet/a-koh-samui-guide-for-a-week-or-a-whole-season-6k</guid>
      <description>&lt;p&gt;I know the problem every visitor to Koh Samui has. The island is small enough that you feel you should know it in a day, and big enough that you won't. The good beach is the one nobody mentioned. The best southern Thai food is in a place with no website. And the information online is a mix of old blog posts, ads pretending to be advice and maps with pins in the sea. &lt;a href="https://samuilove.com" rel="noopener noreferrer"&gt;Samui Love&lt;/a&gt; is a warm, multilingual guide to Koh Samui for a week on the island or a whole season. It's live.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with island information
&lt;/h2&gt;

&lt;p&gt;Small places get badly served by big travel sites. The listings that rise to the top are the ones that pay or the ones that have been there longest, not necessarily the ones worth your afternoon.&lt;/p&gt;

&lt;p&gt;And visitors come for very different lengths of time. Someone here for a week needs a shortlist. Someone here for a season needs to know where to get things done, where locals eat and what's on this weekend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's in the guide&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Section&lt;/th&gt;
&lt;th&gt;What you'll find&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Beaches&lt;/td&gt;
&lt;td&gt;Where to swim and where to just look&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restaurants&lt;/td&gt;
&lt;td&gt;Places to eat including real southern Thai food&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Places to explore&lt;/td&gt;
&lt;td&gt;Top places and hidden gems on a map&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tours&lt;/td&gt;
&lt;td&gt;Tours from local operators&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Events&lt;/td&gt;
&lt;td&gt;What's on around the island&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local businesses&lt;/td&gt;
&lt;td&gt;Services and shops in one directory&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Local guides, not listicles
&lt;/h2&gt;

&lt;p&gt;Alongside the directory, there are local guides for the things people actually ask about. Ang Thong Marine Park. The best beaches. A short itinerary for people who want a plan. Where to find real southern Thai food, which is a question that deserves better answers than it usually gets.&lt;/p&gt;

&lt;p&gt;The guide uses real photos. That sounds like a low bar. Go look at how many island guides use the same stock image of a palm tree.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If the photo could be any island, the advice probably could be too.&lt;/p&gt;

&lt;p&gt;— why the guide uses real photos&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;How I'd use it for a first week&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Read the best beaches guide and pick a base.&lt;/li&gt;
&lt;li&gt;Open the map and save a few top places and hidden gems.&lt;/li&gt;
&lt;li&gt;Book a tour from a local operator for a day out.&lt;/li&gt;
&lt;li&gt;Check events for the weekend.&lt;/li&gt;
&lt;li&gt;Use the southern Thai food guide more than once.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why multilingual from the start
&lt;/h2&gt;

&lt;p&gt;Koh Samui's visitors and long-stay residents come from all over, and a lot of them would rather not read island tips in a language they barely use. A multilingual guide is far easier to build in than to bolt on later, and it means a family planning a holiday and a remote worker planning a season can both read it comfortably.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an account adds
&lt;/h2&gt;

&lt;p&gt;You don't need an account to read the guide. If you create one, you can save places, use them offline and receive local deals. Offline matters more than it sounds: island signal has opinions, and a saved list you can't open on a boat is not much of a list.&lt;/p&gt;

&lt;p&gt;There's also an AI trip assistant to help plan. It's a helper on top of the guide, not a replacement for it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Save before you go.&lt;/strong&gt; Save the places you care about while you have a good connection. Your saved list works offline, which is exactly when you'll need it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What's honestly still in progress
&lt;/h2&gt;

&lt;p&gt;Samui Love is live on the web. The portfolio describes it as web and mobile in active development, and I'm not going to promise mobile apps in this article. Treat the website as the product today.&lt;/p&gt;

&lt;p&gt;Active development also means sections fill in unevenly. Some areas and categories are richer than others, and a guide to a living island is never really finished. Places open, close and change, and keeping up is ongoing work.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web: live&lt;/li&gt;
&lt;li&gt;Mobile: in active development&lt;/li&gt;
&lt;li&gt;Coverage: uneven and growing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Getting more out of a Koh Samui trip&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pick your base by beach and not by hotel photos&lt;/li&gt;
&lt;li&gt;Plan a day on the water&lt;/li&gt;
&lt;li&gt;Eat where the menu isn't written for tourists&lt;/li&gt;
&lt;li&gt;Check what's on before the weekend&lt;/li&gt;
&lt;li&gt;Save places for offline use&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note: How it's built.&lt;/strong&gt; In general terms: a multilingual content site with a structured directory of places, tours, events and businesses, a map on top, and accounts for saved places, offline use and deals. The AI assistant sits on top of the guide's own content.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Have a look
&lt;/h2&gt;

&lt;p&gt;Samui Love is at &lt;a href="https://samuilove.com" rel="noopener noreferrer"&gt;samuilove.com&lt;/a&gt;. My other projects are on &lt;a href="https://spicanet.net/products" rel="noopener noreferrer"&gt;spicanet.net/products&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Samui Love: &lt;a href="https://samuilove.com" rel="noopener noreferrer"&gt;samuilove.com&lt;/a&gt;. Originally published on &lt;a href="https://spicanet.dev/blog/samui-love-a-koh-samui-guide" rel="noopener noreferrer"&gt;spicanet.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>travel</category>
      <category>webdev</category>
      <category>i18n</category>
      <category>maps</category>
    </item>
    <item>
      <title>One player profile for every game: building SpicaPlay</title>
      <dc:creator>Spicanet</dc:creator>
      <pubDate>Sat, 31 Oct 2026 03:38:56 +0000</pubDate>
      <link>https://dev.to/spicanet/one-player-profile-for-every-game-building-spicaplay-1o6h</link>
      <guid>https://dev.to/spicanet/one-player-profile-for-every-game-building-spicaplay-1o6h</guid>
      <description>&lt;p&gt;Most casual browser games treat you like a stranger every time you show up. You play, you get a score, the tab closes and the score evaporates. &lt;a href="https://spicaplay.com" rel="noopener noreferrer"&gt;SpicaPlay&lt;/a&gt; is my answer to that small, petty injustice: a web-first casual gaming platform where one player identity follows you from game to game, carrying XP, achievements, streaks and leaderboard spots. It's live, there's a growing set of games you can play right now, and there's nothing to install.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I bothered
&lt;/h2&gt;

&lt;p&gt;I didn't set out to compete with the giant game portals. They have huge catalogs and teams to match. I have a smaller ambition: make a set of quick games feel connected, so that a quick round of Reaction Tap counts toward something instead of disappearing.&lt;/p&gt;

&lt;p&gt;The interesting design problem isn't any individual game. It's the layer between them. What does a profile mean when the games are this different? How do you reward someone for trying a puzzle game when they mostly play arcade? That's where most of my time went.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How one profile ties the games together&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The loop a player goes through, whether they're signed in or not.&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open spicaplay.com and start any game as a guest. No sign-up wall.&lt;/li&gt;
&lt;li&gt;Play. The game reports the result to the platform rather than keeping it to itself.&lt;/li&gt;
&lt;li&gt;XP and achievements land on your player profile.&lt;/li&gt;
&lt;li&gt;Time-windowed leaderboards and your daily streak update.&lt;/li&gt;
&lt;li&gt;The daily challenge and weekly missions nudge you toward a game you haven't tried.&lt;/li&gt;
&lt;li&gt;If you want to keep your progress, link a Google or email account.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What's actually in there
&lt;/h2&gt;

&lt;p&gt;The catalog covers arcade, puzzle, adventure, strategy and sports. A few names, so you know I'm not describing vapour: Cosmic Dodge, Reaction Tap, Bubble Burst, Castle Siege, Cipher Vault and Circuit Link.&lt;/p&gt;

&lt;p&gt;Before I call a game published, I check that it actually runs and can be played end to end, not just that its page loads. I do that with automated headless runs as well as by hand. It sounds obvious. It's also exactly the check that gets skipped, right before a game goes out with a lovely title screen and nothing behind it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The meta layer in one table&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;What it's for&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One player identity&lt;/td&gt;
&lt;td&gt;Progress isn't trapped inside one game&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XP and achievements&lt;/td&gt;
&lt;td&gt;Something to show for a quick session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time-windowed leaderboards&lt;/td&gt;
&lt;td&gt;New players can still place this week&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Daily streaks&lt;/td&gt;
&lt;td&gt;A reason to come back that isn't a notification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Daily challenge&lt;/td&gt;
&lt;td&gt;One shared goal for everyone today&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Weekly missions&lt;/td&gt;
&lt;td&gt;Rewards for variety across genres&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Guest play&lt;/td&gt;
&lt;td&gt;Try first and decide later&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Guest first, on purpose.&lt;/strong&gt; Account linking is optional. Forcing sign-up before the first game is the fastest way to lose someone who just wanted to kill a few minutes. Guest progress is the default; linking an account is how you keep it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  A small note on leaderboards
&lt;/h2&gt;

&lt;p&gt;All-time leaderboards are a museum. Whoever got there first stays there forever, and everyone else learns not to look. Time-windowed boards reset the competition regularly, so a new player has a real shot at being on the board this week. It's a tiny decision that changes how the whole thing feels.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's not there yet, honestly
&lt;/h2&gt;

&lt;p&gt;The catalog is real and playable, but let's be adults about it: it's small next to the big portals, and I'm not going to pretend otherwise. The plan is to grow it slowly with games that actually work, not to pad it with unfinished ones.&lt;/p&gt;

&lt;p&gt;Some games are deeper than others. A reflex game and a strategy game will never have the same replay value, and the mission system is my attempt to balance that rather than a claim that I've solved it.&lt;/p&gt;

&lt;p&gt;I also don't have a grand story about multiplayer, tournaments or anything of the kind. If that ever happens, I'll write about it when it exists.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Catalog: small and growing carefully&lt;/li&gt;
&lt;li&gt;Depth: uneven between genres&lt;/li&gt;
&lt;li&gt;Social features beyond leaderboards: not there&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;If you're building something similar&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decide what a profile means before building the next game&lt;/li&gt;
&lt;li&gt;Let games report results to a shared layer instead of storing them locally&lt;/li&gt;
&lt;li&gt;Prefer time-windowed boards over all-time ones&lt;/li&gt;
&lt;li&gt;Make guest play the default&lt;/li&gt;
&lt;li&gt;Test that a game is playable end to end before you list it&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;A game that loads but can't be finished isn't a game. It's a screenshot with a loading bar.&lt;/p&gt;

&lt;p&gt;— note to self, pinned above the catalog&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Go waste a few minutes
&lt;/h2&gt;

&lt;p&gt;If you've got a coffee break, try some games at &lt;a href="https://spicaplay.com" rel="noopener noreferrer"&gt;spicaplay.com&lt;/a&gt; and tell me which one deserves a sequel. Everything else I'm working on lives at &lt;a href="https://spicanet.net/products" rel="noopener noreferrer"&gt;spicanet.net/products&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;SpicaPlay: &lt;a href="https://spicaplay.com" rel="noopener noreferrer"&gt;spicaplay.com&lt;/a&gt;. Originally published on &lt;a href="https://spicanet.dev/blog/spicaplay-one-player-profile-for-every-game" rel="noopener noreferrer"&gt;spicanet.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>html</category>
    </item>
    <item>
      <title>Modelling a music scene as entities, not as a blog dump</title>
      <dc:creator>Spicanet</dc:creator>
      <pubDate>Fri, 30 Oct 2026 13:32:23 +0000</pubDate>
      <link>https://dev.to/spicanet/a-dnb-and-jungle-hub-that-links-out-instead-of-hoarding-3lb0</link>
      <guid>https://dev.to/spicanet/a-dnb-and-jungle-hub-that-links-out-instead-of-hoarding-3lb0</guid>
      <description>&lt;p&gt;If you only glance at &lt;a href="https://dropthebass.co" rel="noopener noreferrer"&gt;DROP THE BASS&lt;/a&gt;, it can look like a music site with a lot of sections. The more accurate description is a portal, running since 2002, whose public catalogue is built around entity types — artist, label, release, rave — with a subgenre vocabulary and a separate editorial layer. The catalogue is compiled from public music and event sources and editorially curated. This is about that model. It is not a pipeline disclosure, and it is not a claim to have ingested any particular commercial platform.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://dropthebass.co/about" rel="noopener noreferrer"&gt;about page&lt;/a&gt; states the shape in plain terms: artist profiles (DJs, MCs, producers), labels and promoters; releases, mixes and videos; raves; news and other editorial. An MC, here, is the host of a night, not automatically “the rapper.” A selector is the person choosing the music. Most pages are readable without an account. A login exists for a junglist profile — “junglist” meaning someone in jungle and drum &amp;amp; bass culture, not a tropical-travel tag — plus follows and saved items.&lt;/p&gt;

&lt;p&gt;Jungle and drum &amp;amp; bass are related on the site and are not treated as one word. Jungle is a style and a culture, not a rainforest aesthetic and not a synonym for every track in the 170 zone (the informal name for the usual tempo, around 170 BPM). Subgenre pages further split the field — liquid funk, neurofunk, jump-up, halftime and others — as a browsing taxonomy whose borders remain disputed. The site should be used that way, not as a canon.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://dropthebass.co/artists" rel="noopener noreferrer"&gt;artists&lt;/a&gt; index is one concrete slice of the entity model: people pages that can connect to releases, labels and, where listed, nights. This article does not invent a headcount or a size claim for the roster. The useful fact is the type: an artist is a first-class object, not only a string on a track title.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dropthebass.co/dubplates" rel="noopener noreferrer"&gt;Dubplates&lt;/a&gt; are another type, and the FAQ keeps them distinct from demos. On this site a dubplate (sometimes just “a plate” or “a dub”) is a public-catalogue item: a standalone tune, a VIP or unreleased pressure, synced from SoundCloud. A demo is private, sent to a label that has claimed its page. Raves, similarly, are published through promoter, venue or festival profiles, not asserted here as a silent scrape of every event site. Once live, a rave can also appear on the relevant city page. Anything more specific about ingestion is not on the about or FAQ pages, so it is not stated in this article.&lt;/p&gt;

&lt;p&gt;Mixes and videos follow the same attachment pattern: their own sections, still linked to artists and labels rather than living as an unrelated media dump. Editorial pages — news, and a smaller set of long reads and guides — sit beside the entity graph, not in place of it.&lt;/p&gt;

&lt;p&gt;The same model is what you meet on a city page or a festival listing: those are views onto rave entities, not a second unofficial website. Coverage is uneven because a night only appears once it has been published through a profile. A gap is usually a publishing gap, not proof that a city has no scene. The public FAQ is the source for that publishing path; this article does not add unofficial workarounds. If you are used to thinking in records and relations, that is the whole point: curated entities, a contested vocabulary, and a public/private split for plates versus demos. No rankings, and no implied completeness.&lt;/p&gt;

&lt;p&gt;For the front door, use &lt;a href="https://dropthebass.co" rel="noopener noreferrer"&gt;DROP THE BASS&lt;/a&gt;. The about page, the artists index and the dubplates catalogue are the three places to test what this article has just described.&lt;/p&gt;

</description>
      <category>music</category>
      <category>webdev</category>
      <category>automation</category>
      <category>community</category>
    </item>
    <item>
      <title>I built a CMS with no plugins, and I'm keeping it that way</title>
      <dc:creator>Spicanet</dc:creator>
      <pubDate>Thu, 29 Oct 2026 03:41:38 +0000</pubDate>
      <link>https://dev.to/spicanet/i-built-a-cms-with-no-plugins-and-im-keeping-it-that-way-1a0h</link>
      <guid>https://dev.to/spicanet/i-built-a-cms-with-no-plugins-and-im-keeping-it-that-way-1a0h</guid>
      <description>&lt;p&gt;Every CMS I've used eventually turns into a negotiation with its plugin list. One plugin does sitemaps, another does schema, another fights them both over canonical tags, and the site you actually wanted is somewhere underneath. &lt;a href="https://spicacms.com" rel="noopener noreferrer"&gt;SpicaCMS&lt;/a&gt; is my attempt to stop negotiating. It's a single-site, SEO-first CMS runtime with no plugins at all, and it's live. It's also still in active development, and I'd rather say that up front than let you find out from a changelog.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem I kept hitting
&lt;/h2&gt;

&lt;p&gt;I run a lot of content sites. Reviews, directories, guides, the odd magazine. The setup was always the same: pick a CMS, install a stack of plugins, then spend evenings figuring out why the sitemap forgot a chunk of the pages or why several plugins all decided to print JSON-LD.&lt;/p&gt;

&lt;p&gt;The SEO basics weren't the hard part. The hard part was that they lived in someone else's add-on, configured in a settings screen I'd forget about, and broke quietly when something updated. So I built the boring parts into the runtime and threw away the idea of plugins entirely.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If every site needs it, it isn't a plugin. It's the product.&lt;/p&gt;

&lt;p&gt;— me, after untangling one canonical tag too many&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What SpicaCMS actually is
&lt;/h2&gt;

&lt;p&gt;Each deployment runs exactly one site. The backend is Django, the frontend is Next.js, and editors work in a staff Control Panel that I've tried hard to keep fast and plain. There's no marketplace, no theme store and no mystery code from strangers.&lt;/p&gt;

&lt;p&gt;One site per deployment sounds like a limitation, and it is one. It's also the reason I can reason about a site without wondering which tenant broke what. If you want to run lots of sites, you run lots of deployments. Dull, predictable, debuggable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Template packs are data models, not skins
&lt;/h2&gt;

&lt;p&gt;This is the part I care about most. A template pack in SpicaCMS isn't a coat of paint. It's a full data model for a type of site, with the fields, pages and structured data that type actually needs. A job board needs different fields from a travel guide, and pretending otherwise is how you end up stuffing salary ranges into a custom field called extra_3.&lt;/p&gt;

&lt;p&gt;The packs today cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Blogs and magazines&lt;/li&gt;
&lt;li&gt;Knowledge bases&lt;/li&gt;
&lt;li&gt;Affiliate reviews and software alternatives&lt;/li&gt;
&lt;li&gt;Directories&lt;/li&gt;
&lt;li&gt;Real estate and jobs&lt;/li&gt;
&lt;li&gt;Events&lt;/li&gt;
&lt;li&gt;Travel guides with itineraries and maps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;SEO that ships with the runtime&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concern&lt;/th&gt;
&lt;th&gt;How SpicaCMS handles it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Structured data&lt;/td&gt;
&lt;td&gt;Validated schema.org JSON-LD per page type&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sitemaps&lt;/td&gt;
&lt;td&gt;Multi-index sitemaps generated by the runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Languages&lt;/td&gt;
&lt;td&gt;Automatic hreflang&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changed slugs&lt;/td&gt;
&lt;td&gt;Automatic 301 redirects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extensions&lt;/td&gt;
&lt;td&gt;None. No plugins by design&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;What happens when an editor renames a page&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The editor changes the slug in the Control Panel and saves.&lt;/li&gt;
&lt;li&gt;The runtime records the old path and issues a 301 to the new one.&lt;/li&gt;
&lt;li&gt;The sitemap picks up the new URL instead of the old one.&lt;/li&gt;
&lt;li&gt;Structured data and hreflang follow the page instead of pointing at a ghost.&lt;/li&gt;
&lt;li&gt;Nobody has to remember to install a redirect plugin first.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Self-host or not.&lt;/strong&gt; The Community edition is free and open-source per site if you want to run it yourself. If you'd rather not babysit servers, there's a managed cloud option. Pricing lives on the site and I'm not going to paste it into an essay that will outlive it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What's honestly not done
&lt;/h2&gt;

&lt;p&gt;SpicaCMS is live, but the portfolio still lists it as active development, and that's accurate. Template packs and the Control Panel are still changing. If you need a frozen API surface that won't move for two years, this isn't that yet.&lt;/p&gt;

&lt;p&gt;There's also a companion SEO tool, SpicaSEO, that's meant to work alongside it. SpicaSEO is in development. Please don't pick a CMS on the strength of a tool that isn't finished; I wouldn't.&lt;/p&gt;

&lt;p&gt;And the no-plugins rule cuts both ways. If your site depends on some niche integration, the answer today is probably no, or not yet. I'd rather say no than ship an extension system I then have to support forever.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is SpicaCMS a fit for you?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You run content sites where search traffic matters&lt;/li&gt;
&lt;li&gt;Your site matches one of the template pack types&lt;/li&gt;
&lt;li&gt;You're fine with one site per deployment&lt;/li&gt;
&lt;li&gt;You don't need a plugin ecosystem&lt;/li&gt;
&lt;li&gt;You can live with a product that's still evolving&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note: Why Django and Next.js.&lt;/strong&gt; Django gives me a solid admin-friendly backend and data modelling I trust. Next.js renders the public pages. Splitting them means the editing side and the reading side can each be boring in their own way, which is the highest compliment I give software.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Where to look
&lt;/h2&gt;

&lt;p&gt;If any of this sounds like the CMS you wished you had a few plugin conflicts ago, the details are at &lt;a href="https://spicacms.com" rel="noopener noreferrer"&gt;spicacms.com&lt;/a&gt;. The rest of what I'm building is on &lt;a href="https://spicanet.net/products" rel="noopener noreferrer"&gt;spicanet.net/products&lt;/a&gt;, and I'm happy to hear what's missing from your side.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;SpicaCMS: &lt;a href="https://spicacms.com" rel="noopener noreferrer"&gt;spicacms.com&lt;/a&gt;. Originally published on &lt;a href="https://spicanet.dev/blog/spicacms-a-cms-with-no-plugins" rel="noopener noreferrer"&gt;spicanet.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cms</category>
      <category>django</category>
      <category>nextjs</category>
      <category>seo</category>
    </item>
  </channel>
</rss>
