<?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: Lapnito Development studio</title>
    <description>The latest articles on Forem by Lapnito Development studio (@lapnitodevelopment).</description>
    <link>https://forem.com/lapnitodevelopment</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%2F3877182%2F4bc2d686-94d1-4e3c-b558-887cd7d588e3.png</url>
      <title>Forem: Lapnito Development studio</title>
      <link>https://forem.com/lapnitodevelopment</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/lapnitodevelopment"/>
    <language>en</language>
    <item>
      <title>I Built an Offline Compass App That Tells You When Not to Trust It</title>
      <dc:creator>Lapnito Development studio</dc:creator>
      <pubDate>Sun, 19 Apr 2026 18:49:53 +0000</pubDate>
      <link>https://forem.com/lapnitodevelopment/i-built-an-offline-compass-app-that-tells-you-when-not-to-trust-it-32a2</link>
      <guid>https://forem.com/lapnitodevelopment/i-built-an-offline-compass-app-that-tells-you-when-not-to-trust-it-32a2</guid>
      <description>&lt;p&gt;We built &lt;strong&gt;NorthPin&lt;/strong&gt; — a free, offline compass app for Android and iOS that points to true north, flags magnetic interference, and lets you lock a bearing while you walk. No ads, no tracking, no internet required.&lt;/p&gt;

&lt;p&gt;If you've ever watched a compass needle jitter wildly next to a car or near a doorframe and wondered whether you can actually trust it, that's the problem we wanted to solve.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Does It Do?
&lt;/h2&gt;

&lt;p&gt;NorthPin turns the magnetometer in your phone into a reliable navigation instrument. You open it, it shows your heading in 0–360°, and it tells you when the reading is trustworthy and when it isn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;True North with declination&lt;/strong&gt; — corrects the raw magnetic reading to geographic north&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smooth, stable heading&lt;/strong&gt; — filtered readings so the needle doesn't shake at standstill&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Magnetic interference detection&lt;/strong&gt; — warns you when nearby metal, electronics, or magnets are distorting the field&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microtesla (µT) meter&lt;/strong&gt; — shows field strength so you can see &lt;em&gt;why&lt;/em&gt; the reading is off&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guided figure-eight calibration&lt;/strong&gt; — walks you through the sensor calibration motion&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pin Direction&lt;/strong&gt; — lock a bearing and track your deviation from it while walking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shareable diagnostic reports&lt;/strong&gt; — copy the current state for troubleshooting or sharing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No ads, no in-app purchases, no data collected, no network access.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works Under the Hood
&lt;/h2&gt;

&lt;p&gt;Every modern phone has a 3-axis magnetometer — a tiny sensor chip (usually a Hall-effect or magnetoresistive element) that measures the magnetic field along the X, Y, and Z axes. Combined with the accelerometer (for gravity direction) and optionally the gyroscope (for angular velocity), it can compute which way the phone is pointing in the world.&lt;/p&gt;

&lt;p&gt;The heading is the angle between the horizontal component of the magnetic field and magnetic north:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;heading = atan2(Y_horizontal, X_horizontal)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But that gives you &lt;strong&gt;magnetic north&lt;/strong&gt;, not true north. The Earth's magnetic field doesn't align perfectly with the geographic poles — it drifts and varies by location. The difference between them is called magnetic declination.&lt;/p&gt;

&lt;h3&gt;
  
  
  Magnetic Declination
&lt;/h3&gt;

&lt;p&gt;Declination can be anywhere from −20° to +20° depending on where you are on the planet. In central Europe it's around +4° to +6°. In the western United States it can be +10° to +15°. Ignoring declination means your "north" could be a full 15 degrees off — enough to miss a trailhead by hundreds of meters on a long hike.&lt;/p&gt;

&lt;p&gt;NorthPin uses the World Magnetic Model (WMM) to compute declination for a given latitude and longitude, then adjusts the heading:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;true_heading = magnetic_heading + declination
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Interference Problem
&lt;/h3&gt;

&lt;p&gt;The magnetometer is sensitive to any nearby ferrous metal, electric current, or permanent magnet. Car dashboards, metal desks, laptop speakers, even the magnet in a phone case — all distort the field.&lt;/p&gt;

&lt;p&gt;The trick to detecting interference is checking the &lt;strong&gt;total field magnitude&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;|B| = sqrt(Bx² + By² + Bz²)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Earth's magnetic field at the surface is remarkably consistent: roughly 25–65 µT depending on latitude. If your phone suddenly reads 120 µT, you're not in a magnetic anomaly — you're next to a speaker.&lt;/p&gt;

&lt;p&gt;NorthPin continuously monitors |B| and flags readings that fall outside the expected envelope. When interference is detected, the app tells you &lt;em&gt;why&lt;/em&gt; the reading is unreliable instead of silently giving you a wrong direction.&lt;/p&gt;

&lt;h3&gt;
  
  
  Smoothing Without Lagging
&lt;/h3&gt;

&lt;p&gt;Raw magnetometer output is noisy. Naive approaches — "just average the last 10 readings" — work but make the needle feel sluggish. We use a low-pass filter with a dynamic time constant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;heading_smoothed = α × heading_raw + (1 - α) × heading_previous
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;α (alpha) changes based on how much the heading is actually moving. When you're standing still, α is small (heavy smoothing, stable needle). When you rotate the phone, α increases (less smoothing, responsive needle). The result feels instant when you move and rock-steady when you don't.&lt;/p&gt;

&lt;h3&gt;
  
  
  Figure-Eight Calibration
&lt;/h3&gt;

&lt;p&gt;Magnetometers accumulate bias over time. Re-magnetization from nearby magnets, temperature drift, and factory variation all shift the zero point. The fix is to move the phone through multiple orientations so the sensor sees the full 3D sphere of possible readings. The classic motion for this is a figure-eight in the air — it rotates the phone through enough attitudes that the calibration algorithm can re-center the zero.&lt;/p&gt;

&lt;p&gt;NorthPin has a guided calibration flow that tells you when you need to re-calibrate (based on field magnitude drift) and walks you through the motion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pin Direction
&lt;/h2&gt;

&lt;p&gt;The feature we use most often is Pin Direction. You point the phone at a landmark, tap to pin the bearing, and then while walking, the app shows you how far off that bearing you are in real time.&lt;/p&gt;

&lt;p&gt;Practical use cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hiking off-trail and wanting to maintain a consistent direction toward a distant peak&lt;/li&gt;
&lt;li&gt;Returning to camp after a day hike when the landmark is no longer visible&lt;/li&gt;
&lt;li&gt;Cross-country skiing in flat terrain where everything looks the same&lt;/li&gt;
&lt;li&gt;Emergency navigation when a GPS has drained and you still need to get down the mountain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because NorthPin is fully offline, Pin Direction works on airplane mode, in the backcountry with no signal, and in caves or basements where GPS is useless.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why We Built This
&lt;/h2&gt;

&lt;p&gt;We're a small Czech studio (&lt;a href="https://lapnito.cz" rel="noopener noreferrer"&gt;lapnito.cz&lt;/a&gt;) and we hike. A lot. We also noticed that almost every "compass" app on the stores does one of three things: shows ads over your map, demands location permissions it doesn't need, or gives you a single number with no indication of how much to trust it.&lt;/p&gt;

&lt;p&gt;We wanted a tool that behaves like a proper instrument — shows you the reading, shows you the confidence, and gets out of the way. That's NorthPin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Out
&lt;/h2&gt;

&lt;p&gt;NorthPin is free on both platforms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Android:&lt;/strong&gt; &lt;a href="https://play.google.com/store/apps/details?id=com.tomas.northpin_compass" rel="noopener noreferrer"&gt;NorthPin Offline Compass on Google Play&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iOS:&lt;/strong&gt; &lt;a href="https://apps.apple.com/us/app/northpin-true-north-compass/id6759560694" rel="noopener noreferrer"&gt;NorthPin True North Compass on App Store&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://lapnito.cz/northpin_compass" rel="noopener noreferrer"&gt;lapnito.cz/northpin_compass&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Lapnito/northpin-compass" rel="noopener noreferrer"&gt;Lapnito/northpin-compass&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We'd love to hear your feedback — drop a comment or reach us at &lt;a href="mailto:tom@lapnito.cz"&gt;tom@lapnito.cz&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://lapnito.cz" rel="noopener noreferrer"&gt;Lapnito Development Studio&lt;/a&gt; — lightweight tools &amp;amp; utility apps from Czech Republic.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>I Built a Camera Color Picker That Gives You HEX, RGB, HSL &amp; CMYK Instantly</title>
      <dc:creator>Lapnito Development studio</dc:creator>
      <pubDate>Mon, 13 Apr 2026 18:44:18 +0000</pubDate>
      <link>https://forem.com/lapnitodevelopment/i-built-a-camera-color-picker-that-gives-you-hex-rgb-hsl-cmyk-instantly-161o</link>
      <guid>https://forem.com/lapnitodevelopment/i-built-a-camera-color-picker-that-gives-you-hex-rgb-hsl-cmyk-instantly-161o</guid>
      <description>&lt;p&gt;We built &lt;strong&gt;Color Picker: Camera HEX RGB&lt;/strong&gt; — a free, lightweight app that turns your phone camera into a real-time color identification tool. Point, pick, and get instant color codes in HEX, RGB, HSL, or CMYK. Available on both Android and iOS.&lt;/p&gt;

&lt;p&gt;If you've ever tried to match a paint color from a wall, grab a HEX code from a physical product, or just wondered "what color &lt;em&gt;is&lt;/em&gt; that exactly?" — that's the itch we wanted to scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Does It Do?
&lt;/h2&gt;

&lt;p&gt;Color Picker uses your phone's camera to identify colors in real time. A precision crosshair lets you select the exact pixel you want, and the app instantly shows the color value in your preferred format. You can also load any photo from your gallery and tap anywhere to extract colors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live camera color picker&lt;/strong&gt; — real-time crosshair targeting with pixel-level accuracy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Photo color extraction&lt;/strong&gt; — pick colors from any image in your gallery&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Four color formats&lt;/strong&gt; — HEX (&lt;code&gt;#FF5733&lt;/code&gt;), RGB (&lt;code&gt;255, 87, 51&lt;/code&gt;), HSL (&lt;code&gt;11°, 100%, 60%&lt;/code&gt;), CMYK (&lt;code&gt;0%, 66%, 80%, 0%&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Color library&lt;/strong&gt; — save individual colors for later use&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Palette builder&lt;/strong&gt; — create, organize, and manage color palette collections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export&lt;/strong&gt; — share palettes as JSON, CSS variables, or PNG images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dark mode&lt;/strong&gt; with full backup &amp;amp; restore support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No ads, no in-app purchases, works completely offline.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works Under the Hood
&lt;/h2&gt;

&lt;p&gt;The camera preview feeds a continuous stream of pixel data. Each pixel is stored as three 8-bit channels (red, green, blue), giving us values from 0–255. The crosshair maps to a coordinate on the preview frame, and we read the RGB triplet at that exact position.&lt;/p&gt;

&lt;p&gt;The interesting part is the color space conversions. Going from RGB to HEX is trivial — just base-16 encoding:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;R=255 → FF, G=87 → 57, B=51 → 33 → #FF5733
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;HSL conversion is more involved. We first normalize RGB to [0, 1], find the min/max channel values, then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Lightness = (max + min) / 2
Saturation = (max - min) / (1 - |2L - 1|)  
Hue = 60° × sector adjustment based on which channel is max
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CMYK converts to the subtractive model used in print. The key (K) channel is &lt;code&gt;1 - max(R', G', B')&lt;/code&gt;, and C/M/Y are derived from that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;K = 1 - max(R/255, G/255, B/255)
C = (1 - R/255 - K) / (1 - K)
M = (1 - G/255 - K) / (1 - K)  
Y = (1 - B/255 - K) / (1 - K)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The Accuracy Question
&lt;/h3&gt;

&lt;p&gt;Camera sensors don't give you raw light data — they apply white balance, auto-exposure, and gamma correction before the pixel reaches your app. This means captured colors are an approximation of reality, not a spectrophotometric measurement.&lt;/p&gt;

&lt;p&gt;In practice, for typical use cases (design reference, paint matching, palette building), the results are very close to what you see. For critical color work in print production or brand compliance, you'd still want a hardware colorimeter. But for "I need the hex code of this wall color" or "what's the closest CSS color to this fabric?" — the camera does the job.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best results tips:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use natural daylight when possible&lt;/li&gt;
&lt;li&gt;Avoid shadows and reflections on the target surface&lt;/li&gt;
&lt;li&gt;Hold steady — the crosshair reads a single pixel, so small movements matter&lt;/li&gt;
&lt;li&gt;Calibrate your screen brightness to a consistent level&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why We Built This
&lt;/h2&gt;

&lt;p&gt;As a small studio (&lt;a href="https://lapnito.cz" rel="noopener noreferrer"&gt;lapnito.cz&lt;/a&gt;), we bounce between development and design constantly. We kept needing to grab color references from the physical world — a client's business card, a competitor's packaging, the exact shade of a sunset for a splash screen background. Existing color picker apps were either bloated with features we didn't need, covered in ads, or required permissions they shouldn't.&lt;/p&gt;

&lt;p&gt;We wanted something minimal: open, point, copy, done. That's what this is.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Palette Export Feature
&lt;/h2&gt;

&lt;p&gt;One thing we're particularly happy with is the export system. Once you've built a palette, you can export it as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JSON&lt;/strong&gt; — structured data for programmatic use&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSS variables&lt;/strong&gt; — paste directly into your stylesheet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PNG&lt;/strong&gt; — a visual swatch image for sharing in chat or docs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes the handoff from "I found these colors in the real world" to "here they are in my code" as short as possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Out
&lt;/h2&gt;

&lt;p&gt;Color Picker is free on both platforms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Android:&lt;/strong&gt; &lt;a href="https://play.google.com/store/apps/details?id=com.tomas.color_picker" rel="noopener noreferrer"&gt;Color Picker: Camera HEX RGB on Google Play&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iOS:&lt;/strong&gt; &lt;a href="https://apps.apple.com/us/app/color-picker-camera-hex-rgb/id6759371237" rel="noopener noreferrer"&gt;Color Picker Camera: HEX RGB on App Store&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://lapnito.cz/color-picker" rel="noopener noreferrer"&gt;lapnito.cz/color-picker&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Lapnito/color-picker" rel="noopener noreferrer"&gt;Lapnito/color-picker&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Support:&lt;/strong&gt; &lt;a href="https://lapnito.cz/color-picker/support.html" rel="noopener noreferrer"&gt;lapnito.cz/color-picker/support.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We'd love to hear your feedback — drop a comment or reach us at &lt;a href="mailto:tom@lapnito.cz"&gt;tom@lapnito.cz&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built by &lt;a href="https://lapnito.cz" rel="noopener noreferrer"&gt;Lapnito Development Studio&lt;/a&gt; — lightweight tools &amp;amp; utility apps from Czech Republic.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>android</category>
      <category>mobile</category>
      <category>design</category>
    </item>
  </channel>
</rss>
