Today
Front-end, in one read.
The latest from the sources worth following, newest first.
DEV CommunityThe Giantsread at source
crates.io download count: 80% of ours arrived with a new version
Originally published at tensorust.com . TL;DR: On October 17, 2026 I pulled every daily download number crates.io has for my 69 Rust crates. Over 89 days they logged 3,676 downloads , and 80.1% of them landed on the day a new version went up or the day after . A new version collects about 13 downloads in its first 24 hours no matter what is in it, then flatlines. Outside crates that depend on any of the 69: zero. The number that actually tells you whether people use your crate is the quiet-day baseline, and for us it was 339 downloads, about 3.8 a day. Short answer for the search. The crates.io download count is the number of times the crate's .crate file was fetched from the crates.io CDN, counted from the CDN's request logs ( crates.io moved to log-based counting in March 2024 ). Since October 29, 2025 only requests that look like they came from cargo (or send no user agent at all) are counted. It is not a count of users, installs or projects. One developer's CI that runs cargo build on a clean machine 30 times a day adds 30 downloads a day; one person who installs your crate once and keeps it in their local cache adds one, ever. So what is actually inside a small crate's number? Below is a fresh measurement on a real portfolio, the script that pulls it (copy it and run it on your own crates), and how to read your own chart without lying to yourself in either direction. Every daily download for all 69 crates, colored by kind of day. crates.io API, pulled Oct 17 2026, 7:10 AM ET. Bar height is square-root scaled so quiet days stay visible. Where the 69 crates came from Some context, because the shape of the data comes straight from how these crates were published. I maintain a pile of Rust libraries and tools: fin-primitives (trading building blocks), tokio-prompt-orchestrator (an LLM proxy with dedup and a circuit breaker), proof-engine (an OpenGL game engine), and CoreScout, an MCP server split into a workspace of 33 crates. They went out in three bursts: 51 versions in March 2026, 116 in September and 68 in October , 235 versions in total. The October burst was one big release run on October 4, after a pass where AI coding agents upgraded every crate and I published everything at the end in one go. That single day matters a lot later. All-time total when I pulled it at 7:10 AM ET on October 17: 4,815 downloads . The crates.io "recent downloads" figure (last 90 days) was 3,677. My goal for these crates is 100,000, so the honest question is how much of the 4,815 is people. Pull the numbers yourself in 40 lines crates.io has a public JSON API. It isn't formally versioned, but it's what the website itself calls, and the data access policy asks for two things: at most one request per second, and a User-Agent that says who you are. Three endpoints give you everything: /api/v1/crates?user_id=N : every crate a user owns, with all-time and 90-day totals. /api/v1/crates/ /downloads : daily downloads for the last 90 days, split by version (older versions are lumped into extra_downloads ). /api/v1/crates/ /reverse_dependencies : which published crates depend on this one. This is the script I ran this morning ( pull.py , trimmed only of the JSON field picking). It stops dead on a 429 instead of retrying, because a polite scraper doesn't argue with a rate limit: UA = " tensorust-deepdive-research (contact: hello@tensorust.com) " last = [ 0.0 ] def get ( path ): wait = 1.05 - ( time . time () - last [ 0 ]) # stay under 1 request/second if wait > 0 : time . sleep ( wait ) last [ 0 ] = time . time () req = urllib . request . Request ( " https://crates.io " + path , headers = { " User-Agent " : UA }) try : with urllib . request . urlopen ( req , timeout = 30 ) as r : return json . load ( r ) except urllib . error . HTTPError as e : if e . code == 429 : print ( " 429 - stopping " ); sys . exit ( 2 ) raise user = get ( " /api/v1/users/mattbusel " )[ " user " ] crates = get ( f " /api/v1/crates?user_id= { user [ ' id ' ] } &per_page=100 " )[ " crates " ] for c in crates : n = c [ " name " ] dl = get ( f " /api/v1/crates/ { n } /downloads " ) vers = get ( f " /api/v1/crates/ { n } /versions?per_page=100 " ) rev = get ( f " /api/v1/crates/ { n } /reverse_dependencies?per_page=100 " ) # ... store dl["version_downloads"], dl["meta"]["extra_downloads"], versions, rev 69 crates times three calls, one per second, took about three and a half minutes. Then a second pass of 69 calls to map version ids to version numbers and publish times, because the downloads endpoint labels each row with a numeric version id, not "2.15.0". Real output from pull.py and the analysis scripts, Oct 17 2026, 7:10 to 7:16 AM ET. If you have more than a few hundred crates (or you want every crate on the registry), don't hammer the API: crates.io publishes a database dump every 24 hours ( static.crates.io/db-dump.tar.gz ) that includes the per-day, per-version download table for the last 90 days. What the crates.io page shows you Here's the bottom of the fin-primitives page, which is my most-downloaded crate. Look at the chart before reading the numbers: a low wiggle of 0 to 3 a day through the summer, then tall spikes in the last week of September and the first week of October, each spike a different color. Each color is a version. The real crates.io page for fin-primitives, captured Oct 17 2026. Each colored spike is a new version. That chart is honest, but it's per crate. With 69 crates you can't eyeball 69 charts, so I classified every crate-day in the 90-day window into three buckets. The three kinds of download day The rule is simple and fully mechanical: Publish window: that crate published a version on this UTC day or the day before. Sweep day: no publish, but at least half of all my crates that existed got downloaded on the same day. Quiet: everything else. The core of the classifier, from analyze.py : for n , c in C . items (): for v in c [ ' downloads ' ][ ' version_downloads ' ] + c [ ' downloads ' ][ ' meta ' ][ ' extra_downloads ' ]: d = dt . date . fromisoformat ( v [ ' date ' ]) if any ( 0 ( d - p ). days 1 for p in pub [ n ]): cat [ v [ ' date ' ]][ 0 ] += v [ ' downloads ' ] # publish window elif v [ ' date ' ] in sweeps : cat [ v [ ' date ' ]][ 1 ] += v [ ' downloads ' ] # sweep day else : cat [ v [ ' date ' ]][ 2 ] += v [ ' downloads ' ] # quiet And the result over July 20 to October 16, 2026 (89 full UTC days, 3,676 downloads): All 69 crates, Jul 20 to Oct 16 2026 (UTC days), classified by the script in this article. 2,945 downloads (80.1%) came in a publish window. 392 (10.7%) came on six sweep days. 339 (9.2%) were quiet-day downloads. The biggest single day was October 4, the release run: 68 versions published, 1,195 downloads. Put another way: if I had never published those September and October versions, the 90-day number would have been somewhere around 730, not 3,676. A new version gets about 13 downloads, then nothing To see what a publish is worth on its own, I took every version published inside the window with at least a week of data after it (181 versions) and lined up its downloads by days since publish. 181 versions published Jul 20 to Oct 9 2026, each with at least a week of data. 86.9% of first-week downloads land on day 0 or 1. Mean downloads on day 0: 13.45 (median 10). Day 1: 1.21. Day 2: 0.02. 86.9% of a version's first-week downloads arrive on day 0 or day 1. The smallest day-0-plus-day-1 total for any version was 8, the largest 66, the median 12. The floor is the tell. Across all 235 versions ever published, the lowest all-time count for a single version is 9 . The median is 18. I have 19 crates that have only ever had one version, including internal plumbing crates like corescout-cli and corescout-lineage that nobody outside this project has a reason to know about. Their all-time totals run from 10 to 28 , median 15. Something fetches every new version within hours of publish, whether or not a human ever reads the README. What is that something? The data can't say. My guess, and it's a guess: registry mirrors and build farms that follow the crates.io index and fetch new versions as they appear, plus security and license scanners. The 2025 user-agent filter was written to drop mirrors, so whatever survives it is either cargo itself or a client that sends no user agent. docs.rs also builds documentation for every new version automatically; I couldn't confirm from public docs whether its fetch is counted, so I'm not claiming it is. The consequence is very practical: on crates.io, the number of versions you publish predicts your downloads better than anything about the code . Across my 69 crates, the correlation between version count and all-time downloads is 0.82. That's why fin-primitives (13 versions) leads and my genuinely more interesting crates trail it. Sweep days: when every crate gets hit at once The second bucket surprised me more. On October 9 nothing was published, yet all 69 crates got downloaded on the same day, 184 downloads in total . October 13: 56 of 69 crates, mostly one download each. That's not a person. A person installs one tool and its dependency tree, not a stats crate, a trading crate, a game engine and a TFT advisor in the same afternoon. Sweep days in the crates.io data, one square per crate that existed that day. Nothing was published on any of them. Six days in the window match the pattern: August 3 (17 of 17 crates that existed then), September 29, October 5, 9, 13 and 15. Some of the later ones lean toward the CoreScout family: on October 6 and 15 the top crates were corescout-core , corescout-mirror and corescout-memory , which is exactly what you'd see if something resolved the dependency tree of a CoreScout binary. That brings up the multiplier nobody mentions. Workspaces multiply the count CoreScout is a Cargo workspace , and when you publish a workspace to crates.io, every member becomes its own crate. Here's the real root Cargo.toml (excerpt): corescout-core = { version = "1.2.0" , path = "crates/core" } corescout-mirror = { version = "1.2.0" , path = "crates/mirror" } corescout-substrate = { version = "1.2.0" , path = "crates/substrate" } corescout-memory = { version = "1.2.0" , path = "crates/memory" } corescout-represent = { version = "1.2.0" , path = "crates/represent" } corescout-science = { version = "1.2.0" , path = "crates/science" } corescout-core has 25 dependents, all of them its own siblings. By the reverse-dependency data, corescout-mcp has 16 of my other crates somewhere in its dependency tree, so one cargo install corescout-mcp on a clean machine should show up as up to 17 downloads spread over 17 crate pages. Across all 69 crates, the reverse-dependency API lists 178 dependent versions, and every one of them is mine. That's the cruel bit. The crates with the most dependents look the most "used" (11 crates with five or more dependents had a median of 6 quiet downloads; the 25 crates with no dependents had a median of zero in 89 days) and it's entirely my own wiring. The quiet baseline: the only number that means people Strip the publish windows and the sweeps and you're left with 339 downloads in 89 days, about 3.8 a day across all 69 crates . That's the closest thing to "someone, somewhere, built with my code today." It isn't zero, and it's been rising: the portfolio averaged 1.7 quiet downloads a day in late July, 3.4 in August, 2.8 in September and 8.1 in the first half of October (with far more crates, so treat October with care). One crate does most of the work. fin-primitives alone is 128 of the 339 quiet downloads (38%) , one or two on most days since July, long before this autumn's release pile. My bet is that a handful of people or one CI pipeline builds against it regularly. That's a real signal, and it's exactly what a "publish-day bots" dismissal would throw away along with the noise. And the number that settles every argument: external reverse dependencies, 0. No published crate outside my own uses any of the 69. The ecosyste.ms crates.io index is a good second source for this, since it also tracks repositories that depend on a crate without publishing one. Do this with your own crates Read your number as three numbers. Publish-window, sweep and quiet. Run the classifier above (or just look at the per-version colors on your crate page); only the quiet line is about users. Expect about 10 to 15 downloads per version for free. If a brand-new crate shows 12 downloads on day one, nobody has found it yet, and that's fine. If it shows 12 on a random Tuesday three weeks later, somebody probably has. Don't release to pump the count. It works (we just measured it working), which is exactly why the count can't be trusted as a popularity number, and why anyone evaluating your crate will look at dependents and recent activity instead. Count dependents, not downloads. crates.io's Dependents tab, the reverse-dependency API and GitHub's "Used by" are where real adoption shows. One crate in someone else's dependency tree is worth more than a thousand publish-day fetches, because every one of their CI runs downloads yours too, forever. Know that a workspace inflates by its width. Splitting one tool into 30 crates makes every install look like 30 downloads. Report the binary crate's number if you want an honest headline. Re-pull on a schedule. The API only keeps 90 days of daily data per crate. If you want a trend, save the JSON every month; once a day falls out of the window, the per-day split is gone for good. The numbers, all of them Measure (crates.io API, pulled Oct 17 2026, 7:10 AM ET) Value Crates / versions 69 / 235 All-time downloads 4,815 Downloads Jul 20 to Oct 16 (89 days) 3,676 In a publish window 2,945 (80.1%) On sweep days 392 (10.7%) Quiet 339 (9.2%), 3.8/day Downloads per new version, day 0 (mean / median) 13.45 / 10 Share of first-week downloads on day 0 or 1 86.9% Lowest all-time count of any version 9 Correlation, versions vs downloads 0.82 External reverse dependencies 0 For the record, this isn't a "downloads are fake" post. The counting rules are public and reasonable, and the quiet baseline is real and growing. It's a "know which part of the number you're looking at" post. The next milestone I care about isn't 10,000 downloads, it's the first crate with an outside dependent. I'll pull this again in 30 days and publish the diff. If you maintain crates: what does your quiet-day baseline look like next to your total? I'd genuinely like to know whether 80% publish-window is normal for small crates or whether my release habits made it worse. More from the same projects: the semantic cache inside tokio-prompt-orchestrator , running 20 coding agents on one PC (the agents that upgraded these crates), and Bevy instancing at 639,000 units . Publishing is not distribution. The agent team that pulled this data also runs distribution for products: see the offer .
DEV CommunityThe Giantsread at source
Clean Product Cut-Outs: A Practical Guide to Background Removal for Catalogues and Marketplaces
How automatic background removal works Modern background removers use a segmentation model , a neural network trained to decide which pixels belong to the subject and which belong to everything else. Background pixels become transparent, and the result is saved as a PNG, because PNG has an alpha channel and JPG doesn't. The model judges edges, shapes, colour and context together. That's why it handles irregular outlines much better than a "magic wand" selection. It's also why the input photo matters so much: the model can only separate what the camera actually captured as separate. Step 1: Shoot for the cut-out, not the final image Most messy edges are decided at capture time. A few habits make the biggest difference: Contrast between subject and background. A white mug on a white sheet is a hard case. Put light products on a darker backdrop and dark products on a lighter one. Even, soft lighting. Hard shadows on the backdrop can be read as part of the product. Shoot near a window on an overcast day, or bounce light off a wall. Space behind the product. Pull the product a little away from the backdrop so it doesn't cast a shadow right against it. Sharp focus. Motion blur and soft focus make edges ambiguous. Enough resolution. A tiny thumbnail gives the model little detail to work with. One subject per photo. Overlapping products, or products sitting on top of similar-coloured props, are much harder to separate. Some materials are hard for any automatic tool: fine flyaway hair, transparent glass, thin wires and reflective surfaces. Plan for a manual touch-up on those. Step 2: Remove the background For one-off images or a small batch, the free PKD Ventures Background Remover takes a JPG, PNG or WEBP image and returns a transparent PNG. It uses an AI model to separate the product from the background. The first image can take a little longer while the model loads, and later ones are faster. Very large images can be slow on older phones. If the source photo is small or soft, upscale it before removing the background. The Image Enhancer uses the Real-ESRGAN model to enlarge images 2X, 4X or 8X. Keep expectations realistic: it reconstructs plausible detail but can't recover detail that was never captured. Step 3: Inspect the edges Don't judge a cut-out against a white page, because white hides a light halo. Preview it against a dark colour and then a bright one. Look for: a thin fringe of the old background colour around the edges, missing chunks where the product matched the backdrop, leftover patches of shadow under the product. Small fringes can usually be fixed in any photo editor with a slight edge contract or a soft eraser. If you see big missing chunks, it's usually quicker to reshoot with better contrast than to repair the image. Step 4: Keep a transparent master, then export per destination Treat the transparent PNG as your master file . You can always flatten it onto any background later, but you can't get transparency back out of a JPG. From that master you can export: Transparent PNG or WEBP for websites, slide decks and composites where the product sits on a designed background. White-background JPG for catalogues and marketplace main images. Brand-colour versions for profile photos and social posts, with everyone on the same colour so a team page looks unified. One shortcut for white backgrounds: the Image Compressor fills transparent areas with white when you choose JPG output. Choose WEBP or PNG output instead if you want to keep the transparency. You can also set quality and a maximum width to shrink phone photos. If you prefer the command line, ImageMagick does the same flattening: # Flatten a transparent PNG onto pure white and save as JPG magick product.png -background white -alpha remove -alpha off product.jpg # Check the colour of the top-left pixel (should be white for a white-background image) magick product.jpg -format "%[pixel:p{0,0}] \n " info: Step 5: Check the destination's rules Every marketplace publishes its own image guidelines, and they change, so read the current version for each platform you sell on instead of relying on memory. Typical rules cover background colour, how much of the frame the product fills, minimum image size, and whether text, logos or props are allowed in the main image. Amazon is a common example. Its main product image is expected to be on a pure white background (RGB 255, 255, 255), with no added text or graphics. "Looks white" isn't always enough. A light-grey backdrop straight from the camera can fail this check, so a flattened cut-out is often the more reliable route. The pixel check above is a quick way to confirm. WhatsApp Business catalogues are more relaxed, but the same background, framing and canvas size across products still makes a small catalogue look organised. A repeatable routine Shoot every product against the same contrasting backdrop, in the same light, from the same angle. Upscale any small or soft photos first. Remove backgrounds in one sitting and check edges against dark and light previews. Save transparent PNG masters, named by product code. Export per destination: white JPG, transparent WEBP or a brand-colour version. Compress and resize before uploading, then spot-check against each platform's current rules. Closing note This guide comes from PKD Ventures, a Kanpur-based company that builds websites, business apps and custom software. We also keep a set of free tools for everyday image and file jobs at pkdventures.in . If your store handles hundreds of product photos a week, it's usually worth building background removal and resizing into the upload pipeline itself, so every new image comes out consistent without any manual steps.
DEV CommunityThe Giantsread at source
Edemy AI: Turning Online Learning into an Opportunity š
Edemy AI: Turning Online Learning into an Opportunity š This is my submission for the Hacktoberfest Open-Source AI Challenge: Week 2 ā Side Hustle . š” What I Built I built Edemy LMS , an online learning platform designed to help students discover courses, learn new skills, and track their learning progress. The idea came from a simple observation: learning a new skill is important, but finding affordable learning resources and knowing what to study next can be challenging. With Edemy LMS, I wanted to create a platform where students can access educational content and instructors can share their knowledge with learners. For the Side Hustle theme, I see an opportunity to evolve this platform into Edemy AI ā an AI-powered learning assistant that helps students learn more effectively and gives instructors tools to create better learning experiences. The vision is to help learners turn their knowledge into practical skills they can use in their careers or freelance work. ⨠Key Features š Course Discovery: Explore courses and find useful learning resources. š„ Video Learning: Access course content through video-based lessons. š Progress Tracking: Keep track of learning progress. šØāš« Instructor Tools: Create and publish educational content. š¤ AI Learning Assistant (Planned): Help students understand difficult topics and summarize learning materials using an open-weight AI model. š AI Quiz Generation (Planned): Generate practice questions from course content. š¼ Career-Oriented Learning (Planned): Help learners identify skills they can develop for freelance opportunities. The existing LMS provides the foundation, while the AI features represent the direction I want to explore next. š Live Demo Explore the current application: https://edemy-lms-gps.vercel.app/ š» Source Code GitHub repository: https://github.com/Gyanthakur/Edemy-LMS I welcome feedback, suggestions, and contributions that can help improve the learning experience. š ļø How I Built It The current Edemy LMS application uses modern web technologies: Frontend: React.js, Vite, Tailwind CSS Backend: Node.js and Express.js Database: MongoDB Authentication: Clerk Payments: Stripe Rich Text Editor: Quill Media Management: Cloudinary Video Learning: YouTube Player I focused on creating a responsive interface, reusable components, authentication, course management, and payment functionality. For the AI direction, I plan to integrate an open-weight language model for educational assistance and quiz generation. Keeping the model layer modular would allow the project to experiment with different open models and deployment options. š Why Does Open Innovation Matter? Education is one of the areas where open innovation can make a meaningful difference. Open-source technologies allow developers to experiment, customize tools, and build solutions without depending entirely on proprietary platforms. For a project like Edemy LMS, open-weight AI models could make it possible to customize learning assistance around specific course materials, experiment with different models, and give developers more control over how AI is deployed. Open innovation also encourages collaboration. Other developers can study the implementation, suggest improvements, and help make learning tools more accessible. My long-term goal is to build a platform that helps people learn practical skills and eventually use those skills to create career and freelance opportunities. š¤ My Agent Session I haven't added an agent session link yet. I'll include one if I record and publish a development session for this project. š Prize Categories This project focuses on educational technology, open-source software, and the potential use of open-weight AI for personalized learning. I'll select the partner prize categories that match the final implementation and the official challenge requirements. š Final Thoughts Building Edemy LMS has been an opportunity to explore full-stack development and solve a practical problem. I believe learning platforms can become even more useful when combined with open-source AI, especially when the goal is to make education more accessible and help learners develop skills they can use in the real world. I'd love to hear your feedback and ideas for improving the project! š Live Demo: https://edemy-lms-gps.vercel.app/ š» GitHub: https://github.com/Gyanthakur/Edemy-LMS Hacktoberfest #OpenSourceAI #AI #WebDev #EdTech
DEV CommunityThe Giantsread at source
Nvidia enters the laptop market with new RTX Spark chip
Nvidia enters the laptop processor market as the fifth major chipmaker with the RTX Spark N1X GPU. Based on Arm architecture, the 3-nanometer chip features 6,144 CUDA cores and an 80W power cap. Testing inside the HP OmniBook Ultra 16 reveals architectural performance alongside notable game compatibility and anti-cheat hurdles. The first test and the characteristics of the chip The tests were conducted with the RTX Spark N1X chip, which is inside an HP OmniBook Ultra 16 laptop. This particular device costs $4.999,99, while prices for the series start at $3.199,99. The chip is manufactured at 3 nanometers and features 6.144 cores, a 256-bit memory system and a maximum switching speed of 300 gigabits per second. The chip's power consumption is limited to 80 watts. Convening with other devices and game restrictions For comparison purposes, two gaming laptops were used: an Acer Predator Helios Neo 16S AI with a GeForce RTX 5060 graphics card and an Alienware 16 Area-51 with a GeForce RTX 5080. READ ALSO Human DNA doesn't work like simple computer code, scientists say Because the RTX Spark chips are based on Arm architecture, the games that can run on them are limited. From testing, only Cyberpunk 2077 was able to run from the established test list. Other games faced hurdles. F1 2024 displayed a message that there was no Arm version available, while Call of Duty: Modern Warfare III was hampered by a lack of support for its anti-cheat system, although Nvidia says support will come in 2027. Testing on modern and older games The tests included modern games with advanced lighting and graphics techniques, such as Avatar: Frontiers of Pandora, Black Myth: Wukong, Cyberpunk 2077, and Returnal. In addition, older games released around or before 2020 were tested, such as Borderlands 3, Far Cry 6, Shadow of the Tomb Raider, and Total War: Three Kingdoms. To support future titles, Nvidia is forming partnerships with leading game publishers, including Capcom, EA, Sega, and Ubisoft. G Hacks.gr on Google Set it as a preferred source for cybersecurity updates. Preferred source Read the original English article on Hacks.gr
DEV CommunityThe Giantsread at source
Nginx Proxy Manager with Docker: Proxy Hosts and Free SSL
Once you run more than one self-hosted app, you hit the same problem every time. Each app wants its own port, and none of them has HTTPS. Nginx Proxy Manager (NPM) fixes both. It sits in front of your apps, answers on ports 80 and 443, sends each domain to the right container, and gets free Let's Encrypt certificates for you, all from a web UI. It's a popular choice. On October 14, 2026, the project's GitHub repository had about 34,400 stars, and the jc21/nginx-proxy-manager image had been pulled more than 285 million times from Docker Hub. This guide covers a clean install, the first-run setup (it changed in recent versions, so a lot of older guides are wrong), your first proxy host, both ways to get a certificate, and the errors you're most likely to hit. TL;DR: Run jc21/nginx-proxy-manager:2.16.0 with ports 80 and 443 public, bind the admin UI to 127.0.0.1:81 , and keep both the /data and /etc/letsencrypt volumes. There's no admin@example.com / changeme login on 2.16. You create the admin account on the first-run screen, so use a real email, because NPM also uses it for Let's Encrypt. Put NPM and your apps on one shared Docker network and forward to the service name and the container's internal port. localhost there means NPM itself and gives you a 502. Request the certificate in the SSL tab. HTTP-01 needs DNS pointing at the server and port 80 open. DNS-01 with a scoped Cloudflare token also covers wildcards. Install Nginx Proxy Manager with Docker Compose Before you start Without a reverse proxy, you reach apps like this: http://203.0.113.10:3001 , http://203.0.113.10:8080 , and so on. That's one open port per app and no TLS. With a reverse proxy, only ports 80 and 443 are open. A request for https://status.example.com reaches NPM. NPM reads the hostname and passes the request to the container that serves it (for example uptime-kuma:3001 ) over the internal Docker network. NPM handles HTTPS, so the app behind it doesn't need to know anything about certificates. You need: A Linux server with Docker and the Docker Compose plugin. A domain, with an A record for each hostname (or a wildcard *.example.com ) pointing at the server's public IP. Ports 80 and 443 reachable from the internet (cloud firewall, router port forwarding). Port 80 matters even if you only want HTTPS, because Let's Encrypt's HTTP-01 check only works on port 80 . Nothing else already listening on 80, 443 or 81 on the host. The compose file and first start Create a folder and a compose file. This is the official quick-setup file with three changes. The image is pinned to the current release, there's a timezone you'll want to change, and the admin port is bound to 127.0.0.1 : mkdir -p ~/npm && cd ~/npm nano compose.yaml services : app : image : ' jc21/nginx-proxy-manager:2.16.0' restart : unless-stopped ports : - ' 80:80' # public HTTP - ' 443:443' # public HTTPS - ' 127.0.0.1:81:81' # admin UI, only reachable from the server itself environment : TZ : " Europe/London" # change to your timezone # DISABLE_IPV6: 'true' # uncomment if your host has no IPv6 volumes : - ./data:/data - ./letsencrypt:/etc/letsencrypt Start it: docker compose up -d docker compose logs -f app The first start runs database migrations and takes a little while. When you see Backend PID ... listening on port 3000 , it's ready. Check from the server itself, since port 81 only answers there now: curl -s http://127.0.0.1:81/api/ On a fresh install that returned: { "status" : "OK" , "setup" : false , "version" :{ "major" : 2 , "minor" : 16 , "revision" : 0 }} "setup":false means no admin account exists yet. That's the next step. Why bind port 81 to localhost? It's your admin panel, and upstream's file publishes '81:81' on every interface. A host firewall won't save you here. Docker's firewall docs say that when you publish a container's ports, "traffic to and from that container gets diverted before it goes through the ufw firewall settings." On my test box, with the 127.0.0.1 binding, the API answered on 127.0.0.1 but not on the server's network address. To use the admin UI from your laptop, open an SSH tunnel: ssh -L 8181:127.0.0.1:81 you@your-server Then browse to http://localhost:8181 . Once NPM works, you can also put the admin UI behind its own proxy host with an access list. A few more things I learned in testing: Keep both volumes. When I started the image without /etc/letsencrypt mounted, it refused to start and logged ERROR: /etc/letsencrypt is not mounted! Check your docker configuration. SQLite is the default and is fine for a single server. The full setup docs also have MariaDB, MySQL and Postgres variants. The project doesn't publish minimum requirements. On my test box the idle container used about 110 to 130 MB of RAM. Images are built for amd64 and arm64. The setup docs say armv7 was dropped in 2.14 and point 32-bit ARM users to the 2.13.7 tag. Create the admin account The setup screen replaced the default login Open the admin UI through the SSH tunnel at http://localhost:8181 . If you kept upstream's '81:81' , use http:// :81 . If you've read an older guide, you're expecting to log in with admin@example.com and changeme . That was true up to the 2.12.x releases (it's in the v2.12.6 README ), but it was removed from the README in 2.13.0. On 2.16.0 there is no default account. You get a "Welcome! Get started by creating your admin account" screen with Full Name, Email address and New Password. Use a real email address here. NPM uses your account email as the Let's Encrypt account email. In my test the certificate request ran certbot ... -m admin@lab.test ... , and Let's Encrypt rejected it with The ACME server believes admin@lab.test is an invalid email address . A made-up address here means certificate requests fail later. Scripted setup and two-factor login If you'd rather create the admin account without the setup screen (useful for scripted installs), the advanced config docs list two variables for it. Don't type the password into compose.yaml . Put it in a .env file next to it that only you can read: cat > .env ' EOF2 ' INITIAL_ADMIN_EMAIL=you@example.com INITIAL_ADMIN_PASSWORD=a-long-random-password EOF2 chmod 600 .env Then reference the variables in compose.yaml : environment : INITIAL_ADMIN_EMAIL : ${INITIAL_ADMIN_EMAIL} INITIAL_ADMIN_PASSWORD : ${INITIAL_ADMIN_PASSWORD} After the first start, delete both lines from compose.yaml , delete .env , and run docker compose up -d . I tested this. The account was created, /api/ reported "setup":true , and after removing the variables and recreating the container I could still log in with the same password. Change the password in the UI if it was ever stored anywhere else. NPM has supported TOTP two-factor authentication since 2.13.6. The 2.16 UI includes an "Enable Two-Factor Authentication" option for your account. Turn it on, because this panel controls all your traffic. Add a proxy host Connect NPM to your apps with a shared network The easiest way to connect NPM to your apps is a shared Docker network. NPM then reaches each app by its service name, and the apps don't need to publish any ports to the host. This is the approach the NPM docs recommend : docker network create proxy Add this to the bottom of NPM's compose.yaml and to each app's compose file: networks : default : external : true name : proxy Then run docker compose up -d again in each folder. If an app's compose file already defines its own networks, attach just the web service to proxy instead. In the NPM UI, go to Hosts > Proxy Hosts > Add Proxy Host. The Details tab has: Domain Names: status.example.com Scheme: http . This is the protocol between NPM and the app, which is almost always plain HTTP. Forward Hostname / IP: the container's service name, for example uptime-kuma . Forward Port: the port the app listens on inside its container (for example 3001 ), not a host port. Access List: leave it as Publicly Accessible for now. Options: Block Common Exploits is a sensible default. Turn on Websockets Support for any app with a live UI (see below). This is the Details tab from my lab run, pointing a test hostname at a container named whoami : Save, then test from any machine: curl -I http://status.example.com In my lab, a proxy host pointing at a container named whoami on the shared network returned that container's page, and a hostname with no proxy host got NPM's "Congratulations!" default site. You can change that default under Settings > Default Site. The saved host shows up in the Proxy Hosts list: For a full example app behind NPM, see Uptime Kuma with Docker . Websockets, access lists and custom locations Some apps won't work at all without HTTPS. Vaultwarden's web vault is one, as the Vaultwarden HTTPS guide shows. I tested that fix with Caddy, and an NPM proxy host with a Let's Encrypt certificate should fix it the same way. Websockets Support (Details tab) matters for apps with a live UI, such as Uptime Kuma, n8n, Home Assistant or Open WebUI. They break in strange ways without it, with "connection lost" banners and dashboards that never update. The n8n guide and the Open WebUI guide show what that looks like. When I turned the toggle on, NPM added these lines to the generated nginx config: proxy_set_header Upgrade $http_upgrade ; proxy_set_header Connection $http_connection ; proxy_http_version 1.1 ; If you aren't sure whether an app needs it, turn it on. It doesn't hurt plain HTTP apps. Access lists (Access Lists menu) hold HTTP basic-auth users and allow or deny IP rules. Pick one in a proxy host's Access List field. It's a cheap way to lock down admin panels that have weak or no auth of their own. NPM 2.16.0 also added per-path access lists inside the proxy host modal. Custom Locations (a tab in the proxy host) send a path such as /api to a different container or port than the rest of the host. Most single-app hosts don't need them. The Advanced tab (gear icon) takes raw nginx directives for the server block. Use it sparingly. If a snippet breaks the config, 2.16.0 keeps the failed file as .conf.err so you can see what went wrong. Get a free Let's Encrypt certificate Edit the proxy host and open the SSL tab. Under SSL Certificate, pick "Request a new Certificate (with Let's Encrypt)". The other toggles are: Force SSL redirects HTTP to HTTPS. Turn it on once the certificate works. HTTP/2 Support is safe to enable. HSTS Enabled and HSTS Sub-domains tell browsers to use only HTTPS for this host (and its subdomains) for a long time. Leave these off until you're sure HTTPS works everywhere, because they're hard to undo. Then pick a challenge type. HTTP-01 (the default) Per Let's Encrypt's docs , HTTP-01 asks for a token at http:// /.well-known/acme-challenge/... and checks that your server returns it. NPM serves that path itself, from a letsencrypt-acme-challenge folder in its data volume. The challenge can only succeed when DNS for the hostname already points at this server and port 80 is reachable from the internet. On Oct 14, 2026, I verified this domain and HTTP-01 path by getting a real Let's Encrypt certificate over HTTP-01 on a public Debian 13 server running Caddy, while NPM's own certificate request screen follows NPM's documentation. HTTP-01 can't issue wildcard certificates, and it fails if your ISP blocks port 80. NPM 2.16's code also includes a reachability check for HTTP-01. It writes a test file and asks an outside service (site24x7.com) to fetch it from your domain. Run it before you request a real certificate, because failed attempts count toward rate limits (covered below). DNS-01 with Cloudflare With DNS-01, according to Let's Encrypt's docs, certbot proves you control the domain by creating a TXT record at _acme-challenge. . Use it when: you want a wildcard certificate ( *.example.com ), the server isn't reachable on port 80 (a home lab behind CGNAT, or an internal-only service), or you have several servers. In the SSL tab, turn on Use DNS Challenge, choose your DNS Provider, and paste the credentials. NPM 2.16.0 ships certbot plugins for a long list of providers, Cloudflare included. For Cloudflare, NPM's template is: # Cloudflare API token dns_cloudflare_api_token = your-cloudflare-api-token Create an API token (not the Global API Key) in the Cloudflare dashboard. The certbot-dns-cloudflare docs say it needs Zone:DNS:Edit permission, only for the zones you need certificates for. Two cautions: That token can change your DNS. Let's Encrypt's challenge docs warn that keeping DNS API credentials on a web server raises the stakes if the server is compromised, so scope the token as narrowly as you can. 2.16.0 updated certbot, and the release notes warn that some DNS plugins may need dependency tweaks. If your provider's plugin errors after an upgrade, check the issue tracker before you assume your token is wrong. Fix common SSL errors Certificate requests that fail "Internal Error" when requesting a certificate This is NPM's generic message. The real reason is in the certbot log, which sits in your data volume: sudo tail -n 50 ~/npm/data/logs/letsencrypt.log # the data folder is owned by root docker compose logs app | grep -i -A5 "SSL \| certbot" The usual causes are DNS not pointing at the server yet, port 80 blocked, or an invalid account email (see above). Challenge fails with "Timeout", "Connection refused" or the wrong IP Let's Encrypt couldn't fetch the token. Check these from outside your network (mobile data works): dig +short status.example.com # should print your server's public IP curl -I http://status.example.com # should answer from NPM, not time out If the IP is wrong, fix DNS and wait for it to update. If you get a timeout, open port 80 in the cloud firewall or router. If you use Cloudflare's proxy (orange cloud) and HTTP-01 keeps failing, switch to the DNS challenge, which doesn't depend on the HTTP path. Rate limited Retrying over and over burns Let's Encrypt's rate limits . The ones you're most likely to hit while troubleshooting: 5 failed validations per hostname, per account, per hour. 5 certificates for the exact same set of hostnames every 7 days. Reinstalling and requesting again is the classic way to hit this one. 50 certificates per registered domain every 7 days. Revoking certificates doesn't reset these limits. Fix the cause first, test it, then request once. Errors after the certificate is issued ERR_TOO_MANY_REDIRECTS behind Cloudflare If Cloudflare's SSL/TLS mode is Flexible, Cloudflare talks to your server over plain HTTP. With Force SSL on, NPM redirects that to HTTPS, and Cloudflare requests HTTP again, in a loop. Cloudflare's fix is to set the mode to Full or higher, which needs a valid certificate on the origin (NPM's Let's Encrypt certificate works here), or else to stop redirecting at the origin. 502 Bad Gateway after a "successful" setup The certificate is fine, but NPM can't reach the app. The most common mistake is putting localhost or 127.0.0.1 in Forward Hostname. Inside the NPM container, that address means NPM itself. In my lab, a proxy host pointed at 127.0.0.1:8080 returned 502, and the host's error log said: connect() failed (111: Connection refused) while connecting to upstream ... upstream: "http://127.0.0.1:8080/" Use the app's service name on the shared Docker network, with the container's internal port. If the app runs directly on the host instead of in Docker, use the host's LAN IP. Per-host logs are in ~/npm/data/logs/proxy-host- _error.log . FAQ Logging in and updating Why doesn't admin@example.com / changeme work? Because 2.16 has no default account. Since 2.13.0, a fresh install shows a setup screen where you create the admin account yourself. How do I update Nginx Proxy Manager? The upgrading page says to run docker compose pull and docker compose up -d , and adds: "This project will automatically update any databases or other requirements so you don't have to follow any crazy instructions." Some releases do add migrations, so I'd back up first. With a pinned tag, change it in compose.yaml , then: cd ~/npm docker compose stop # don't copy the SQLite file while it's in use sudo cp -a data data.bak- $( date +%F ) docker compose pull && docker compose up -d Read the release notes before major bumps. 2.15.0 and 2.16.0 both updated certbot and warned that DNS plugins may need changes. Version 2.13.3 added a migration and warned that you can't easily downgrade after it. Why are my settings gone after Docker restarts? NPM keeps its database and config in /data and its certificates in /etc/letsencrypt . If those aren't mounted to folders or volumes on the host, recreating the container starts from scratch. Use both volume lines from the compose file above. The official image won't even start without /etc/letsencrypt mounted. Certificates and errors How do I get a wildcard certificate? Use the DNS challenge. HTTP-01 can't issue wildcards. Request a certificate for *.example.com (and example.com if you want the bare domain too), turn on Use DNS Challenge, pick your provider and paste a scoped API token, as in the Cloudflare example above. Why do I get 502 Bad Gateway? NPM can't reach the app at the Forward Hostname and port you gave it. Don't use localhost or 127.0.0.1 , which mean the NPM container itself. Put NPM and the app on the same Docker network and use the service name and the container's internal port. How do I protect the admin panel on port 81? Don't publish it to the internet. Port 81 serves the login form over plain HTTP. The compose file above binds it to 127.0.0.1 , and on my test box it then answered only on the server itself. Reach it through an SSH tunnel ( ssh -L 8181:127.0.0.1:81 you@your-server ). A reply in issue #481 suggests another option: a proxy host such as npm.example.com that forwards to 127.0.0.1 port 81 with SSL, after which you remove the port 81 mapping from the compose file. If you go that way, I'd also add an access list to that proxy host so only your own IP addresses can reach it. Turn on two-factor login either way. Originally published on DeployLark: Nginx Proxy Manager with Docker: Proxy Hosts and Free SSL
Flavio CopesMore Front-end Bloggersread at source
MCP server design: tools, authentication, and rate limits
How to design a useful MCP interface for your product, with clear tools, account permissions, usage limits, predictable results, and safe writes.
Hacker News: Show HNLibraries, Frameworks, etc.read at source
Show HN: Club Pigeon ā A multiplayer pigeon park with SNES-style minigames
Comments
Hacker News Front PageThe Giantsread at source
DeepSeek: DeepSeek v4.1 Flash 1017
Hacker News Front PageThe Giantsread at source
DeepSeek-v4.1-Flash-1017
Hacker News: Show HNLibraries, Frameworks, etc.read at source
Show HN: Biblio Times, your RSS feeds, typeset as a morning newspaper (Mac/iOS)
Comments
Hacker News Front PageThe Giantsread at source
Show HN: I got tired of btop not seeing my Mac's chip, so I built siltop
Hacker News: Show HNLibraries, Frameworks, etc.read at source
Show HN: I got tired of btop not seeing my Mac's chip, so I built siltop
Comments
Flavio CopesMore Front-end Bloggersread at source
Selling SaaS to developers: how to find paying customers
Developers can build alternatives to your product. That doesn't make them bad customers. Look at urgency, budgets, and the work buying lets them avoid.
Hacker News: Show HNLibraries, Frameworks, etc.read at source
Show HN: Calcy ā unit-aware, uncertainty-propagating math
Comments
Hacker News Front PageThe Giantsread at source
Show HN: Llmspeed ā feel how fast a local LLM runs before you buy the hardware
Hacker News: Show HNLibraries, Frameworks, etc.read at source
Show HN: Llmspeed ā feel how fast a local LLM runs before you buy the hardware
Comments
Hacker News Front PageThe Giantsread at source
Butlerian Jihad
AbduzeedoMulti Author Blogsread at source
Fieldwork Facility Unveils V&A East Storehouse Wayfinding
V&A East Storehouse wayfinding by Fieldwork Facility treats the museum like software: a low-carbon, programmable system built for updates. The system's face is Spiller Mono, a bespoke monospace cu...
AbduzeedoMulti Author Blogsread at source
BastƩt: Inside Wedge's New Oral Care Branding
Wedge puts toothpaste on the beauty counter with this oral care branding for BastƩt: a carved-serif wordmark, one green badge, zero clichƩs. The first thing you notice is what is missing. No red, whit...
SitePointThe Giantsread at source
Modern JavaScript Modules: A Practical Guide to Writing Maintainable Code
null Continue reading Modern JavaScript Modules: A Practical Guide to Writing Maintainable Code on SitePoint .
AbduzeedoMulti Author Blogsread at source
Product Design: MaPC your PC games on your Mac
Discover MaPC, a new product design by the team behind Abduzeedo bringing Windows Steam, Epic, and GOG gaming natively to Apple Silicon Mac. Gaming on Apple Silicon has always felt like an exercise in...
Google for DevelopersYouTube ChannelsVideoWatch on YouTube
š§° Builders building with Gemini Audio
AbduzeedoMulti Author Blogsread at source
Properly Studio Unveils the Axi Rebrand
Properly rebuilt Axi's brand, website and trading app in four months. The Axi rebrand keeps the signature red and adds a custom typeface. Four months. That is the timeline Properly took to rebuild the...
AdactioTop Front-end Bloggersread at source
Ranking proposals for Interop 2027
The Firefox team are asking us to weigh in on proposals for Interop 2027āwhat features should browsers be concentrating on implementing or improving. Here are my top five : Web app installation via and navigator.install() . Prompts the user to install a progressive web app. Speculation Rules API . Hints to the browser to proactively download pages in the background so they appear instantly when the user navigates to them. CSS var() in size container queries . Such as @container (width >= var(--min-width)) . CSS flex-wrap: balance . Distributes items in a multi-line flex container so each line has about the same number of items. Interest invokers . The interestfor attribute triggers actions on a target element when the user shows interest, such as via hover, focus, or long-press. Those are very much in order of priority. Imagine them following a Pareto distribution ; the top 20% (in other words, the first one) is 80% of my priority. But other people have other priorities: Stu , Eric , Ana , Tyler , PaweÅ , Declan , Sara , and Cyd , for example. Thereās a lot of love for styleable select in thereācanāt argue with that. Get in there and rank your priorities . Then share them.
Level AccessCompany/Startup Blogs11 min read
Can AI Make a Website Accessible?
AI generally cannot make a website fully accessible by itself. However, with proper skills, guardrails, access to vetted design systems, and human input, The post Can AI Make a Website Accessible? appeared first on Level Access .
Google for DevelopersYouTube ChannelsVideoWatch on YouTube
šµ Turning motion into music with Gemini
SitePointThe Giantsread at source
React Form Validation Using Shared Zod Schemas and Server Actions
Share one Zod schema between React Hook Form and a Next.js Server Action, map server errors back to inputs with setError, and test the rules with Vitest. Continue reading React Form Validation Using Shared Zod Schemas and Server Actions on SitePoint .
SitePointThe Giantsread at source
ESM vs CommonJS in Node: When to Switch and How to Migrate
Learn how Node.js picks ESM or CommonJS, when to migrate, how to fix interop errors like ERR_REQUIRE_ESM, and how to convert a project in stages. Continue reading ESM vs CommonJS in Node: When to Switch and How to Migrate on SitePoint .
AdactioTop Front-end Bloggersread at source
Reading The Pirate Queen by Ariel Lawhon.
AdactioTop Front-end Bloggersread at source
Introducing the Accessible Components Library - TetraLogical
A great little collection of accessible interactive components: dialogs, tabs, accordions, stuff like that. Best of all, the components come with documentation: what problem is solves; when to use it; when not to use it; where to use it, and more. adactio.com/links/22803
David BushellMore Front-end Bloggers3 min read
Cloudflare killed Deno and look Iām on TV!
āāDidnāt you already say goodbye to Deno? Get new material!āāI know, I know, but not even a week after declaring my friendship over with Deno they actually killed Deno! The runtime is going away, and sorry call me pessimistic, but I highly doubt a community fork of any value will survive for long. [ā¦]
Next.js BlogLibraries, Frameworks, etc.read at source
Improving navigation experience in v0 with Next.js 16.4
How we used Partial Prefetching and a coding agent to improve navigation across v0 with Next.js 16.4.
AdactioTop Front-end Bloggersread at source
The Tusks Of Extinction by Ray Nayler
Hot on the heels of reading and enjoying The Mountain In The Sea , I picked up Ray Naylerās next work, this tightly constructed novella. Once again it deals with inter-species communication. This time itās de-extincted mammoths. Once again, itās set in the relatively near future. Many of the same gadgets reappear in this book. It may well be set in the same world. Thereās a tangible atmosphere to this story. But despite itās high-tech premise, itās not escapist. The narrative is driven by the all-too-real issues of ivory poaching and big-game hunting. And this is where I start to get a nagging feeling about Ray Naylerās work. At times it seems to relish in describing the worst that humanity is capable of. It starts to veer into misanthropy. If you yourself are misanthropic, it will just come across as realism. But it feels a bit too easy, a bit too cheap. I remember this happening with Paolo Bacigalupiās books. I enjoyed The Wind-up Girl , but by the time I read The Water Knife , his misanthropy (and misogyny) had become self-parody: Instead of asking what the future might actually be like, it instead asks āwhatās the absolute worst that could happen?ā Frankly, itās a cop-out. The book takes a similar tack with its characters. It assumes everyoneās terrible and will do terrible things. Itās lazy. So youāve got an unrelenting series of people behaving terribly in a horrific setting. It gets boring. The Tusks Of Extinction isnāt that. It manages to maintain a balance. But I hope that the next Ray Nayler book I read wonāt tip over into wallowing in the worst of our species. Iāll find out soon enough. Iāve already got Palaces Of The Crow on loan from the library.
Flavio CopesMore Front-end Bloggersread at source
How to build agents that survive crashes with Pi Durable
Build a durable TypeScript agent with Pi Durable and SQLite. Test crash recovery, avoid duplicate requests, and understand which tools can safely run again.
Go Make ThingsMulti Author Blogs2 min read
The Village
About 14 years ago, we moved out into the rural suburbs. I loved the quiet, the abundant wildlife, and our proximity to farms. I didnāt realize just how often doing anything at all would require a car. The Sprawl Absolutely nothing was walkable. We lived at the very top of a very high hill, so things werenāt really bikeable either. Groceries, restaurants, entertainment, friends, the library, and so on⦠you need to get in a car and drive at least 15 minutes for all of it.
AbduzeedoMulti Author Blogsread at source
Branding: Gunnersbury Park Museum Identity by Wiedemann Lampe
Wiedemann Lampe gave Gunnersbury Park Museum identity a centenary refresh, building it around playful icons and confident yellow wayfinding. The brief had real tension. Gunnersbury is 72 hectares of G...
Bruce Lawson's personal siteMore Front-end Bloggers2 min read
Reading List 362
Yikes, once again itās been ages since I posted a reading list, as Iāve been shuttling between Brussels, London and Lawson Towers a lot. This reading list is courtesy of Vivaldi browser, who pay me decent money to fight for a better web and donāt moan at me for reading all this stuff. Weāve just [ā¦]
Flavio CopesMore Front-end Bloggersread at source
A deep dive into OpenSEO
Explore OpenSEO's architecture: SEO data APIs, Cloudflare Workers, its audit crawler, MCP tools, AI agents, storage, and self-hosting trade-offs.
Flavio CopesMore Front-end Bloggersread at source
How to write an OpenCode plugin with the v2 API
Build your first OpenCode v2 plugin in TypeScript, register a custom tool, validate its inputs, test the logic, and understand how v1 plugins change.
The Mozilla BlogBrowsers, engines, etc.2 min read
This map shows the most important asset that VC-backed companies need right now
Whatās the most vital asset for an AI company today? For venture backed AI business, it might be āfundingā or ārevenueā. But, thereās another asset thatās just as critical: trust. At Mozilla, building technology that people and businesses can genuinely trust has been a long-standing, guiding principle. Thatās why weāre supporting the launch of the Trustworthy [ā¦] The post This map shows the most important asset that VC-backed companies need right now appeared first on The Mozilla Blog .
Frontend Masters BlogMore Front-end Bloggers10 min read
Unlocking AI in Your Apps with TanStack AI
TanStack AI is a strongly typed set of libraries for adding AI features to your apps. Part 1 of this intro covers basic setup and prompting, streaming responses, persisting threads to your database, and resuming a response after a mid-stream refresh.
freeCodeCamp.orgYouTube ChannelsVideoWatch on YouTube
Inside an AI Factory ā Power, Cooling, and GPUs Explained
PiccalilliMore Front-end Bloggersread at source
The Index: Issue #202
Tiny Little Office This is really smart. It's a word processor, along with other common office software like spreadsheets, but it's completely URL powered. Introducing the Accessible Components Library You could not be in better hands than with TetraLogical and they've produced a really good collection of common components, all with thorough documentation, accessibility requirements and testing scenarios. we were online Something we've certainly noticed about this particular morale-draining era is there seems to be a real drive to create websites centered around a shared human experience and long may it continue. What 10,000 home pages put in their head So much about web performance is linked to what's in your which this article (and very useful looking tool) breaks down well. Study explores how AI use affects performance on math and reasoning tasks A worrying read for fans of healthy cognition. A handful of reasons JavaScript wonāt be available Here's one from the Piccalilli archives that you might have missed to wrap up this issue. P.S. this is a good website from personalsit.es . Sponsor message There's been a drive to ship ship ship in this AI era but increasingly that means a lot of volume and very little substance. At Set Studio, we move incredibly fast because we center everything around a solid strategy and work with the amazing capabilities that modern browsers give us, underpinned by progressive enhancement, to make sure every user gets a high quality equitable and accessible experience. We're also the agency behind The Index and Piccalilli because we think it's important to share this way of working with the wider community. With availability opening up in 2027, we're the agency you can actually trust to do right by you and your user base. Reach out to us for a chat and let us show you how. Check out our work
Auth0 BlogCompany/Startup Blogsread at source
On-Behalf-Of Is a Pattern. Token Exchange Is the Standard.
Find out the difference between On-Behalf-Of and OAuth Token Exchange, and why the two are often confused.
Flavio CopesMore Front-end Bloggersread at source
Build vs buy software: when AI can replace a SaaS
AI changes the build-versus-buy calculation, but a working prototype is only part of it. How to compare ownership, maintenance, risk, and recurring costs.
Smashing MagazineThe Giants10 min read
Is Your Organization Messing Up AI Adoption?
What can digital transformation teach us about AI adoption? Paul Boag revisits his book Digital Adaptation to show how lessons from the past can help organizations navigate the challenges of AI today. - AI - Workflow - Business
SitePointThe Giantsread at source
Why AI Agents Break and How to Test Them?
Why AI agents that pass every test still fail in production ā the specific ways they break (compounding errors, lost constraints, false success reports) and how to actually test for it. Continue reading Why AI Agents Break and How to Test Them? on SitePoint .
SitePointThe Giantsread at source
Why AI Is Making Revenue Growth Harder, Not Easier, for Average IT Companies
null Continue reading Why AI Is Making Revenue Growth Harder, Not Easier, for Average IT Companies on SitePoint .
Level AccessCompany/Startup Blogs5 min read
Accessibility Needs an Authority. Why Gartner Named Us a Leader
Level Access has been named a Leader in the inaugural Gartner® Magic Quadrant⢠for Digital Accessibility Platforms, published October 5, 2026. This is The post Accessibility Needs an Authority. Why Gartner Named Us a Leader appeared first on Level Access .
Level AccessCompany/Startup Blogs17 min read
Comparing AI Accessibility Tools for Building and Testing Websites
AI accessibility tools are software that uses machine learning or large language models to help teams find, prioritize, fix, prevent, or report on The post Comparing AI Accessibility Tools for Building and Testing Websites appeared first on Level Access .
Level AccessCompany/Startup Blogs3 min read
Level Access Named a Leader in the Inaugural Gartner® Magic Quadrant⢠for Digital Accessibility
Company positioned highest in Ability to Execute among all vendors evaluated STAFFORD, Va. ā Oct. 16, 2026 ā Level Access, a global provider The post Level Access Named a Leader in the Inaugural GartnerĀ® Magic Quadrant⢠for Digital Accessibility appeared first on Level Access .
HeyDesignerDeveloper/Designer Newsread at source
Interfere design system
Pure UI in the agentic era, Toolcraft, Someone behind the software.
Flavio CopesMore Front-end Bloggersread at source
How to compete with AI-generated SaaS clones
Cheap software clones change what a small SaaS business can charge for. A practical look at differentiation, maintenance, distribution, and earning trust.
Frontend Masters BlogMore Front-end Bloggers3 min read
SVG āLinked Parametersā Will Change How We Do Icon Systems
Maybe we can get back to an img-based icon system?
Auth0 BlogCompany/Startup Blogsread at source
Agentic Development: Time to Shift the Focus
Agents can turn ideas into pull requests in almost no time. The hard part now is deciding what to build and validating that generated code is safe to ship. Here is a risk-based approach to both.
ESLint BlogLibraries, Frameworks, etc.2 min read
ESLint v10.13.0 released
Highlights Several core rules have been updated to report more linting problems. no-use-before-define The no-use-before-define rule has been updated to account for the fact that IIFEs execute immediately by treating them as part of the execution context where they are definedā¦
Google for DevelopersYouTube ChannelsVideoWatch on YouTube
š Explore custom voice narration with Gemini 3.8 Flash TTS
AbduzeedoMulti Author Blogsread at source
Studio Marcus Kraft Unveils Klangwelt Toggenburg Rebrand
Studio Marcus Kraft built the Klangwelt Toggenburg rebrand around a dynamic typeface whose letters expand and scatter like sound in the Alps. The key visual says everything in one frame: the wordmark ...
AdactioTop Front-end Bloggersread at source
The Mountain In The Sea by Ray Nayler
Back in 2019 , I read the book Other Minds: The Octopus, the Sea, and the Deep Origins of Consciousness by Peter Godfrey-Smith and said: I really enjoyed this evolutionary tale. Itās equal parts biology and philosophy. I will never look at cephalopods quite the same way again. Reading Ray Naylerās The Mountain In The Sea reminded so much of that book that I couldnāt resist flipping ahead to the acknowledgements at the back. Sure enough, Other Minds gets a big shout-out. But thatās only part of the make-up of The Mountain In The Sea . Thereās just as much William Gibson as Peter Godfrey-Smith. I donāt just mean that the book is an unexpectedly rip-roaring cyberpunk thrillerāwhich it isābut that itās also got that Gibsonian narrative structure; three disconnected protagonists in three separate stories that you just know are going to connect before the book is done. The great accomplishment of this book is how well it balances the two genres of philosophy and cyberpunk. Thereās plenty of musings on the nature of consciousness, be it human, octopus, or artificial intelligence. But thereās also plenty of high-tech hacking shenanigans. Above all, itās an excellent example of one of my favourite subgenres of science fiction: first contact . Itās as linguistically satisfying as Ted Chiangās Story Of Your Life , the pinnacle of the first-contact subgenre. The fact that there are no extra-terrestrial species just adds to its realism.
SitePointThe Giantsread at source
Responsive Typography With Modern CSS: Create Readable Interfaces Without Excessive Media Queries
null Continue reading Responsive Typography With Modern CSS: Create Readable Interfaces Without Excessive Media Queries on SitePoint .