<?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>Forem: Philipp</title>
    <description>The latest articles on Forem by Philipp (@philipppp15one).</description>
    <link>https://forem.com/philipppp15one</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3904815%2Ff7646ea5-86bb-424e-ab31-f5eb71f6499e.jpeg</url>
      <title>Forem: Philipp</title>
      <link>https://forem.com/philipppp15one</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/philipppp15one"/>
    <language>en</language>
    <item>
      <title>How PP15.ONE became 14x faster than before</title>
      <dc:creator>Philipp</dc:creator>
      <pubDate>Tue, 05 May 2026 08:41:51 +0000</pubDate>
      <link>https://forem.com/philipppp15one/how-pp15one-became-14x-faster-than-before-2120</link>
      <guid>https://forem.com/philipppp15one/how-pp15one-became-14x-faster-than-before-2120</guid>
      <description>&lt;p&gt;A few weeks ago, PP15.ONE was slow. Really slow.&lt;/p&gt;

&lt;p&gt;The main page took almost 13 seconds to load. The map screen took even longer. Google PageSpeed gave the main page a score of 53.&lt;/p&gt;

&lt;p&gt;After a focused performance pass, the same page now scores 92. Page load is under one second. The map loads in one second too.&lt;/p&gt;

&lt;p&gt;That is 14x faster, on the same infrastructure. No upgrade. Just better code.&lt;/p&gt;

&lt;p&gt;Here is what actually moved the needle.&lt;/p&gt;

&lt;p&gt;The biggest win was the map. The old version pulled tiles from one source over one connection. On mobile this meant tiles arrived one at a time. The new version uses a different tile provider spread across four parallel connections. That alone dropped the map load from 13 seconds to 1.&lt;/p&gt;

&lt;p&gt;The second change was switching how the map renders. The old version drew every marker as its own element, which adds up fast with hundreds on screen. The new version paints them all in one pass. Smoother, faster, less work for the browser.&lt;/p&gt;

&lt;p&gt;A small CSS trick helped too: nudging the map onto the GPU. Panning went from a stuttering repaint to a smooth glide.&lt;/p&gt;

&lt;p&gt;The next biggest win was caching. Most files the platform ships never change between visits. But the browser was re-checking them every time. A small config change told the browser to trust those files and skip the check. Repeat visits now load almost everything from local cache.&lt;/p&gt;

&lt;p&gt;Cold starts were the next problem. Even on a paid plan, a server can go cold after a deploy. The first user after that pays a 3 to 5 second tax. Two simple pings — one from the server to itself, one from the browser to the server — keep the connection warm. The first user now sees the same speed as the hundredth.&lt;/p&gt;

&lt;p&gt;The smaller fixes pulled the SEO score from 82 to 91. A clean robots file. A meta description tag that was completely missing. Accessibility fixes for icon buttons and image dimensions.&lt;/p&gt;

&lt;p&gt;The headline number is 14x faster page load. But the most useful one is Total Blocking Time going from 330 milliseconds to zero. That is the gap between the page looking ready and the page responding to taps. Zero means the page feels alive immediately.&lt;/p&gt;

&lt;p&gt;The biggest lesson: performance work is shockingly high-leverage when you actually do it.&lt;/p&gt;

&lt;p&gt;None of these changes took weeks. The map rewrite was one afternoon. The cache fix was ten minutes. The keep-alive pings took twenty.&lt;/p&gt;

&lt;p&gt;Performance work feels expensive because it is invisible until you do it. Nothing in the code complains about a missing config file. No test fails because tiles load slowly. The slowness is just there. It taxes every user. Until someone looks.&lt;/p&gt;

&lt;p&gt;Live: &lt;a href="https://pp15.one" rel="noopener noreferrer"&gt;https://pp15.one&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What would you change? Any feedback welcome.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>performance</category>
      <category>react</category>
      <category>webperf</category>
    </item>
    <item>
      <title>The story behind PP15.ONE — a marketplace where you can collect, build, and trade digital land</title>
      <dc:creator>Philipp</dc:creator>
      <pubDate>Thu, 30 Apr 2026 13:19:23 +0000</pubDate>
      <link>https://forem.com/philipppp15one/the-story-behind-pp15one-a-marketplace-where-you-can-collect-build-and-trade-digital-land-15ld</link>
      <guid>https://forem.com/philipppp15one/the-story-behind-pp15one-a-marketplace-where-you-can-collect-build-and-trade-digital-land-15ld</guid>
      <description>&lt;h2&gt;
  
  
  The Story
&lt;/h2&gt;

&lt;p&gt;Nine months ago I started building PP15.ONE — a marketplace where you &lt;br&gt;
can buy, sell, and trade digital land. Today it's live: three different &lt;br&gt;
market layers, a bonding curve engine running in production, and &lt;br&gt;
Islands going live every week.&lt;/p&gt;

&lt;p&gt;This is the story of how it came together — and what broke along the way.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://pp15.one" rel="noopener noreferrer"&gt;https://pp15.one&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What PP15.ONE Is
&lt;/h2&gt;

&lt;p&gt;PP15.ONE is a marketplace where you can buy, sell, and trade digital &lt;br&gt;
land. You can not only buy, sell, and trade digital land — you can &lt;br&gt;
also build your own digital land (called "Islands") and sell this land &lt;br&gt;
to other users.&lt;/p&gt;

&lt;p&gt;Every Island has a price that moves on a bonding curve. Buys happen on &lt;br&gt;
the Main Market against the platform. Sales happen on the 2nd Market &lt;br&gt;
between users. There's no sell-back to the platform — once you own an &lt;br&gt;
m², you keep it or sell it on the 2nd Market.&lt;/p&gt;

&lt;h2&gt;
  
  
  What PPC Are
&lt;/h2&gt;

&lt;p&gt;PPC are in-app credits used across PP15.ONE. They are not crypto, not &lt;br&gt;
a token, not real money. Just in-app credits with no monetary value &lt;br&gt;
outside the platform.&lt;/p&gt;

&lt;p&gt;You buy m² with PPC. You receive PPC when other users buy from your &lt;br&gt;
Island.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the price works
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Main Market&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A central bonding curve owned by the platform. Every buy moves the &lt;br&gt;
price up by a defined step.&lt;/p&gt;

&lt;p&gt;The price comes down via the 2nd Market. When a seller lists below the &lt;br&gt;
current Main Market price, the system compares the two and subtracts &lt;br&gt;
1% of the difference from the Main Market price.&lt;/p&gt;

&lt;p&gt;Example: Main Market is at 4.80 PPC. A seller lists on the 2nd Market &lt;br&gt;
for 4.00 PPC. The difference is 0.80 PPC, and 1% of that (0.008 PPC) &lt;br&gt;
is subtracted from the Main Market — so it drops from 4.80 to 4.792 PPC.&lt;/p&gt;

&lt;p&gt;The effect is small and gradual. The Main Market stays stable while &lt;br&gt;
still reflecting actual user-to-user activity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Islands (your own land)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Anyone can create their own Island for a one-time fee of 5 PPC. You &lt;br&gt;
set your own bonding curve and a step-up rate (up to 5%) — that's the &lt;br&gt;
percentage the m² price increases per buy, compounded on the current &lt;br&gt;
price.&lt;/p&gt;

&lt;p&gt;Example: Island price is 10 PPC, owner sets 3%.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Buy 1 → 10 + 3% = 10.30 PPC&lt;/li&gt;
&lt;li&gt;Buy 2 → 10.30 + 3% = 10.609 PPC&lt;/li&gt;
&lt;li&gt;Buy 3 → 10.609 + 3% = 10.927 PPC&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The price grows faster as more m² are bought — driven by demand and &lt;br&gt;
the owner's chosen rate.&lt;/p&gt;

&lt;p&gt;When someone sells Island m² on the 2nd Market below the current Island &lt;br&gt;
price, the price drops by a percentage of the difference — scaled by &lt;br&gt;
Island size:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;0–50 m² → 2%&lt;/li&gt;
&lt;li&gt;51–100 m² → 2.5%&lt;/li&gt;
&lt;li&gt;101–200 m² → 2.75%&lt;/li&gt;
&lt;li&gt;201–500 m² → 2.85%&lt;/li&gt;
&lt;li&gt;501–1000 m² → 2.9%&lt;/li&gt;
&lt;li&gt;1001+ m² → 3%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The larger the Island, the stronger the price impact of each sale.&lt;/p&gt;

&lt;p&gt;User Islands max out at 4,000 m². PP15.ONE-owned Islands max out at &lt;br&gt;
10,000 m².&lt;/p&gt;

&lt;p&gt;The Island creator receives 90% of all m² purchases on their Island. &lt;br&gt;
PP15.ONE keeps 10%. The split happens automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2nd Market — user to user&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can list your owned m² for sale at any price you want. Other users &lt;br&gt;
buy directly from you.&lt;/p&gt;

&lt;p&gt;The platform fee is added on top of the listing price — paid by the &lt;br&gt;
buyer, not the seller. Standard m² has a 10% fee, Island m² has a 5% &lt;br&gt;
fee.&lt;/p&gt;

&lt;p&gt;Example: A seller lists m² for 100 PPC. The buyer pays 110 PPC total. &lt;br&gt;
The seller receives 100 PPC, PP15.ONE receives 10 PPC.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a Bonding Curve
&lt;/h2&gt;

&lt;p&gt;Most marketplaces use static pricing or auction mechanics. A bonding &lt;br&gt;
curve creates a smooth, deterministic price function — the price &lt;br&gt;
adjusts in real time based on demand, no orderbooks needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Broke Along the Way
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Bonding curves are easy on paper, hard in production&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The math is simple. The hard part is making sure every state transition &lt;br&gt;
is atomic, rollback-safe, and idempotent. One race condition in the buy &lt;br&gt;
logic can desync the entire curve.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Caching marketplace state is dangerous&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stale data in a marketplace = users buying at outdated prices = chaos. &lt;br&gt;
I had to build a cache layer that invalidates aggressively while keeping &lt;br&gt;
read performance high.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. UX beats engine sophistication&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The bonding curve engine is the easy part. Making it understandable to &lt;br&gt;
a first-time user who has never heard of bonding curves — that takes &lt;br&gt;
the most work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The frontend can DDoS your own backend&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I spent days debugging memory crashes that turned out to be a recursive &lt;br&gt;
setTimeout loop in my landing page polling code. Backend got hit with &lt;br&gt;
40+ requests per second from accumulated polling chains. One line of &lt;br&gt;
code deletion fixed it. Memory dropped from 2GB to 300MB.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solo from Switzerland
&lt;/h2&gt;

&lt;p&gt;Built solo over the past nine months.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://pp15.one" rel="noopener noreferrer"&gt;https://pp15.one&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What would you change? Any feedback welcome.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>typescript</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
