<?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: PipAtlas</title>
    <description>The latest articles on DEV Community by PipAtlas (@pipatlas26).</description>
    <link>https://dev.to/pipatlas26</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%2F4185299%2F2a8be73f-1c8c-4cb6-9eb8-915517c1f0af.png</url>
      <title>DEV Community: PipAtlas</title>
      <link>https://dev.to/pipatlas26</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pipatlas26"/>
    <language>en</language>
    <item>
      <title>My site publishes a blog post a day while I sleep — no cron, no CMS (week 6 build-log)</title>
      <dc:creator>PipAtlas</dc:creator>
      <pubDate>Sat, 17 Oct 2026 19:51:47 +0000</pubDate>
      <link>https://dev.to/pipatlas26/my-site-publishes-a-blog-post-a-day-while-i-sleep-no-cron-no-cms-week-6-build-log-alk</link>
      <guid>https://dev.to/pipatlas26/my-site-publishes-a-blog-post-a-day-while-i-sleep-no-cron-no-cms-week-6-build-log-alk</guid>
      <description>&lt;p&gt;Part 3 of building PipAtlas in public. Part 2 covered the first five weeks of real search data. This week I wired the thing every content site eventually needs: a blog that publishes on schedule, generates its own illustrations, and heals its own broken links — running inside a single Node process, no cron jobs, no CMS, no AI slop.&lt;/p&gt;

&lt;p&gt;The constraint that shaped everything&lt;br&gt;
The blog had one job: one post per day, from a queue of markdown drafts, published to static HTML with a regenerated index and sitemap. The obvious tool is cron. I built it on cron first — and then watched it do nothing for a day because a hosting panel quietly didn't save the crontab entry.&lt;/p&gt;

&lt;p&gt;Lesson: if uptime of a feature matters, put it in the process that's already supervised by your host. The app server restarts when I deploy, gets watched by the panel, and logs somewhere I actually look. So the scheduler moved inside the server:&lt;/p&gt;

&lt;p&gt;JavaScript&lt;/p&gt;

&lt;p&gt;(function at30(){&lt;br&gt;
  const now = new Date(); const t = new Date(now);&lt;br&gt;
  t.setMinutes(30, 0, 0);&lt;br&gt;
  if (t &amp;lt;= now) t.setHours(t.getHours() + 1);&lt;br&gt;
  setTimeout(function(){ runBlog(); setInterval(runBlog, 3600000); }, t - now);&lt;br&gt;
})();&lt;br&gt;
Aligned timers, busy-flags to prevent overlap, and a boot burst 90 seconds after every restart so pending drafts publish immediately. The child process gets the site root handed to it explicitly:&lt;/p&gt;

&lt;p&gt;JavaScript&lt;/p&gt;

&lt;p&gt;const env = folderMode&lt;br&gt;
  ? { ...process.env, GROWTH_PUB: SITE_ROOT }   // never let bots guess paths&lt;br&gt;
  : process.env;&lt;br&gt;
execFile(process.execPath, [botPath], { cwd: growthDir, env });&lt;br&gt;
That GROWTH_PUB handoff exists because of my favorite failure this week: the publishing bot spent days failing with public_html not found — because I'd assumed a directory layout the host doesn't use. Folder-mode hosting serves the site from the app folder itself. One log line from the owner's screenshot, one env variable, fixed. Bots should never infer paths when the running process knows them.&lt;/p&gt;

&lt;p&gt;Illustrations without an image API&lt;br&gt;
Every post gets a chart — generated, not stock. A tiny SVG module renders bar charts, curve charts and session clocks in the site's exact brand palette (navy/teal/gold), writing static files the posts reference. No API keys, no rate limits, no 40 KB of chart library shipped to readers — the whole figure is ~2 KB of markup that scales perfectly.&lt;/p&gt;

&lt;p&gt;The drafting side is deliberately not an AI text spinner. Topic packs are hand-authored (real numbers, real tables, an FAQ, an internal link plan); the bot assembles, illustrates and runs hard validation — minimum word count, mandatory internal links, a placeholder sweep — and refuses to queue anything that fails. An optional LLM pass exists behind a config flag, but it's gated by the same validation and falls back to the authored blocks. Quality is a floor, not a hope.&lt;/p&gt;

&lt;p&gt;The bug the users caught before I did&lt;br&gt;
Two days in, a link check found posts 404ing from the blog index. Cause: the index was served at both /blog.html and the clean URL /blog, and the card links were relative — so at /blog (no trailing slash) the browser resolved them against the site root. Classic.&lt;/p&gt;

&lt;p&gt;The durable fix was to make every internal link in bot-generated pages root-absolute, plus a self-healing reskin pass that relinks older published pages on every run. And because some broken URLs were already loose in the wild, the server now 301s any legacy root-level post URL straight into its new home. Broken links aren't a to-do list; they're a state you repair automatically or they come back.&lt;/p&gt;

&lt;p&gt;What the numbers say so far&lt;br&gt;
Six weeks in: ~140 pages indexed, position data on dozens of queries, organic impressions climbing week over week — and now three posts live with one landing per day, each interlinked into the calculators and glossary that already rank. The blog isn't a content play, it's an internal-linking engine for pages that were previously islands.&lt;/p&gt;

&lt;p&gt;Everything here runs on ~$2 hosting, one Node file, and markdown drafts. Series continues with the link-building chapter — journalist platforms, not spam — once there's data worth reporting.&lt;/p&gt;

&lt;p&gt;Building the same thing? The one principle I'd export: anything that must run daily belongs to a process that's already being kept alive — not to a crontab you have to remember to save.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>showdev</category>
      <category>node</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I built a forex-education site with zero frameworks — here's 5 weeks of real SEO data</title>
      <dc:creator>PipAtlas</dc:creator>
      <pubDate>Fri, 16 Oct 2026 21:24:22 +0000</pubDate>
      <link>https://dev.to/pipatlas26/i-built-a-forex-education-site-with-zero-frameworks-heres-5-weeks-of-real-seo-data-51ja</link>
      <guid>https://dev.to/pipatlas26/i-built-a-forex-education-site-with-zero-frameworks-heres-5-weeks-of-real-seo-data-51ja</guid>
      <description>&lt;p&gt;Part 2 of building PipAtlas in public. Part 1 introduced the site — a free forex-education suite (calculators, a 47-term glossary, a curated indicator library, no sign-up). This part is the one I wished I'd found before starting: what the first five weeks of real search data actually look like, from a plain-HTML site with no framework and no ad budget.&lt;br&gt;
The stack: boring on purpose&lt;br&gt;
No React. No build step. No CMS. PipAtlas is hand-written HTML served by a single Node file, plus a handful of cron jobs.&lt;/p&gt;

&lt;p&gt;The homepage — nav, hero, a live position-size calculator, a market-session clock, a data strip — weighs 62 KB. No hydration, no layout shift, nothing to download but text and a few icons.&lt;/p&gt;

&lt;p&gt;Was it worth giving up a modern framework? The numbers I can share: 93 on Lighthouse mobile at last scan, and every one of the 137 pages renders in one round trip. On a $2 hosting plan. For an education site where readers are often on phones, that trade has paid for itself every single day.&lt;/p&gt;

&lt;p&gt;Five weeks of honest Google data&lt;br&gt;
I pull straight from the Google Search Console API (more on the tooling below). Here's the actual curve, unedited:&lt;/p&gt;

&lt;p&gt;Metric  Week 1  Week 5&lt;br&gt;
Impressions / week  5   51&lt;br&gt;
Queries with impressions    27  66&lt;br&gt;
Avg. position (top-20 pages)    ~34 34.2 and grinding down&lt;br&gt;
Clicks  0   0&lt;br&gt;
That last row is the one nobody puts in their landing page, so let me put it here: at five weeks, clicks are zero. Impressions are compounding weekly, positions are drifting toward page one, but nobody has clicked yet — and that's normal. Everyone sells you the hockey stick; the real curve is a flat line that quietly steepens around months 2–4. If you're at week 5 with zero clicks and rising impressions, you're on track. Don't panic-rebuild.&lt;/p&gt;

&lt;p&gt;The three things that surprised me&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Redirect hygiene beats content, early. My pages live at clean URLs (/what-is-a-pip), with the legacy .html versions 301-redirecting in. Getting that pair right — canonical tags agreeing with redirects — took one focused evening and probably did more for crawl health than my last two articles. Google rewards a site that is easy to crawl before it rewards one that is eloquent.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Your sitemap and your real pages will disagree. The sitemap listed 137 URLs. The first full crawl of my own site found 140 real pages — plus twins: / and /index.html serving the same content, redirect chains nobody noticed. Nothing fatal, all of it invisible until a bot crawled the site the way Google does. Build your own crawler before you trust your sitemap.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The edge can block your whole site without asking. Mid-project, every visitor on earth started getting 403 — your country is not allowed — not from my server, but from the hosting CDN's edge, which had switched on a geo-filter on its own. Twenty confusing minutes until someone thought to check the response headers (server: hcdn told the whole story). Lesson: when a site dies, identify who is answering before debugging what. The origin was fine the entire time.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The monitoring stack (a cron job with opinions)&lt;br&gt;
I didn't want a third-party SEO dashboard, so I wrote one — a single Node project ("GrowthHQ") the cron scheduler runs hourly:&lt;/p&gt;

&lt;p&gt;GSC bot — pulls clicks/impressions/queries via API, keeps daily snapshots, computes weekly pace&lt;br&gt;
A crawler — walks the whole site like Googlebot, audits titles, meta descriptions, alt text, JSON-LD, and flags broken links and redirect chains&lt;br&gt;
GA4 join — pulls Google Analytics with a read-only service account and tracks AI-referral traffic (chatgpt.com, perplexity.ai…) separately — because that's a referral source that didn't exist two years ago&lt;br&gt;
A composite authority score — my own 0–100 from traffic, search impressions, content depth, technical health, and an external PageRank API&lt;br&gt;
Total cost: $0. Total files: a handful of setInterval-with-adult-supervision scripts. If you can write a fetch call, you can replace most of your SaaS stack with a folder.&lt;/p&gt;

&lt;p&gt;Try the tools (the soft sell — it's one sentence)&lt;br&gt;
Everything above powers pipatlas.com — free, no sign-up: a position-size calculator, a live pip-value table, an economic calendar, and a plain-English glossary of 47+ terms. Education only, never financial advice, sources named on every page.&lt;/p&gt;

&lt;p&gt;What's next&lt;br&gt;
Content batch #2 for the site, a real outreach pass (this post is part of it), and — the scoreboard I care about — the first week with clicks in double digits. I'll report back with Part 3 when it happens, whatever the number is.&lt;/p&gt;

&lt;p&gt;If you're building something similar: ship the boring stack, wire up your own measurement early, and ignore anyone showing you week-5 hockey sticks. The flat line is where the work happens.&lt;/p&gt;

&lt;p&gt;Thanks for reading — I answer questions in the comments, and the repo links from Part 1 still stand.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>seo</category>
      <category>showdev</category>
      <category>bigginer</category>
    </item>
    <item>
      <title>I built free position-size calculators for forex traders — the lot-size math most beginners get wrong</title>
      <dc:creator>PipAtlas</dc:creator>
      <pubDate>Wed, 14 Oct 2026 18:23:17 +0000</pubDate>
      <link>https://dev.to/pipatlas26/i-built-free-position-size-calculators-for-forex-traders-the-lot-size-math-most-beginners-get-5b2h</link>
      <guid>https://dev.to/pipatlas26/i-built-free-position-size-calculators-for-forex-traders-the-lot-size-math-most-beginners-get-5b2h</guid>
      <description>&lt;p&gt;Lot size decides everything: risk per trade, pip value, how fast an account dies. Most beginners eyeball it. The math is simple — risk amount ÷ (stop-loss in pips × pip value) — but it changes per pair, per account currency, per contract size. So I built PipAtlas: free, no-signup calculators for BTCUSD, NAS100, XAUUSD and majors, plus a pip calculator and a glossary. No ads, no email wall. Feedback welcome — what would you add?&lt;/p&gt;

&lt;p&gt;Try them: &lt;a href="https://pipatlas.com" rel="noopener noreferrer"&gt;https://pipatlas.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>forex</category>
      <category>trading</category>
      <category>beginners</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
