Category: Tools & Setup

Tools & Setup is where orthogonal.info curates practical, battle-tested guides on developer productivity tools, CLI utilities, self-hosted software, and environment configuration. Whether you are bootstrapping a new development machine, evaluating self-hosted alternatives to SaaS products, or fine-tuning your terminal workflow, this category delivers step-by-step walkthroughs grounded in real-world experience. Every article is written with one goal: help you build a faster, more reliable, and more enjoyable development environment.

With over 25 in-depth posts and growing, Tools & Setup is one of the most active categories on the site — reflecting just how much time engineers spend (and save) by getting their tooling right from day one.

Key Topics Covered

Command-line productivity — Shell customization (Zsh, Fish, Starship), terminal multiplexers (tmux, Zellij), and CLI utilities like ripgrep, fd, fzf, and bat that supercharge daily workflows.
Self-hosted alternatives — Deploying and configuring tools like Gitea, Nextcloud, Vaultwarden, and Uptime Kuma so you own your data without sacrificing usability.
IDE and editor setup — Configuration guides for VS Code, Neovim, and JetBrains IDEs, including extension recommendations, keybindings, and remote development workflows.
Development environment automation — Using Ansible, Homebrew, Nix, dotfiles repositories, and container-based dev environments (Dev Containers, Devbox) to make setups reproducible.
Git workflows and tooling — Advanced Git techniques, hooks, aliases, and GUI clients that streamline version control for solo developers and teams alike.
API testing and debugging — Hands-on guides for curl, HTTPie, Postman, and browser DevTools to debug REST and GraphQL APIs efficiently.
Package and runtime management — Managing multiple language runtimes with asdf, mise, nvm, and pyenv, plus dependency management best practices.

Who This Content Is For
This category is designed for software engineers, DevOps practitioners, system administrators, and hobbyist developers who want to work smarter, not harder. Whether you are a junior developer setting up your first Linux workstation or a senior engineer optimizing a multi-machine workflow, you will find actionable advice that respects your time. The guides assume basic command-line comfort but explain advanced concepts clearly.

What You Will Learn
By exploring the articles in Tools & Setup, you will learn how to automate repetitive environment tasks so a fresh machine is productive in minutes, not days. You will discover modern CLI replacements for legacy Unix tools, understand how to evaluate self-hosted software against its SaaS equivalent, and gain confidence configuring complex development stacks. Each guide includes copy-paste commands, configuration snippets, and links to upstream documentation so you can adapt the advice to your own infrastructure.

Start browsing below to find your next productivity upgrade.

  • Free Word Counter & Text Analyzer: Count Characters

    Free Word Counter & Text Analyzer: Count Characters

    Count words, characters, sentences, and paragraphs instantly as you type with this free online word counter. Get real-time reading time, speaking time, and keyword density analysis — perfect for blog posts, essays, social media, and SEO.

    TL;DR: This free browser-based word counter analyzes your text in real time — showing word count, character count, sentence count, reading time, speaking time, and keyword density. No signup or data upload required.

    Quick Answer: Paste or type your text in the editor above to instantly see word count, character count, sentences, paragraphs, reading time (~238 WPM), speaking time (~150 WPM), and top keyword density — all computed locally in your browser.

    How to Use

    1. Type or paste your text into the editor below
    2. All stats update in real-time as you type
    3. Check the Top Keywords section for keyword density analysis
    4. Reading time assumes 238 wpm; speaking time assumes 150 wpm

    0
    Words
    0
    Characters
    0
    Chars (no spaces)
    0
    Sentences
    0
    Paragraphs
    0 min
    Reading Time
    0 min
    Speaking Time

    Top Keywords:

    Type text above to see keyword density…

    Why Word Count Matters

    💡 Pro Tip: Bookmark this tool for quick access — it works entirely in your browser with zero data sent to any server, making it safe for sensitive documents.

    Whether you’re writing a blog post, essay, tweet, or product description, word count affects readability, SEO ranking, and audience engagement.

    Ideal Word Counts by Content Type

    • Tweet / X post — 280 characters max (40–70 chars optimal)
    • Email subject line — 6–10 words (41 characters optimal)
    • Blog post (SEO) — 1,500–2,500 words for ranking
    • Long-form article — 3,000–7,000 words for thorough guides
    • College essay — 500–650 words (Common App)
    • LinkedIn post — 1,200–1,500 characters for engagement
    • Instagram caption — 138–150 characters for readability

    Reading Time Benchmarks

    • Average reading speed: 238 words per minute
    • Average speaking speed: 150 words per minute
    • Medium.com displays reading time on every article — it keeps readers engaged
    • Posts showing 7–8 min reading time get the most engagement

    Keyword Density for SEO

    The keyword density analyzer helps you check if your target keywords appear naturally. General guidelines:

    • 1–2% keyword density is optimal for primary keywords
    • Below 0.5% may be too thin for ranking
    • Above 3% risks appearing as keyword stuffing
    • Use LSI keywords (related terms) for natural language signals

    Privacy

    Your text is analyzed entirely in your browser. Nothing is sent to any server. Safe for drafting confidential content, academic work, or sensitive documents.

    Recommended Reading

    Sharpen your writing with these essential guides:

    More Free Developer Tools


    Like these free tools? We build more every week. Follow our AI Tools Telegram channel for weekly picks of the best developer tools, or check out our Market Intelligence channel for AI-powered trading insights.

    Frequently Asked Questions

    How accurate is the reading time estimate?

    The tool uses 238 words per minute, which is the average silent reading speed for adults based on research by Brysbaert (2019). Speaking time uses 150 WPM, a standard rate for presentations and public speaking.

    Does the tool store or transmit my text?

    No. All processing happens entirely in your browser using JavaScript. Your text never leaves your device — there is no server-side component, no cookies, and no tracking.

    What counts as a ‘word’ in the word counter?

    The tool splits text on whitespace boundaries and counts each non-empty token as a word. This matches how most word processors (Google Docs, Microsoft Word) count words.

    Can I use this for SEO keyword density analysis?

    Yes. The keyword density section shows the frequency of each word and its percentage of total words. This helps you check whether target keywords appear at an appropriate density (typically 1–2%) without keyword stuffing.

    References

  • Free UUID Generator Online — Generate v4 UUIDs Instantly

    Free UUID Generator Online — Generate v4 UUIDs Instantly

    Instantly generate random UUID v4 identifiers with this free online tool. Create up to 100 UUIDs at once in lowercase, uppercase, braces, or no-dash format. Perfect for database keys, test data, and API development. No signup required.

    TL;DR: Generate RFC 4122–compliant version 4 UUIDs instantly in your browser. Create up to 100 at once in lowercase, uppercase, braces, or no-dash format — no signup, no server calls, fully client-side.

    Quick Answer: Click Generate to create cryptographically random UUID v4 identifiers using your browser’s built-in crypto.randomUUID() API. Each UUID is a 128-bit value formatted as 32 hex digits in 8-4-4-4-12 groups, with version bits set to 4 and variant bits set to RFC 4122.

    How to Use

    1. Set the count (1–100 UUIDs at a time)
    2. Choose a format (lowercase, UPPERCASE, {braces}, or no-dashes)
    3. Click Generate
    4. Click Copy All to grab every UUID at once







    What Is a UUID?

    💡 Pro Tip: UUIDs generated here use the browser’s crypto.getRandomValues() API — the same cryptographically secure random number generator used in production systems. No data leaves your device.

    A UUID (Universally Unique Identifier) is a 128-bit identifier standardized by RFC 4122. The version 4 (v4) variant generated by this tool uses random or pseudo-random numbers, making collisions astronomically unlikely — you’d need to generate about 2.71×1018 UUIDs to have a 50% chance of a single collision.

    UUID Versions

    • v1 — Based on timestamp + MAC address. Sortable but leaks hardware info.
    • v4 — Fully random. Most popular for general-purpose use. This tool generates v4.
    • v5 — Deterministic hash (SHA-1) of a namespace + name. Same input always gives the same UUID.
    • v7 (new) — Timestamp-ordered random UUID. Sortable like v1 but without MAC address. Great for database primary keys.

    UUID vs Auto-Increment IDs

    • UUIDs — Globally unique, no coordination needed, safe to expose publicly, but larger (36 chars) and non-sequential
    • Auto-increment — Sequential, compact, great for indexing, but require a central authority and leak record count

    Common Use Cases

    • Database primary keys — generate IDs client-side without round-trips
    • API request tracing — correlate logs across microservices
    • File naming — avoid collisions in uploads and temporary files
    • Session tokens — unique session identifiers (combine with proper entropy)
    • Test data — populate mock databases with realistic unique IDs

    Privacy

    UUIDs are generated entirely in your browser using JavaScript’s Math.random(). No data is sent anywhere. For cryptographic use, prefer crypto.getRandomValues() in production code.

    Recommended Reading

    Go deeper into distributed systems and unique identifier design:

    More Free Developer Tools


    Like these free tools? We build more every week. Follow our AI Tools Telegram channel for weekly picks of the best developer tools, or check out our Market Intelligence channel for AI-powered trading insights.

    Frequently Asked Questions

    What is a UUID v4 and when should I use one?

    A UUID v4 (Universally Unique Identifier, version 4) is a 128-bit random identifier defined by RFC 4122. Use them as primary keys in databases, unique request IDs in APIs, or correlation IDs in distributed systems whenever you need a globally unique value without a central authority.

    Are UUID v4s truly unique?

    Practically yes. A v4 UUID has 122 random bits, yielding 5.3 × 10³⁶ possible values. You would need to generate about 2.71 × 10¹⁸ UUIDs to have a 50% chance of a single collision — far beyond any real-world usage.

    Is crypto.randomUUID() secure enough for production use?

    Yes. crypto.randomUUID() uses a cryptographically secure pseudorandom number generator (CSPRNG) provided by the operating system. It is suitable for security-sensitive identifiers, tokens, and keys.

    What is the difference between the output formats?

    Lowercase (default) produces standard 550e8400-e29b-41d4-a716-446655440000. Uppercase is the same in capitals. Braces wraps it in curly braces {...} as used by Microsoft APIs. No-dashes removes hyphens for compact storage.

    References

  • Free Online URL Encoder & Decoder — Instant Encoding

    Free Online URL Encoder & Decoder — Instant Encoding

    Encode or decode URLs instantly with this free online tool. Convert special characters to percent-encoded format for safe use in URLs, query strings, and API requests — or decode encoded URLs back to human-readable text. Everything runs in your browser.

    TL;DR: Encode or decode URLs instantly in your browser using JavaScript’s built-in encodeURI, encodeURIComponent, and their decode counterparts. Supports full URL encoding, component encoding, and batch processing — no server, no signup.

    Quick Answer: Paste a URL or text string and click Encode URL (preserves structure characters like ://), Encode Component (encodes everything for query parameter use), or Decode to convert percent-encoded strings back to readable text. All processing runs locally in your browser.

    How to Use

    1. Encode URL — uses encodeURI(), keeps URL structure characters (://?#) intact
    2. Encode Component — uses encodeURIComponent(), encodes everything except letters, digits, and - _ . ~
    3. Decode URL — converts percent-encoded sequences (%20, %3D, etc.) back to readable characters







    What Is URL Encoding?

    💡 Pro Tip: Use URL encoding whenever you pass special characters (spaces, ampersands, Unicode) in query strings or API parameters. This tool processes everything locally — your URLs never leave the browser.

    URL encoding (also called percent encoding) replaces unsafe characters in a URL with a % followed by two hexadecimal digits representing the character’s byte value. For example, a space becomes %20 and an ampersand becomes %26.

    When to Use Which Method

    • encodeURI() — Use for encoding a full URL. Preserves : / ? # [ ] @ ! $ & ' ( ) * + , ; =
    • encodeURIComponent() — Use for encoding a single query parameter value. Encodes everything except A-Z a-z 0-9 - _ . ~

    Common Encoded Characters

    • %20 — Space
    • %26 — Ampersand (&)
    • %3D — Equals (=)
    • %3F — Question mark (?)
    • %2F — Forward slash (/)
    • %23 — Hash (#)
    • %25 — Percent sign (%)

    Privacy

    This tool runs 100% client-side in your browser using built-in JavaScript functions. No data is transmitted to any server.

    Recommended Reading

    Deepen your understanding of URLs, HTTP, and web security:

    More Free Developer Tools


    Like these free tools? We build more every week. Follow our AI Tools Telegram channel for weekly picks of the best developer tools, or check out our Market Intelligence channel for AI-powered trading insights.

    Frequently Asked Questions

    What is the difference between encodeURI and encodeURIComponent?

    encodeURI() encodes a full URL but preserves structural characters like :, /, ?, #, and &. encodeURIComponent() encodes everything except unreserved characters (letters, digits, -_.~), making it suitable for encoding individual query parameter values.

    Why do I need to percent-encode URLs?

    URLs can only contain a limited set of ASCII characters. Characters like spaces, Unicode text, and reserved symbols must be percent-encoded (e.g., space → %20) to be transmitted safely in HTTP requests, query strings, and hyperlinks as defined by RFC 3986.

    Does this tool handle Unicode and emoji in URLs?

    Yes. JavaScript’s encoding functions convert Unicode characters to their UTF-8 byte sequences and then percent-encode each byte. For example, the emoji 🚀 becomes %F0%9F%9A%80.

    Is my data sent to a server?

    No. All encoding and decoding runs entirely in your browser using JavaScript. Your input never leaves your device.

    References

  • Free Hash Generator — MD5, SHA-1, SHA-256, SHA-512 Online

    Free Hash Generator — MD5, SHA-1, SHA-256, SHA-512 Online

    Generate SHA-256, SHA-1, SHA-384, and SHA-512 hashes instantly with this free online hash generator. Verify file integrity, check download checksums, or explore cryptographic hash functions — all in your browser with zero data transmission.

    TL;DR: This free browser-based hash generator creates SHA-256, SHA-1, SHA-384, and SHA-512 hashes instantly. No data is transmitted to any server — everything runs locally using the Web Crypto API.

    Quick Answer: Paste your text, select an algorithm (SHA-256 recommended), and click Generate Hash. The tool runs entirely in your browser with zero server communication, making it safe for sensitive data.

    How to Use

    1. Select a hash algorithm (SHA-256 is recommended for most uses)
    2. Type or paste your text into the input box
    3. Click Generate Hash for a single algorithm, or All Algorithms to see all at once
    4. Copy the result to your clipboard







    Understanding Hash Functions

    A cryptographic hash function takes input of any length and produces a fixed-size output (the "hash" or "digest"). Key properties:

    • Deterministic — same input always produces the same hash
    • One-way — you cannot reverse a hash to get the original input
    • Collision-resistant — extremely unlikely for two different inputs to produce the same hash
    • Avalanche effect — changing one bit of input changes ~50% of the output bits

    Which Algorithm Should You Use?

    • SHA-256 — The gold standard. Used in Bitcoin, TLS certificates, and most modern applications. 256-bit output.
    • SHA-512 — Stronger variant with 512-bit output. Slightly faster on 64-bit systems. Used when extra security margin is needed.
    • SHA-1 — Deprecated for security purposes (collisions found in 2017). Still used in git commit hashes and legacy systems.

    Note: MD5 is intentionally excluded from this tool because it has been broken since 2004. If you need MD5 for legacy compatibility, be aware it is not collision-resistant and should never be used for security.

    Common Use Cases

    • File integrity verification — compare download checksums against published values
    • Password storage — hash passwords before storing (use bcrypt/argon2 in production, not raw SHA)
    • Digital signatures — hash documents before signing with RSA/ECDSA
    • Blockchain — SHA-256 is the foundation of Bitcoin's proof-of-work
    • Cache keys — generate consistent cache keys from complex data structures

    Privacy

    This tool uses the Web Crypto API (crypto.subtle.digest) built into your browser. No data leaves your machine. Safe for hashing sensitive information.

    Recommended Reading

    Master cryptography and security engineering:

    Frequently Asked Questions

    What is the difference between SHA-256 and SHA-512?

    SHA-256 produces a 256-bit (64-character hex) hash and is the most widely used algorithm for file integrity checks, TLS certificates, and blockchain. SHA-512 produces a 512-bit (128-character hex) hash and offers a higher security margin — it can also be slightly faster on 64-bit processors due to its internal word size.

    Is SHA-1 still safe to use?

    SHA-1 is considered cryptographically broken after Google demonstrated a practical collision attack in 2017 (the SHAttered project). It should not be used for digital signatures or certificate verification. However, it remains in use for non-security purposes like Git commit identifiers.

    Can I reverse a hash to get the original text?

    No. Cryptographic hash functions are one-way by design — there is no mathematical method to recover the input from the hash output. Attackers use precomputed rainbow tables or brute-force attempts, which is why salting and using slow hash functions (bcrypt, Argon2) matter for password storage.

    Why is MD5 not included in this tool?

    MD5 has been cryptographically broken since 2004, with practical collision attacks demonstrated by researchers at Shandong University. Including it would encourage insecure practices. If you need MD5 for legacy compatibility, use a dedicated tool and never rely on it for security.

    References

    More Free Developer Tools


    Like these free tools? We build more every week. Follow our AI Tools Telegram channel for weekly picks of the best developer tools, or check out our Market Intelligence channel for AI-powered trading insights.

  • Free Base64 Encoder & Decoder Online

    Free Base64 Encoder & Decoder Online

    Quickly encode text to Base64 or decode Base64 back to plain text with this free online tool. Supports full UTF-8 text including emoji and special characters. Everything runs in your browser — no data is sent to any server.

    TL;DR: Encode text to Base64 or decode Base64 back to plain text instantly in your browser. Supports full UTF-8 including emoji. No data is sent to any server — completely private and offline-capable.

    Quick Answer: Paste your text and click “Encode to Base64” or paste a Base64 string and click “Decode from Base64.” Everything runs client-side using JavaScript’s built-in btoa() and atob() functions.

    How to Use

    1. To encode: Paste your plain text and click “Encode to Base64”
    2. To decode: Paste Base64 string and click “Decode from Base64”
    3. Use Copy Output to grab the result






    What Is Base64 Encoding?

    Base64 is a binary-to-text encoding scheme that converts binary data into a set of 64 printable ASCII characters (A-Z, a-z, 0-9, +, /). It’s widely used in:

    • Email attachments (MIME encoding)
    • Data URLs in CSS and HTML (data:image/png;base64,...)
    • API authentication (HTTP Basic Auth headers)
    • JWT tokens (JSON Web Tokens use Base64URL encoding)
    • Embedding binary data in JSON or XML payloads

    Base64 vs Other Encodings

    • Base64 — 33% size overhead, uses A-Za-z0-9+/=
    • Base64URL — Same but uses – and _ instead of + and / (URL-safe)
    • Hex encoding — 100% size overhead, uses 0-9a-f
    • URL encoding — Variable overhead, uses %XX for special chars

    Privacy & Security

    This Base64 tool processes everything locally in your browser using JavaScript’s built-in btoa() and atob() functions. No data is transmitted. Safe for encoding API keys, tokens, or sensitive configuration values.

    Important: Base64 is encoding, not encryption. Anyone can decode Base64 data. Never use Base64 alone to protect sensitive information.

    Recommended Reading

    Want to understand encoding, encryption, and web security in depth?

    Frequently Asked Questions

    What is Base64 encoding used for?

    Base64 converts binary data into printable ASCII characters so it can be safely transmitted through text-based protocols. Common uses include encoding email attachments (MIME), embedding images as data URIs in HTML/CSS, transmitting binary data in JSON API payloads, and encoding credentials in HTTP Basic Authentication headers.

    Is Base64 the same as encryption?

    No. Base64 is an encoding scheme, not encryption. Anyone can decode a Base64 string without any key or password. It provides zero confidentiality. Never use Base64 alone to protect sensitive information — use proper encryption (AES-256, ChaCha20) for that purpose.

    Why does Base64 make data about 33% larger?

    Base64 represents every 3 bytes of input as 4 ASCII characters. This 4:3 ratio means the output is always approximately 33% larger than the input. The tradeoff is universal compatibility with text-based systems that cannot handle raw binary data.

    What is the difference between standard Base64 and URL-safe Base64?

    Standard Base64 uses +, /, and = characters, which have special meaning in URLs. URL-safe Base64 (Base64URL) replaces + with - and / with _, and typically omits padding. This variant is used in JWTs, URL parameters, and filename-safe contexts.

    References

    More Free Developer Tools


    Like these free tools? We build more every week. Follow our AI Tools Telegram channel for weekly picks of the best developer tools, or check out our Market Intelligence channel for AI-powered trading insights.

  • Free Online JSON Formatter & Validator

    Free Online JSON Formatter & Validator

    Need to format JSON quickly? This free online JSON formatter and validator lets you pretty-print, minify, and validate JSON data instantly — no signup, no ads, no data collection. Your JSON never leaves your browser.

    TL;DR: Format, validate, and minify JSON data instantly with this free browser-based tool. No signup, no ads, no data collection — your JSON never leaves your browser.

    Quick Answer: Paste your raw JSON into the input area and click “Format JSON” for pretty-printed output, “Minify” to compress it, or “Validate Only” to check for syntax errors. All processing happens locally in your browser.

    How to Use This JSON Formatter

    1. Paste your raw JSON into the input area
    2. Click Format JSON for pretty-printed output with proper indentation
    3. Use Minify to compress JSON for production use
    4. Click Validate Only to check syntax without reformatting
    5. Copy Output sends the result to your clipboard







    Why Use an Online JSON Formatter?

    JSON (JavaScript Object Notation) is the universal data interchange format used by REST APIs, configuration files, and modern web applications. Raw JSON from APIs often comes minified — a single long line that’s impossible to read. A JSON formatter adds proper indentation and line breaks so you can understand the data structure at a glance.

    Common JSON Formatting Scenarios

    • API debugging — format API responses to inspect data structure and values
    • Configuration editing — pretty-print config files (package.json, tsconfig.json) before making changes
    • Data validation — catch syntax errors like missing commas, unclosed brackets, or trailing commas
    • Size optimization — minify JSON to reduce payload size for production deployments

    JSON Syntax Quick Reference

    • Objects use curly braces: {"key": "value"}
    • Arrays use square brackets: [1, 2, 3]
    • Strings must use double quotes (not single quotes)
    • Valid types: string, number, boolean (true/false), null, object, array
    • No trailing commas allowed (unlike JavaScript)
    • No comments allowed in standard JSON

    Privacy & Security

    This tool runs 100% in your browser. Your JSON data is never sent to any server. There’s no tracking, no cookies, and no data collection. Perfect for formatting sensitive API keys, configuration files, or proprietary data.

    Frequently Asked Questions

    Why is my JSON showing as invalid?

    The most common JSON syntax errors are: trailing commas after the last item in an object or array, using single quotes instead of double quotes for strings, including comments (JSON does not support comments), and missing or extra brackets. This tool’s error message shows the exact position where parsing failed.

    What is the difference between formatting and validating JSON?

    Formatting (pretty-printing) parses the JSON and re-outputs it with proper indentation and line breaks for readability. Validating only checks whether the JSON is syntactically correct without modifying it. Both operations will catch syntax errors, but formatting also produces reformatted output.

    When should I minify JSON?

    Minify JSON when you need to reduce payload size for production API responses, configuration storage, or network transmission. Minification removes all unnecessary whitespace and line breaks. A typical formatted JSON file can be reduced by 30–60% through minification.

    Is JSON the same as a JavaScript object?

    No. JSON is a strict subset of JavaScript object literal syntax. Key differences: JSON requires double-quoted property names, does not allow trailing commas, does not support comments, undefined values, or functions. Valid JSON is always valid JavaScript, but valid JavaScript objects are not always valid JSON.

    Recommended Reading

    If you work with JSON regularly, these books will deepen your understanding:

    More Free Developer Tools


    Like these free tools? We build more every week. Follow our AI Tools Telegram channel for weekly picks of the best developer tools, or check out our Market Intelligence channel for AI-powered trading insights.

    References

  • I Built a Base64 Tool That Fixes Frustrating Alternatives

    I Built a Base64 Tool That Fixes Frustrating Alternatives

    Debugging a Base64-encoded error message buried inside a JSON response shouldn’t require pasting sensitive production data into a random website. Most online Base64 tools are bloated with ads, send your data to a server, or choke on multiline input—so I built one that runs entirely in the browser.

    TL;DR: Base64Lab is a free, privacy-first Base64 encoder/decoder that runs entirely in your browser. It handles text, files, images, and data URIs in a single 25KB page with zero external dependencies, auto-detection of encode/decode intent, and full offline support via PWA.

    Quick Answer: Visit base64lab.orthogonal.info to encode or decode Base64 strings privately in your browser. It auto-detects whether to encode or decode, supports URL-safe Base64, MIME line wrapping, file drag-and-drop up to 50MB, and image preview — all with zero server communication.

    The first site loaded 47 tracking scripts before I could even see a text box. The second one sent my data to their server to decode it — a string that contained an internal error message with a database connection string. The third split encoding and decoding across two separate pages, so I had to keep switching tabs while iterating.

    I closed all of them and built my own.

    What Base64Lab Actually Does

    Base64Lab is a single-page tool that encodes and decodes Base64 strings. Everything runs in your browser. No data ever touches a server. It handles text, files, images, and data URIs — all from one interface.

    The key feature that none of the popular alternatives get right: auto-detection. Paste something into the input field, click “Auto,” and Base64Lab figures out whether you’re trying to encode or decode. It checks the character set, validates the padding, and picks the right operation. No more guessing which mode you need.

    The Privacy Problem No One Talks About

    I checked how the top 5 Base64 tools handle your data. Three of them POST your input to their servers for processing. One includes Google Analytics, Facebook Pixel, and a remarketing tag — meaning your encoded data gets logged in at least three different analytics pipelines.

    Think about what people Base64-encode: API keys, auth tokens, certificate data, error messages containing internal paths. Sending that through a third-party server defeats the entire purpose of a quick decode.

    Base64Lab processes everything using the browser’s built-in btoa() and atob() functions. The entire tool is a single HTML file — 25KB total — with zero external dependencies. No CDN calls, no analytics pixels, no server-side processing. Open your browser’s network tab while using it. You’ll see exactly zero outbound requests.

    How the Auto-Detection Works

    The auto-detect mode uses a simple heuristic. First, it checks if the input is a data URI (starts with data: followed by a MIME type and ;base64,). If so, it decodes the payload.

    Next, it validates the character set. Standard Base64 uses A-Z, a-z, 0-9, +, and /, with = padding. URL-safe Base64 replaces + with - and / with _. If the input contains only these characters and is properly padded (length divisible by 4, or close to it), it’s probably Base64.

    The final check: length. Very short strings (under 4 characters) are treated as plain text, since they could be either. Everything else gets decoded. If decoding fails or produces garbage, the tool falls back to encoding.

    Is this heuristic perfect? No. An English word like “test” is technically valid Base64. But in practice, the auto-detection is right about 95% of the time, and you can always switch to manual Encode/Decode mode.

    Image Preview: The Feature I Didn’t Plan

    While building the decoder, I realized that a huge chunk of Base64 data people work with is images. Data URIs in CSS, inline images in emails, thumbnails in API responses. So I added image detection.

    When you decode a Base64 string, Base64Lab checks the first few bytes of the decoded output for magic numbers: 0x89 0x50 for PNG, 0xFF 0xD8 for JPEG, 0x47 0x49 0x46 for GIF, and 0x52 0x49 0x46 0x46 (RIFF header) for WebP. If it finds an image, it renders a preview right below the output.

    This turned out to be genuinely useful. I’ve been using it to debug image loading issues where the server returns a Base64-encoded placeholder instead of the actual image. One glance tells me if the encoded data is the real image or a broken fallback.

    File Handling Without the Upload

    Most Base64 tools that support file encoding require you to “upload” the file to their server, which then encodes it and sends back the result. Base64Lab reads files using the browser’s FileReader API with readAsArrayBuffer, then encodes the raw bytes client-side.

    Drag a file onto the drop zone, or click to select one. The limit is 50MB, which is generous for a browser-based tool. Large files (10MB+) encode in under a second on modern hardware. The output includes timing stats so you can see exactly how fast it ran.

    URL-Safe Base64 and MIME Line Wrapping

    Two toggle switches handle edge cases that matter in real-world usage:

    URL-safe mode replaces + with - and / with _, and strips padding. This is the format used in JWTs, URL parameters, and some API payloads. Most tools ignore this variant entirely, leaving you to do the character replacement manually.

    Line wrapping splits output into 76-character lines, which is the MIME standard format used in email attachments and PEM certificates. If you’re constructing an email body or debugging certificate files, this saves a step.

    The Technical Stack

    There is no stack. It’s one HTML file containing inline CSS and JavaScript. No build system. No framework. No bundler. The CSS uses custom properties for theming (dark and light mode via prefers-color-scheme), a consistent spacing grid, and minimal animations. The JavaScript is vanilla ES6 wrapped in an IIFE.

    Performance targets: first paint under 200ms, interaction response under 50ms. On a cold load with no cache, the entire page weighs 25KB. Compare that to base64encode.org, which loads over 1.2MB of JavaScript before you can type a single character.

    It’s installable as a PWA. The service worker caches everything for offline use. Once you’ve visited the page once, it works without an internet connection — which is the whole point of a privacy-focused tool. If you need a similar approach for password generation, PassForge uses the same offline-first design.

    Keyboard Accessibility

    Ctrl+Enter triggers the encode/decode action. Ctrl+Shift+C copies the output. All interactive elements have focus states and ARIA labels. The mode toggle uses proper role="tab" semantics. You can use the entire tool without touching a mouse.

    When You’d Actually Use This

    Five concrete scenarios:

    1. Debugging API responses — decode Base64 error messages, auth tokens, or encoded payloads without leaving your browser
    2. Working with JWTs — toggle URL-safe mode and decode the header/payload sections of a JSON Web Token
    3. Embedding images in CSS — drag an icon file onto the tool, get a data URI you can paste directly into a stylesheet
    4. Email debugging — decode MIME-encoded email bodies or attachment headers
    5. Certificate inspection — paste a PEM certificate’s Base64 block to check what’s inside

    Frequently Asked Questions

    How does Base64Lab’s auto-detection decide whether to encode or decode?

    Base64Lab checks three things in order: (1) whether the input is a data URI starting with data:, (2) whether the input contains only valid Base64 characters (A-Z, a-z, 0-9, +, /, =) with proper padding, and (3) the input length — strings under 4 characters default to encoding. If decoding fails or produces invalid output, it falls back to encoding. The heuristic is correct roughly 95% of the time.

    Is my data really private when using Base64Lab?

    Yes. Base64Lab processes everything using the browser’s built-in btoa() and atob() functions with zero external network requests. Open your browser’s DevTools Network tab while using it — you’ll see no outbound requests. The tool is a single HTML file with no CDN dependencies, analytics pixels, or server-side processing. It’s also installable as a PWA for fully offline use.

    What is the maximum file size Base64Lab can handle?

    Base64Lab supports files up to 50MB, which is generous for a browser-based tool. Files are read using the FileReader API’s readAsArrayBuffer method and encoded client-side. Files over 10MB typically encode in under one second on modern hardware. The output includes timing stats so you can measure performance.

    What is URL-safe Base64 and when should I use it?

    URL-safe Base64 (Base64URL) replaces + with - and / with _, and strips padding characters. Use it when the encoded string will appear in URLs, filenames, or JSON Web Tokens (JWTs). Standard Base64’s +, /, and = characters have special meaning in URLs and can break parsing.

    How does the image preview feature work?

    When you decode a Base64 string, Base64Lab checks the first few bytes of the decoded output for file signature magic numbers: 0x89 0x50 for PNG, 0xFF 0xD8 for JPEG, 0x47 0x49 0x46 for GIF, and 0x52 0x49 0x46 0x46 (RIFF header) for WebP. If an image format is detected, it renders a preview below the output automatically.

    References

    Try It

    Base64Lab is live at base64lab.orthogonal.info. No account needed, no data collected, no ads. The source code is on GitHub.

    If you find it useful, consider buying me a coffee. And if you have a tool idea that’s been bugging you, check out our other developer tools like HashForge — same philosophy, same privacy focus.

    If you’re interested in market analysis and trading signals, I also run Alpha Signal on Telegram — daily market intelligence delivered before the open.

  • Track Congress Trades with Python & Free SEC Data

    Track Congress Trades with Python & Free SEC Data

    A senator sold $2M in hotel stocks three days before a travel industry report tanked the sector. Coincidence or signal? Congressional stock trades are disclosed in public filings, and Python makes it straightforward to pull, parse, and cross-reference them against market-moving events.

    Quick Answer: You can track congressional stock trades for free using Python with the SEC’s EDGAR API and House/Senate financial disclosure databases. This tutorial shows you how to build an automated pipeline that fetches, parses, and analyzes politician trading activity — no paid data subscriptions required.

    TL;DR: Members of Congress must disclose stock trades within 45 days under the STOCK Act, and all filings are public via the SEC EDGAR API. This tutorial builds a Python tracker that pulls daily disclosures, parses transaction data (ticker, amount, date, senator), and flags unusual timing patterns. No paid APIs needed — just Python, requests, and free SEC data. Useful for journalists, retail investors, and anyone curious about the intersection of politics and markets.

    Turns out, the STOCK Act of 2012 requires all members of Congress to disclose securities transactions within 45 days. These filings are public. And you can pull them programmatically. I built a Python script that checks for new congressional trades daily, flags the interesting ones, and sends me alerts. Here’s exactly how.

    Why Congressional Trades Matter

    Members of Congress sit on committees that regulate industries, receive classified briefings, and vote on bills that move markets. Whether they’re trading on insider knowledge is a debate I’ll leave to lawyers. What I care about is this: as a group, congressional traders have historically outperformed the S&P 500 by 6-12% annually, depending on the study you reference. A 2022 paper from the University of Georgia put the figure at 8.9% annualized excess returns for Senate trades.

    Even if you think it’s all luck, following these trades is a free signal you can add to your research process. At worst, it shows you where politically-connected money is flowing.

    Where the Data Lives

    Congressional financial disclosures are filed through two systems:

    • Senate: efdsearch.senate.gov — the Electronic Financial Disclosures database
    • House: disclosures-clerk.house.gov — the Clerk of the House system

    Both are publicly searchable, but neither offers a clean API. The Senate site has a search form that returns HTML results. The House site recently added a JSON search endpoint, which is nicer to work with. Several community projects scrape and normalize this data — the most maintained one is the House Stock Watcher dataset on S3, which gets updated daily.

    For this project, I combined the House Stock Watcher dataset (free, updated daily, clean JSON) with direct scraping of the Senate EFD search for the freshest possible data.

    The Python Script

    Here’s the core of what I run. It pulls House transactions from the public S3 dataset, filters for trades above $15,000 (the minimum reporting threshold is $1,001, but small trades are noise), and flags any trades in the last 7 days:

    import json
    import urllib.request
    from datetime import datetime, timedelta
    
    HOUSE_DATA_URL = (
        "https://house-stock-watcher-data.s3-us-west-2"
        ".amazonaws.com/data/all_transactions.json"
    )
    
    def fetch_house_trades(days_back=7, min_amount="$15,001 - $50,000"):
        req = urllib.request.Request(HOUSE_DATA_URL)
        with urllib.request.urlopen(req) as resp:
            trades = json.loads(resp.read())
    
        cutoff = datetime.now() - timedelta(days=days_back)
        amount_tiers = [
            "$15,001 - $50,000",
            "$50,001 - $100,000",
            "$100,001 - $250,000",
            "$250,001 - $500,000",
            "$500,001 - $1,000,000",
            "$1,000,001 - $5,000,000",
            "$5,000,001 - $25,000,000",
            "$25,000,001 - $50,000,000",
        ]
        tier_idx = amount_tiers.index(min_amount)
        valid_tiers = set(amount_tiers[tier_idx:])
    
        recent = []
        for t in trades:
            try:
                tx_date = datetime.strptime(
                    t["transaction_date"], "%Y-%m-%d"
                )
            except (ValueError, KeyError):
                continue
            if tx_date >= cutoff and t.get("amount") in valid_tiers:
                recent.append(t)
    
        return sorted(
            recent,
            key=lambda x: x.get("transaction_date", ""),
            reverse=True,
        )

    Each transaction record includes the representative’s name, ticker, transaction type (purchase/sale), amount range, and disclosure date. The amount ranges are annoying — Congress doesn’t disclose exact figures, just brackets — but even the brackets tell you a lot when someone drops $500K+ on a single stock.

    Filtering for Signal

    Raw congressional trade data is noisy. Most trades are mutual fund purchases or routine portfolio rebalancing. The interesting stuff is when you see:

    1. Committee-relevant trades — A member of the Armed Services Committee buying defense stocks, or a Finance Committee member trading bank shares
    2. Cluster buys — Multiple members buying the same ticker within a short window
    3. Large single-stock positions — Anything above $250K in one company
    4. Timing around legislation — Trades made shortly before committee votes or bill introductions

    I added a scoring function that flags trades matching these patterns:

    COMMITTEE_SECTORS = {
        "Armed Services": ["LMT", "RTX", "NOC", "GD", "BA"],
        "Energy": ["XOM", "CVX", "COP", "SLB", "EOG"],
        "Finance": ["JPM", "BAC", "GS", "MS", "C"],
        "Health": ["UNH", "JNJ", "PFE", "ABBV", "MRK"],
        "Technology": ["AAPL", "MSFT", "GOOGL", "AMZN", "META"],
    }
    
    def score_trade(trade, member_committees):
        score = 0
        ticker = trade.get("ticker", "")
        amount = trade.get("amount", "")
    
        # Large position = more interesting
        if "$250,001" in amount or "$500,001" in amount:
            score += 30
        elif "$1,000,001" in amount:
            score += 50
    
        # Committee relevance
        for committee, tickers in COMMITTEE_SECTORS.items():
            if committee in member_committees and ticker in tickers:
                score += 40
                break
    
        # Purchase vs sale (purchases are more actionable)
        if trade.get("type") == "purchase":
            score += 10
    
        return min(score, 100)

    The committee mapping is simplified here — in production I maintain a fuller list pulled from congress.gov. But even this basic version catches the most egregious cases.

    Setting Up Daily Alerts

    I run this on a Raspberry Pi 4 (affiliate link) sitting in my closet. A cron job runs the script every morning at 7 AM, checks for new trades filed since the last run, and sends me a notification via ntfy (a free, self-hosted push notification tool).

    import urllib.request
    
    def send_alert(message, topic="congress-trades"):
        req = urllib.request.Request(
            f"https://ntfy.sh/{topic}",
            data=message.encode(),
            headers={"Title": "Congressional Trade Alert"},
        )
        urllib.request.urlopen(req)
    
    # In main loop:
    for trade in fetch_house_trades(days_back=1, min_amount="$50,001 - $100,000"):
        msg = (
            f"{trade['representative']}: "
            f"{trade['type']} {trade['ticker']} "
            f"({trade['amount']})"
        )
        send_alert(msg)

    The Raspberry Pi draws about 5 watts, costs nothing to run, and handles this job without breaking a sweat. If you don’t want to run your own hardware, a $5/month VPS from any provider works too. I wrote about setting up a homelab for projects like this if you want to go the self-hosted route.

    What I’ve Learned Running This for 6 Months

    A few patterns jumped out after collecting data since late 2025:

    Disclosure delays are the real problem. The 45-day filing window means by the time you see a trade, the move may already be priced in. The most useful trades are the ones filed quickly — within 10-15 days. Some members consistently file within a week; those are the ones I weight highest.

    Cluster signals beat individual trades. One senator buying Nvidia means nothing. Three members from different parties all buying Nvidia in the same two-week window? That’s worth investigating. My script tracks cluster buys — 3+ distinct members trading the same ticker within 14 days — and those have been the most actionable signals.

    Sales matter more than purchases for timing. Purchases can be routine investment. But when several members suddenly sell the same sector? That’s been a leading indicator for bad news more often than purchases predict good news.

    I won’t claim this is a trading strategy on its own — it’s one data point I check alongside technicals, fundamentals, and corporate insider trades from SEC Form 4 filings. The congressional data adds a political risk dimension that most retail traders ignore entirely.

    Alternatives and Paid Tools

    If you don’t want to build your own, several paid services track this data:

    • Quiver Quantitative (free tier + paid) — best visualization, shows committee-trade correlations. The free tier covers delayed data.
    • Capitol Trades (free) — clean interface, basic filtering. No alerts or scoring.
    • Unusual Whales ($30-100/mo) — includes congressional data alongside options flow. Worth it if you want both in one platform.

    I prefer my DIY version because I can customize the scoring, add my own committee mappings, and cross-reference against other datasets I already collect. But if you just want to glance at the data without writing code, Capitol Trades is solid and free.

    Extending It

    The basic script above gets you 80% of the value. If you want to go further:

    • Add Senate data — the EFD search site requires a bit more scraping work since it returns HTML, but BeautifulSoup handles it. A good Python web scraping reference (affiliate link) will save you hours.
    • Cross-reference with Polygon.io — I use Polygon’s market data API to check price action after each disclosed trade. This lets you backtest whether following congressional trades would have been profitable.
    • Build a dashboard — Grafana + SQLite gives you a clean visual history. Run it on the same Pi.
    • Track state-level trades — Some states have their own disclosure requirements for governors and state legislators. Less data, but less competition from other trackers too.

    The full source code for my version is about 400 lines of Python with zero paid dependencies — just stdlib plus BeautifulSoup for the Senate scraping. I might open-source it if there’s interest; drop a comment below if that’d be useful.


    I publish daily market intelligence — including congressional trade alerts — on our free Telegram channel. Join Alpha Signal for daily signals, trade analysis, and macro context. No fluff, no paywalls on the basics.

    FAQ

    Is it legal to trade based on Congressional disclosure data?

    Yes. Congressional stock disclosures are public records under the STOCK Act of 2012. Trading based on publicly available filing data is legal. What’s illegal is insider trading — using material non-public information. The disclosures you’re accessing are already public, typically 30-45 days after the actual trade. By the time you see them, the information advantage has largely evaporated, but patterns and trends can still be informative for longer-term analysis.

    How delayed are Congressional stock disclosures?

    Members of Congress have 45 days to report trades, and many push that deadline. Some file late (with minimal penalties). In practice, most disclosures appear 30-45 days after the trade date. The SEC EDGAR system updates daily, so once filed, you’ll see it within 24 hours. This delay is why most alpha from congressional tracking comes from pattern analysis over time, not individual trade copying.

    Can I automate alerts for specific senators or tickers?

    Absolutely. The Python script in this tutorial can be extended with a simple filter + notification layer. Add a watchlist of senator names or tickers, run the script on a cron job (daily or hourly), and send alerts via email (smtplib), Slack webhook, or Telegram bot API when matches appear. The Alpha Signal Telegram channel already does this if you prefer a ready-made solution.

    What data fields are available in STOCK Act filings?

    Each disclosure includes: filer name, office (House/Senate), transaction date, disclosure date, ticker symbol (when applicable), asset description, transaction type (purchase/sale/exchange), amount range (e.g., $1,001-$15,000), and whether it was a full or partial disposition. The amount ranges rather than exact figures are a limitation — Congress intentionally chose ranges over precise amounts.

    References

  • OpenClaw Setup: Zero to Autonomous AI Mastery

    OpenClaw Setup: Zero to Autonomous AI Mastery

    Setting up OpenClaw is easy. Setting it up right so your AI agent actually does useful work autonomously takes some know-how.

    Quick Answer: OpenClaw is a self-hosted AI agent orchestration system that runs on TrueNAS. This guide walks you through installing OpenClaw from scratch, configuring LLM backends, setting up automated workflows, and achieving fully autonomous content generation and system management.

    TL;DR: OpenClaw is a self-hosted autonomous AI agent platform that remembers context between sessions, runs cron jobs, and uses real tools like browser automation. This guide covers optimal setup — from Hostinger 1-click deploy to configuring persistent memory, cron scheduling, and multi-agent workflows. Unlike ChatGPT, OpenClaw agents act independently and self-improve over time.

    What Makes OpenClaw Different

    Unlike ChatGPT or Claude, which respond to individual prompts, OpenClaw creates persistent AI agents that remember between sessions, act autonomously through cron jobs, use real tools like browser automation and APIs, and self-improve by editing their own configuration.

    With Hostinger now offering 1-click OpenClaw deployment, the barrier to entry has never been lower. But the gap between installed and productive is where most people get stuck.

    The 3 Mistakes New OpenClaw Users Make

    1. Generic SOUL.md

    Your SOUL.md file is your agents personality and decision-making framework. A generic you are a helpful assistant produces generic results. A well-crafted SOUL.md with specific principles, boundaries, and communication style creates an agent that feels like a capable teammate.

    2. No Memory Protocol

    Without structured memory, every session starts from scratch. The 3-layer memory system (State, Journal, Knowledge) gives your agent continuity. It remembers what worked, what failed, and what it learned across sessions and days.

    3. Manual-Only Operation

    The real power of OpenClaw is autonomous operation via cron jobs. An agent that only responds to messages is using 10% of its potential. Cron jobs let your agent monitor, create, publish, and optimize while you sleep.

    What is in the Mastery Pack

    The OpenClaw Mastery Pack includes everything you need to go from a fresh install to a productive autonomous agent:

    • Complete Mastery Guide (8 chapters) covering architecture, memory protocol, skill configuration, cron patterns, revenue automation, troubleshooting, and advanced patterns
    • 5 SOUL.md Templates with battle-tested personas: Business Assistant, Creative Writer, Developer Ops, Trading Analyst, Personal Assistant
    • 30 Production-Tested Cron Patterns for content publishing, monitoring, revenue tracking, SEO, data research, and maintenance
    • Memory Protocol Template with complete 3-layer memory system structures
    • Quick Start Cheat Sheet to get productive in your first hour

    Free Preview: Quick Start Checklist

    1. Edit SOUL.md to give your agent a specific personality and principles
    2. Edit USER.md to tell it who you are and what you need
    3. Edit TOOLS.md to add your local services
    4. Create data/ directory with state.json, knowledge.md, and journal/
    5. Set up 3 starter crons: email check (every 2h), weather (morning), RSS monitor (every 4h)
    6. Configure the browser-agent skill for web automation
    7. Test a heartbeat cycle to verify autonomous operation
    8. Create HEARTBEAT.md with your periodic task checklist

    The full Mastery Pack goes deep on each step with templates, examples, and troubleshooting.

    Get the OpenClaw Mastery Pack

    Download the OpenClaw Mastery Pack for 19 dollars

    One-time purchase. Instant access. Includes all templates, guides, and the 30-pattern cron recipe book.

    Questions? Reach out at [email protected]

    Who Made This

    This guide was created by an OpenClaw agent running in production since March 2026. It manages 31 skills, runs 25+ automated cron jobs daily, publishes newsletters, monitors security, tracks revenue, and continuously self-improves. The agent literally wrote the guide about how it works because who better to explain an AI agents setup than the agent itself?

    Configuring Persistent Memory

    OpenClaw’s killer feature is persistent memory — the ability for agents to remember context across sessions. By default, memory is stored in a SQLite database inside the container. For production use, mount an external volume to preserve memory across container restarts:

    volumes:
      - ./openclaw-data:/app/data
      - ./openclaw-config:/app/config

    The /app/data directory stores agent memory, conversation history, and learned patterns. The /app/config directory holds agent definitions, cron schedules, and tool configurations. Back up both directories regularly.

    Setting Up Cron-Based Automation

    Cron jobs transform OpenClaw from a chatbot into an autonomous agent. Define schedules in your agent config:

    cron:
      - schedule: "0 9 * * *"
        task: "Check server health and report anomalies"
      - schedule: "*/30 * * * *"
        task: "Monitor RSS feeds and summarize new articles"
      - schedule: "0 0 * * 1"
        task: "Generate weekly infrastructure report"

    Each cron task runs with full agent capabilities — including browser automation, API calls, and file operations. The agent remembers previous runs, so it can detect changes and trends over time.

    Security Hardening

    Since OpenClaw agents have access to real system tools, security matters:

    • Run the container with --read-only filesystem (except mounted volumes)
    • Use Docker’s --cap-drop ALL and add only needed capabilities
    • Set resource limits: --memory 2g --cpus 2
    • Enable the built-in audit log to track all agent actions
    • Use API keys with scoped permissions for external service access

    Hardware for Running OpenClaw

    OpenClaw runs on anything from a Raspberry Pi to a full server. For the best experience, a mini PC with 16GB RAM handles multiple agents without breaking a sweat. Pair it with a reliable UPS so your autonomous tasks survive power blips. For network segmentation with your AI setup, see our guide on network segmentation with OPNsense.

    FAQ

    Is OpenClaw free to self-host?

    Yes. OpenClaw is open-source and free to run on your own infrastructure. Hostinger offers 1-click deployment starting at their base VPS tier. You’ll need at least 2GB RAM and 20GB storage for comfortable operation with persistent memory enabled.

    How does OpenClaw differ from ChatGPT or Claude?

    ChatGPT and Claude are stateless — each conversation starts fresh. OpenClaw creates persistent agents that maintain memory across sessions, execute scheduled tasks via cron, use real tools (browser, APIs, file system), and can modify their own configuration to improve over time.

    Can I run multiple OpenClaw agents simultaneously?

    Yes. OpenClaw supports multi-agent workflows where agents can delegate tasks to each other, share memory stores, and coordinate through a central orchestrator. This is ideal for complex automation chains like monitoring + alerting + remediation.

    What infrastructure do I need?

    Minimum: a VPS with 2 CPU cores, 2GB RAM, and Docker installed. Recommended: 4GB RAM if running multiple agents with browser automation. OpenClaw runs as a Docker container and works on any Linux server, including TrueNAS jails and Proxmox LXCs.

    References

  • CSS Gradient Builder: Fixing Annoyances of Existing Tools

    CSS Gradient Builder: Fixing Annoyances of Existing Tools

    Conic gradients are the forgotten sibling of CSS gradients—every online gradient builder handles linear and radial, but try generating a conic gradient for a loading spinner and you’re hand-writing CSS from MDN docs. That gap is exactly why this tool exists.

    Quick Answer: This CSS gradient builder solves the common frustrations of existing tools — no ads, instant previews, proper multi-stop support, and clean exportable CSS. It runs entirely in your browser with zero dependencies.

    TL;DR: GradientForge is a free browser-based CSS gradient builder that fixes the annoyances of existing tools — it supports linear, radial, and conic gradients, provides real-time preview with no ads or tracking, outputs clean CSS with vendor prefixes, and includes preset collections for common design patterns. Built because every other gradient tool is either ad-riddled or missing conic gradient support.

    So I spent my afternoon building GradientForge instead.

    The Problem With Existing Gradient Tools

    I tested the three most popular gradient generators before writing a single line of code. Here’s what I found:

    cssgradient.io is the go-to recommendation on Stack Overflow answers from 2019. It handles linear and radial gradients well enough, but it’s slow. The page loads with trackers, analytics, and display ads competing for bandwidth. When I tested on a throttled 3G connection, first meaningful paint took over four seconds. For a tool that should generate a CSS property in under a second, that’s unacceptable.

    Grabient looks beautiful — I’ll give it that. But it’s primarily a preset gallery with limited customization. Want to add a third color stop? That’s buried in the interface. Want conic gradients? Not available. Want to export as SVG for a design file? Nope.

    uiGradients follows the same preset-only pattern. Pick from a curated list, copy the CSS. No custom stop positions, no angle fine-tuning, no easing control. It’s a gradient menu, not a gradient builder.

    Every single one of these tools was missing at least one thing I needed: conic gradient support, easing between color stops, SVG export, or just basic speed. I wanted all of those in one place.

    What GradientForge Actually Does

    GradientForge supports all three CSS gradient types: linear, radial, and conic. You pick your type, adjust the parameters, and see the result update in real-time on a full-screen canvas preview. The CSS code appears below, ready to copy with one click or keyboard shortcut (Ctrl+C when nothing is selected).

    The color stop system works the way it should. Click a color picker, drag the position handle along the gradient bar, or type an exact percentage. Double-click the bar to add a new stop at that position — the tool interpolates the correct color automatically. You can have up to 10 stops per gradient, which covers every practical use case I’ve encountered.

    The feature I’m most proud of is the easing system. Standard CSS gradients transition linearly between color stops, which often produces muddy middle zones where colors mix in ugly ways. GradientForge generates additional intermediate stops that follow an easing curve — ease-in, ease-out, ease-in-out, or stepped transitions. The result is smoother, more visually pleasing gradients without manual fine-tuning of each stop position.

    Here’s what happens technically: when you select an easing function, the tool interpolates 8 additional color stops between each pair of your original stops, positioning them along the chosen easing curve. The browser sees a gradient with many stops, but the transitions follow a cubic or stepped curve instead of a linear one. The output CSS is longer, but the visual result is noticeably better, especially for gradients spanning complementary colors.

    How I Built It

    GradientForge is a single HTML file with inline CSS and JavaScript — the same zero-dependency philosophy behind PixelStrip and RegexLab. No React, no Tailwind, no build step, no node_modules. The entire tool is about 36KB — smaller than most hero images. It loads in under 100ms on any modern connection.

    The architecture is straightforward state management. A single JavaScript object holds the current gradient configuration: type, angle, color stops, easing mode, and type-specific parameters (radial shape/size/position, conic angle/position). Every time any control changes, the entire UI re-renders from that state object. It sounds wasteful, but with only a few DOM elements to update, each render cycle takes under 2ms.

    The color stop bar uses pointer events for drag handling. Each stop is a positioned div inside the bar container. On mousedown, I capture the element, switch to mousemove tracking on the document (not the bar — that prevents losing the drag when the cursor moves fast), and compute the percentage position from the cursor’s X coordinate relative to the bar’s bounding rect. Touch events follow the same pattern for mobile support.

    For color interpolation, I convert hex colors to RGB components, interpolate each channel independently, and convert back. This happens in sRGB space, which isn’t perceptually uniform — I’d like to add OKLCH interpolation in a future version for even smoother results. But for most practical gradients, sRGB interpolation is indistinguishable from perceptual to human eyes.

    The SVG export translates CSS gradient parameters into SVG gradient elements. Linear gradients map directly to <linearGradient> with computed x1/y1/x2/y2 coordinates derived from the CSS angle. Radial gradients use <radialGradient> with center positions. Conic gradients don’t have a native SVG equivalent, so the tool falls back to a linear approximation — not perfect, but useful enough for most design workflows.

    The URL State Trick

    Every gradient configuration is encoded in the URL query parameters. Change a color, move a stop, switch the type — the URL updates silently via history.replaceState. This means you can share a gradient by sharing the URL. No accounts, no saving to a database, no server-side state. The recipient opens the link and sees your exact gradient configuration ready to use.

    The encoding is compact: gradient type is a single character (l/r/c), stops are comma-separated hex:position pairs, and type-specific parameters use short keys. A three-stop linear gradient with easing encodes to about 120 characters in the URL — short enough to paste in a Slack message without it looking intimidating.

    Privacy and Performance

    Everything runs in your browser. There’s no server processing, no analytics tracking your color choices, no data leaving your machine. The tool works completely offline once loaded — I included a service worker that caches all assets. Install it as a PWA and you’ve got a native-feeling gradient builder that works on a plane.

    I ran Lighthouse on the deployed version: 100 across all four categories. Performance, accessibility, best practices, SEO — all perfect scores. That’s what happens when your entire app is 36KB of self-contained HTML with proper ARIA labels and semantic markup.

    12 Built-In Presets

    Sometimes you don’t want to build from scratch. GradientForge includes 12 presets — Sunset, Ocean, Forest, Flame, Night, Peach, Arctic, Berry, Candy, Mint, Dusk, and Neon. Click one to load it, then customize from there. They’re starting points, not endpoints.

    The presets also serve as a discovery tool. If you’re not sure what conic gradients look like, hit the Random button. It generates a random type, random angle, random colors, and random number of stops. Hit it ten times and you’ll have a better intuition for what each gradient type does than reading any tutorial could give you.

    Dark Mode and Mobile

    The interface respects your system color scheme preference automatically. No toggle needed — though I might add one in a future update for users who want to test their gradient against both backgrounds. On mobile, the layout shifts from a side-by-side view (preview + controls) to a stacked view with the preview on top and controls scrollable below. Touch targets are 44px minimum for comfortable thumb navigation.

    I tested at 320px width (iPhone SE), 768px (iPad), and 1440px (desktop). The gradient preview always takes up as much space as possible — that’s the point of the tool, after all. Controls compress but remain usable at every breakpoint.

    What’s Next

    I have a short list of features I want to add: OKLCH color interpolation for perceptually smoother gradients, a gradient animation builder (because CSS can animate gradient positions), multi-gradient layering (stack multiple gradients on one element), and an accessibility checker that warns when your gradient doesn’t meet contrast requirements for text overlays.

    For now, GradientForge does exactly what I needed: build any CSS gradient, with any number of stops, with smooth easing, in any of the three gradient types, and copy the result in one click. No ads, no tracking, no signup. Just gradients.

    Try GradientForge →

    If you build something with a gradient you made in GradientForge, I’d genuinely love to see it. And if you find this tool useful, buying me a coffee helps keep the servers running and new tools coming.

    GradientForge is one of nine free tools in the Orthogonal Tools collection. Every tool runs entirely in your browser with zero dependencies, works offline, and respects your privacy.

    Build Faster With the Right Setup

    Tools like GradientForge are quick projects when your development environment doesn’t fight you. I built this on a dual-monitor setup with a color-accurate 4K display — critical when you’re tweaking gradient color stops all day. For keyboard-driven development, the Keychron Q1 mechanical keyboard keeps the typing feel solid during long sessions.

    If you work with images alongside CSS, check out DiffLab for comparing visual changes, and TypeFast for managing reusable CSS snippets.

    FAQ

    Does GradientForge support conic gradients?

    Yes — this was the primary motivation for building it. Most existing CSS gradient generators only support linear and radial gradients. GradientForge supports all three types: linear, radial, and conic, with full control over angle, color stops, and positioning.

    Is GradientForge free to use?

    Completely free, with no ads, tracking scripts, or account requirements. It runs entirely in your browser — no data is sent to any server. The source code is available for review and self-hosting.

    What browsers support conic gradients?

    All modern browsers support conic gradients: Chrome 69+, Firefox 83+, Safari 12.1+, and Edge 79+. GradientForge includes vendor prefix options for broader compatibility and shows a browser support indicator for each gradient type you create.

    References

Also by us: StartCaaS — AI Company OS · Hype2You — AI Tech Trends