Today
Front-end, in one read.
The latest from the sources worth following, newest first.
DEV CommunityThe Giantsread at source
Design Publishing Queues That Survive Image Provider Outages
A publishing queue should not forget an article because a photo API had a bad afternoon. Quick solution: if ( providerError . isTransient ) { return queue . defer ({ state : " MEDIA_PENDING " , retryAfter : " 1h " }); } The retry design must respect Cloudflare Workflow limits and the provider's Pexels API documentation ; provider failure does not decide whether the article itself is valid. Yet that is exactly what happens when a pipeline treats every missing hero image as "invalid content." The article may be complete. The metadata may be valid. The internal links may pass. The only failure is an external media provider returning no usable result, a rate-limit response, or a temporary server error. That is not the same class of failure as a malformed article. The queue should preserve the article and defer the media stage . Separate source validity from media availability A clean pipeline asks two different questions: Is the article publishable? Is a valid hero asset available right now? ~~~ The first question is editorial. The second depends partly on external systems. If you merge them into one boolean, this happens: ~~~text article valid photo provider unavailable => source rejected => next topic generated ~~~ Now a temporary outage has changed editorial history. A better state model is: ~~~text VALIDATED MEDIA_PENDING MEDIA_SELECTED READY_TO_PUBLISH PUBLISHED ~~~ The article identity stays the same while the media stage retries. ## Classify media failures Not every visual failure deserves a retry. ### Retryable - provider 429 rate limit; - temporary 5xx response; - network timeout; - provider returns zero acceptable results for one query; - asset download temporarily fails; - deployment check is still pending. ### Deterministic repair - selected asset already used when uniqueness is required; - wrong dimensions; - missing attribution; - stale manifest hash; - unsupported media type. ### Terminal for that candidate - license does not allow the intended use; - source URL cannot be established; - raster is corrupt; - asset content is clearly irrelevant; - provider explicitly rejects the request. A terminal candidate is not necessarily a terminal article. Select another asset. ## Bound provider retries External APIs need retry budgets. Pexels’ [API documentation](https://www.pexels.com/api/documentation/) currently documents default API limits of 200 requests per hour and 20,000 per month. A publisher that retries without bounds can turn temporary scarcity into a quota problem. Cloudflare’s [Workflow limits](https://developers.cloudflare.com/workflows/reference/limits/) are a separate runtime ceiling, so keep provider quotas and orchestration limits distinct. Use a fixed strategy such as: ~~~text query 1 -> retry transient failure up to 2 times query 2 -> try one alternate search phrase reviewed catalog -> use only if a genuinely relevant asset exists otherwise -> MEDIA_PENDING ~~~ Do not keep changing the query forever inside one Workflow instance. The purpose of retries is to absorb transient noise, not to search the entire internet before the run can finish. ## Keep the source queued When media is unavailable, persist the article in a state that makes the next run resume it. Do not delete the source, mark it duplicate, move to a new topic, create another draft with the same intent, or reset the article ID. A durable record needs enough identity to resume: ~~~yaml article_id: art_example slug: example-article state: MEDIA_PENDING revision: 2 visual_attempts: 3 ~~~ Whether this lives in Git, Workflow state, or another durable store depends on the architecture. The invariant is the important part: the article survives. ## Reuse reviewed assets carefully A local catalog can reduce provider dependence. If the catalog already contains an unused or reusable raster that is genuinely relevant and its license permits reuse, it may be a better fallback than another external request. But "available" is not enough. Check topic relevance, provider/source URL, license, attribution, byte hash, dimensions, reuse rules, and whether the same visual is already overused. Never reuse an unrelated image simply to make the pipeline green. ## Bind provenance when selection succeeds Once an asset is selected, record the evidence immediately. Useful fields include: ~~~yaml provider: Pexels source_url: https://www.pexels.com/photo/... license_url: https://www.pexels.com/license/ attribution: Photo by ... article_id: art_example ~~~ After downloading the final raster, add the MIME type, width, height, byte count, and SHA-256 of the transformed file. The first block explains where the image came from. The second explains exactly which bytes the publication uses. Do not invent file metadata before the file exists. ## Avoid duplicate work after uncertain responses Media providers and storage APIs can fail after doing the work. Example: ~~~text download completes network layer times out before caller records success retry starts same image downloaded again under another asset ID ~~~ Use stable stage identity. If an asset selection has already been recorded for article A revision 3, the retry should inspect that record before searching again. Likewise, if the final raster already exists and its hash matches the intended manifest, verify it instead of creating another copy. This is the same idempotency principle used throughout [Building a Reliable Batch Publishing Workflow](https://raylabs.app/articles/building-a-reliable-batch-publishing-workflow/). ## Verify the actual raster, not provider metadata A provider response can describe the original photograph, while your pipeline may crop or resize it. The publication should bind to the final transformed bytes, not merely the provider metadata. After transformation: 1. decode the file; 2. read actual dimensions; 3. compute byte length; 4. compute SHA-256; 5. update the asset manifest; 6. verify the article points to that asset. The provider page remains provenance. The transformed file becomes publication evidence. ## Keep provider outages out of editorial scoring A photo API outage says nothing about whether an article has information gain. Do not lower article quality, factual confidence, duplicate status, or rank-potential merely because an image API is unavailable. Instead report the failure in the stage that owns it: ~~~text editorial: PASS research: PASS visual: DEFERRED_PROVIDER publication: PENDING ~~~ This makes the blocker understandable to both humans and automation. ## Verify after deployment A queue is not finished when the image reaches Git. After deployment, fetch the public hero URL and verify a successful response, correct content type, decodable bytes, expected dimensions, and that the expected article actually references it. If the article is live but the asset is stale, keep the same publication pending until the intended raster is visible. That exact-version discipline is part of [Designing a Reliable Serverless AI Publishing Workflow](https://raylabs.app/articles/designing-a-reliable-serverless-ai-publishing-workflow/). ## Design for a provider-independent future Do not let one provider's response schema leak across the whole publishing system. Normalize a candidate: ~~~ts type ImageCandidate = { provider: string; sourceUrl: string; downloadUrl: string; attribution: string; licenseUrl: string; width?: number; height?: number; }; ~~~ Then the rest of the pipeline can perform relevance checks, dedupe, transforms, manifest binding, and deployment verification without caring where the candidate came from. That makes adding a second provider a local adapter change instead of a workflow rewrite. ## A practical recovery algorithm When an article reaches the visual stage: ~~~text 1. inspect existing bound asset 2. if healthy -> continue 3. inspect reviewed catalog for relevant candidate 4. if found -> bind, transform, verify 5. otherwise query provider within request budget 6. reject duplicates or invalid provenance 7. transform final raster 8. validate bytes and dimensions 9. if provider unavailable -> MEDIA_PENDING 10. retry same article later ~~~ The crucial line is number 10. When maintaining these pipelines, teams should also review policies for [preventing search intent](https://raylabs.app/articles/preventing-search-intent-duplicates-in-automated-publishing/) duplicates in automated systems to ensure safe retries. ## Verification and execution checklist - Inspect the active article state to confirm `MEDIA_PENDING` is recorded instead of deleting the draft. - Verify that external API calls respect rate-limit thresholds and orchestration timeouts. - Confirm that transformed asset hashes match the recorded manifest before deployment. - Check public staging endpoints to ensure the final raster is accessible and correctly linked.
DEV CommunityThe Giantsread at source
I built ClientScout to help find the next client
You can build a website for a business. Finding the business to build it for is where things get a little harder. So I built ClientScout to give freelancers somewhere to start. You tell it what you do, who you want to help, and where to look. It finds businesses that could be a fit and puts the useful details in one place. The pitch is simple: I find you clients. You do your thing. This is a submission for the Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle . What I Built ClientScout helps freelancers and small agencies find potential business customers. Someone selling websites, photography, social media services, or bookkeeping can describe their offer and get a shortlist to work through. For example, you could search for guesthouses around Galle that might be relevant to a direct-booking website service. Each profile shows the business, its location, public contact details when available, and why it could fit your offer. The idea is to make the research before outreach easier. Instead of keeping a dozen search tabs open and copying details into a spreadsheet, you can review the businesses together and keep the ones that interest you. Open a profile to see the evidence, a possible opening, and what you still need to check. A relevant business isn't necessarily looking to buy, so the app keeps that distinction visible. You can save prospects in your browser, filter the shortlist, export a CSV, or prepare an introduction. The introduction is editable, and nothing gets sent automatically. I think this could be useful to someone who needs a few relevant businesses to approach each week. I haven't tested paid demand yet, but that's the problem I'd want a paid version to solve. Demo Try ClientScout Try describing an offer, choosing a type of business and a location, then running a search. Open a profile, check its sources, and save a business you'd want to look into. The GIF and workspace screenshots use the app's labelled fictional example. You can open it with Take a look first to explore without using search quota. Live searches use public business listings. The hosted demo has a small shared search allowance. It's on Render's free service, so it can take a little longer to wake up after being idle. Code notlakshitha / clientscout I find you clients/customers — Next.js prospect discovery powered by Gemini and Google Search grounding ClientScout I find you clients. You do your thing. You can know exactly what you want to sell and still have no idea who to offer it to. ClientScout takes your offer, a type of business, and a location, then builds a small shortlist of potential customers with a reason to look closer. Think websites for guesthouses in Galle, photography for cafés in Colombo, or bookkeeping for independent shops. It helps with the research before the first conversation. It doesn't promise anyone wants to buy. Open ClientScout · Explore the example workspace Try it The landing page is at / . The workspace is at /app . Choose Take a look first for an example with clearly labelled fictional businesses. That works without API keys. For live searches: npm ci cp .env.example .env.local # Add your own server-side API keys to .env.local npm run dev Open localhost:3000 . Use Node.js… View on GitHub It's built with Next.js, React, TypeScript, and plain CSS. The code is MIT licensed, with setup instructions in the repository. How I Built It SerpApi searches Google Maps for the requested business type and location. That gives the app public listing details to work with, including names, addresses, websites, and phone numbers when listed. Gemini reads those listings alongside the user's offer and turns them into structured profiles. The server matches each profile back to a listing and takes the contact details from that record. It drops unmatched business names and doesn't let the model fill missing contacts with guesses. The listing search doesn't collect email addresses. Gemma 4 reviews how each business fits the offer. It suggests a possible opening and explains what's still unknown, such as the business's current setup or interest in the service. That assessment is separate from the factual contact fields. The hosted app uses gemma-4-26b-a4b-it through Google's API. A live test returned three guesthouses around Galle with public listing phone numbers and source links. Render hosts the Next.js app and its server routes. API keys stay on the server. Saved prospects stay in browser storage, so you don't need an account to try the workspace. Why Does Open Innovation Matter? I wanted to keep the part that decides what makes a useful prospect easy to change. Gemma is an open-weight model, and its review is a separate stage with its own prompt and model setting. That lets me change how it assesses an offer without changing where business details come from. During testing, I switched from the 31B model to the 26B model after the larger endpoint failed on a full review. The listing and contact handling stayed the same. The available weights also leave room to serve or adapt that model later. This version uses hosted inference, so it still needs an internet connection and sends the brief to the configured providers. Local inference isn't implemented yet. Prize Categories Best Use of Gemma — Gemma 4 reviews business relevance and suggests an opening while keeping unknowns visible. Best Use of SerpApi — Finds public business listings through live Google Maps search. Best Use of Render — Hosts the Next.js app and server routes, with API keys configured on the server. What I Hope Comes From It I'd like someone who's good at their work but stuck on finding clients to get a useful starting point from this. The next step is to put it in front of freelancers and see which prospects they keep, which they skip, and whether it saves them time. Finding the next client still takes a conversation. I want ClientScout to make it easier to get to that conversation.
DEV CommunityThe Giantsread at source
Resize Observer and Mutation Observer
The Dynamic Duo of the DOM: Mastering Resize Observer and Mutation Observer Ever felt like your web page was a shy chameleon, struggling to adapt to its ever-changing environment? Maybe you’ve battled with JavaScript that felt like wrestling an octopus just to know when an element’s size changed, or perhaps you’ve spent hours debugging why your dynamic content wasn’t being picked up by your scripts. If this sounds familiar, then let me introduce you to your new best friends: Resize Observer and Mutation Observer . These two unsung heroes of the modern web are powerful APIs that allow you to observe changes happening within your Document Object Model (DOM) without the constant need for polling or overly complex event listeners. Think of them as your vigilant guardians, quietly watching for specific events and promptly alerting you when something noteworthy occurs. In this deep dive, we’ll unravel the magic of these observers, understand when and why you’d reach for them, and arm you with the knowledge and code snippets to wield them like a seasoned web wizard. So, grab a coffee, settle in, and let’s explore the fascinating world of DOM observation! Introduction: Why Bother with Observers? Historically, dealing with DOM changes could be a bit of a pain. Resizing elements: If you wanted to know when an element’s dimensions changed (e.g., due to a window resize, a browser zoom, or the user resizing a div), you’d often resort to listening for the resize event on the window object. This is fine, but it’s a blunt instrument. You’d have to manually check the dimensions of every element you cared about within that event handler, which can be inefficient, especially on complex pages. Content changes: When new elements were added, removed, or attributes were modified dynamically, keeping your JavaScript in sync was a challenge. You might have had to re-query the DOM, re-attach event listeners, or implement complex polling mechanisms. Resize Observer and Mutation Observer were born out of the need for more precise, efficient, and declarative ways to react to these DOM fluctuations. They offer a more performant and less intrusive way to manage dynamic web content. The Prerequisites: What You Need to Know Before we dive headfirst into the code, a little foundational knowledge will make things smoother: Basic JavaScript: You should be comfortable with JavaScript fundamentals, including functions, variables, and DOM manipulation (e.g., document.getElementById , appendChild , removeChild ). Understanding the DOM: A solid grasp of what the DOM is and how elements are structured within it is crucial. Modern Browser Support: Both Resize Observer and Mutation Observer are well-supported in modern browsers. However, if you need to support older browsers, you might need to consider polyfills, though this is becoming less common. Section 1: Resize Observer – The Dimension Detective Imagine you have a flexible layout, a widget that needs to adjust its content based on its available space, or an image gallery that needs to re-render thumbnails when the container size changes. This is where Resize Observer shines. What is Resize Observer? Resize Observer is a powerful JavaScript API that allows you to asynchronously observe changes to the dimensions of elements. It fires a callback function whenever the size of one of the observed elements changes. This includes changes to its contentRect , borderBoxSize , and contentBoxSize . The Magic of the Callback The core of Resize Observer is its callback function. This function receives an array of ResizeObserverEntry objects, one for each element that has changed. Each ResizeObserverEntry object provides valuable information about the observed element's new dimensions. Here’s a simplified look at the callback signature: const resizeObserver = new ResizeObserver (( entries ) => { for ( const entry of entries ) { // 'entry' is a ResizeObserverEntry object console . log ( ' Element size changed: ' , entry . target ); console . log ( ' New dimensions: ' , entry . contentRect ); // More accessible in older specs // Newer specs provide more granular details: console . log ( ' Content Box Size: ' , entry . contentBoxSize ); console . log ( ' Border Box Size: ' , entry . borderBoxSize ); } }); How to Use It: A Step-by-Step Guide Create a Resize Observer instance: const observer = new ResizeObserver ( entries => { // Your logic here to handle size changes for ( let entry of entries ) { console . log ( `Element ${ entry . target . id } has resized!` ); // You can access various properties of the entry console . log ( ' Content Rect: ' , entry . contentRect ); // For more precise measurements, use borderBoxSize or contentBoxSize if ( entry . contentBoxSize ) { const contentBox = entry . contentBoxSize [ 0 ]; // Assuming horizontal-writing mode console . log ( `New width: ${ contentBox . inlineSize } , New height: ${ contentBox . blockSize } ` ); } } }); Target the elements you want to observe: You can observe one or multiple elements. const myElement = document . getElementById ( ' myResizableDiv ' ); const anotherElement = document . querySelector ( ' .flexible-widget ' ); observer . observe ( myElement ); observer . observe ( anotherElement ); Perform actions when dimensions change: Inside the callback, you can trigger any JavaScript logic you need. This could be: Adjusting CSS styles. Re-rendering charts or canvases. Fetching new data if the layout dictates. Updating UI elements. const observer = new ResizeObserver ( entries => { for ( let entry of entries ) { if ( entry . target . id === ' myResizableDiv ' ) { const newWidth = entry . contentRect . width ; if ( newWidth 300 ) { entry . target . style . fontSize = ' 12px ' ; } else { entry . target . style . fontSize = ' 16px ' ; } } } }); const resizableDiv = document . getElementById ( ' myResizableDiv ' ); observer . observe ( resizableDiv ); Stop observing (when you're done): It’s good practice to unobserve elements when they are no longer needed to prevent memory leaks. observer . unobserve ( myElement ); // To stop observing a specific element // To stop observing all elements and disconnect the observer: observer . disconnect (); When to Use Resize Observer: The Use Cases Responsive Design Helpers: While CSS media queries are king for layout, Resize Observer can be a powerful supplement for JavaScript-driven responsive behaviors within components. Third-Party Widgets: If you’re embedding a widget that needs to adapt to its container size, Resize Observer is the way to go. Drag-and-Drop Interfaces: When users are resizing elements with drag handles, this observer can ensure the content within the resized element updates correctly. Data Visualization: Charts and graphs often need to re-render or adjust their axes and labels when their container changes size. Layout Adjustments: Dynamically calculating positions or dimensions of elements based on their current size. Advantages of Resize Observer Performance: It’s asynchronous and efficient. It only triggers when actual size changes occur, avoiding the overhead of polling. Granular Control: You get precise information about the element’s dimensions. Declarative: You declare what you want to observe, and the browser handles the rest. Element-Specific: You can observe individual elements, making it very targeted. Disadvantages of Resize Observer No Window Resize Event: It doesn't directly listen for the window.resize event. You still might need to combine it with window.resize if you need to trigger broader layout adjustments. Browser Support (Minor Concern): While excellent now, always be mindful of your target audience’s browser versions. Section 2: Mutation Observer – The Content Custodian Now, let’s shift our attention to another crucial aspect of dynamic web pages: content modification . What if you have a chat application where new messages are constantly being added? Or a dashboard that updates data dynamically? Or perhaps a JavaScript framework that injects or removes DOM elements? This is where Mutation Observer becomes your indispensable ally. What is Mutation Observer? Mutation Observer is an API that provides a way to react to changes made to the DOM . It allows you to watch for specific types of mutations (additions, removals, attribute changes) within a target node and its descendants. When a mutation occurs, it triggers a callback function. The Power of the Callback (Again!) Similar to Resize Observer, Mutation Observer also relies on a callback function. This callback receives an array of MutationRecord objects, each detailing a specific change that happened. Here’s a peek at the callback: const mutationObserver = new MutationObserver (( mutationsList , observer ) => { for ( const mutation of mutationsList ) { if ( mutation . type === ' childList ' ) { console . log ( ' A child node has been added or removed. ' ); // mutation.addedNodes and mutation.removedNodes are useful here } else if ( mutation . type === ' attributes ' ) { console . log ( `The ${ mutation . attributeName } attribute was modified.` ); // mutation.oldValue can be useful if observed } else if ( mutation . type === ' characterData ' ) { console . log ( ' Character data (text content) changed. ' ); } } }); How to Use It: A Step-by-Step Guide Create a Mutation Observer instance: You need to specify the types of mutations you want to observe. const observer = new MutationObserver (( mutations , obs ) => { mutations . forEach ( mutation => { console . log ( `Mutation type: ${ mutation . type } ` ); if ( mutation . type === ' childList ' ) { console . log ( ' Nodes added: ' , mutation . addedNodes ); console . log ( ' Nodes removed: ' , mutation . removedNodes ); // You can iterate through addedNodes and perform actions mutation . addedNodes . forEach ( node => { if ( node . nodeType === Node . ELEMENT_NODE ) { console . log ( `New element added: ${ node . tagName } ` ); // Attach event listeners, process content, etc. } }); } else if ( mutation . type === ' attributes ' ) { console . log ( `Attribute ${ mutation . attributeName } changed from ${ mutation . oldValue } to ${ mutation . target . getAttribute ( mutation . attributeName )} ` ); } else if ( mutation . type === ' characterData ' ) { console . log ( `Text content changed.` ); } }); }); Target the element to observe and configure options: You specify the target node and an options object to define what to watch for. const targetNode = document . getElementById ( ' contentArea ' ); const config = { attributes : true , // Observe attribute changes childList : true , // Observe additions/removals of child nodes subtree : true , // Observe all descendants characterData : true , // Observe text content changes attributeOldValue : true , // Record the old value of attributes characterDataOldValue : true // Record the old value of text content }; observer . observe ( targetNode , config ); Perform actions based on mutations: Inside the callback, you can do a variety of things: Process newly added content: If new elements appear, you might need to apply specific styling, attach event listeners, or extract data. Update UI: If attributes change (e.g., a class name that controls visibility), you can react accordingly. Sync external systems: If your web app interacts with other services, mutations might trigger updates. Handle dynamic forms: Adding or removing form fields. const listContainer = document . getElementById ( ' messageList ' ); const observer = new MutationObserver ( mutations => { for ( const mutation of mutations ) { if ( mutation . type === ' childList ' ) { mutation . addedNodes . forEach ( node => { if ( node . classList . contains ( ' new-message ' )) { console . log ( ' New message arrived: ' , node . textContent ); // Maybe scroll to the bottom of the list listContainer . scrollTop = listContainer . scrollHeight ; } }); } } }); observer . observe ( listContainer , { childList : true , subtree : true }); Stop observing: Just like with Resize Observer, disconnect when you're done. observer . unobserve ( targetNode ); // Stop observing a specific node observer . disconnect (); // Disconnect the observer entirely When to Use Mutation Observer: The Use Cases Dynamic Content Loading: When content is loaded via AJAX or WebSockets (e.g., chat messages, infinite scroll). Framework Integrations: Many JavaScript frameworks heavily rely on DOM manipulation, and Mutation Observer can be used to react to these changes. Content Management Systems (CMS): When content is updated dynamically within an editor. Live Updates: Any scenario where elements are added, removed, or modified in real-time. Debugging and Analysis: Understanding how other scripts are modifying the DOM. Advantages of Mutation Observer Real-time Updates: React instantly to changes in the DOM. Efficiency: Avoids the performance hit of constantly polling the DOM. Granular Control: You can specify exactly which types of mutations you care about. Powerful Options: subtree , attributes , childList , characterData give you fine-grained control over what’s observed. Disadvantages of Mutation Observer Can Be Overwhelming: If you observe too much with subtree: true and broad configurations, you might trigger your callback too often, leading to performance issues. Careful configuration is key. Complexity in Handling Multiple Mutations: When multiple mutations happen in quick succession, your callback might receive several MutationRecord objects. You need to process them efficiently. Doesn’t Handle CSS-Driven Changes: If a change is purely driven by CSS (e.g., a display: none set by a media query), it won’t trigger a mutation unless the class or style attribute itself changes. Section 3: The Best of Both Worlds – When to Combine Them Sometimes, the dynamic nature of your web application calls for both Resize and Mutation Observers. Scenario: Imagine a rich text editor where users can insert various blocks of content. When a new block is inserted (Mutation Observer), you might also want to check its dimensions to ensure it fits within the visible area and potentially adjust its layout (Resize Observer). // Observe mutations (e.g., new content blocks added) const mutationObserver = new MutationObserver ( mutations => { for ( const mutation of mutations ) { mutation . addedNodes . forEach ( node => { if ( node . classList && node . classList . contains ( ' rich-text-block ' )) { console . log ( ' New rich text block added: ' , node ); // Now, observe the newly added block for size changes resizeObserver . observe ( node ); } }); } }); // Observe resize changes for elements that might need layout adjustments const resizeObserver = new ResizeObserver ( entries => { for ( const entry of entries ) { console . log ( ' Rich text block resized: ' , entry . target ); // Logic to adjust layout or content based on new size if ( entry . contentRect . width 200 ) { entry . target . style . padding = ' 5px ' ; } else { entry . target . style . padding = ' 10px ' ; } } }); const editorContentArea = document . getElementById ( ' editor ' ); mutationObserver . observe ( editorContentArea , { childList : true , subtree : true }); // Initially observe any existing blocks document . querySelectorAll ( ' .rich-text-block ' ). forEach ( block => { resizeObserver . observe ( block ); }); This synergy allows you to build highly interactive and adaptive user interfaces. Conclusion: Embrace the Power of Observation! Resize Observer and Mutation Observer are not just fancy buzzwords; they are fundamental tools for building modern, dynamic, and performant web applications. They empower you to move away from inefficient polling and embrace a more declarative and event-driven approach to managing your DOM. Resize Observer is your go-to for anything related to element dimensions and their impact on your UI. Mutation Observer is your guardian for when content itself changes – elements are added, removed, or their attributes/text are modified. By understanding their capabilities, mastering their APIs, and knowing when to combine them, you can significantly enhance your web development workflow, create smoother user experiences, and build more robust and responsive applications. So, go forth and observe! Your DOM will thank you for it. Happy coding!
DEV CommunityThe Giantsread at source
Ramp’s $60 Billion Lesson: Build Where Decisions Become Money!
Most software arrives after something has happened. The money has been spent. The invoice has been issued. The subscription has renewed. Then a beautiful dashboard explains what went wrong. But what happens when software gets there before the money moves? Ramp offers a compelling example. Its documented capabilities—from merchant-specific card restrictions to invoice approval workflows—show how financial software can move from observing spending to shaping the conditions under which spending happens. support.ramp On October 15, 2026, Ramp announced a $1.85 billion funding round at a $60 billion valuation , up from $44 billion in June. That is a private financing valuation—not a public market capitalization, and certainly not proof that investors have priced the company correctly. But it raises a question worth every developer’s attention: What, exactly, is being built here? prnewswire My argument is architectural, not a claim about what motivated every investor: Ramp’s advantage is not simply that it knows about spending. It can enforce rules at important points before spending occurs. To understand why that matters, we need to look beyond the corporate card. 1. A Dashboard Is a Camera. A Spending Control Is a Brake. Imagine two products. The first tells a finance team: “Three departments purchased overlapping software subscriptions this month.” The second checks before the next purchase: Is this merchant allowed? Is there enough budget? Does the amount exceed the authorized limit? Does this purchase require another approval? One observes. The other can intervene. For Ramp, this distinction is more than a metaphor. Its documentation describes merchant restrictions, merchant-category restrictions, transaction limits, budget periods, and spending cutoff dates. Transactions that violate certain configured restrictions are declined. support.ramp Architecturally, that means organizational policy can become part of the conditions under which a payment is allowed to execute. Reporting-oriented workflow: Spend → Record → Categorize → Discover problem → Attempt correction Control-oriented workflow: Define authority → Check constraints → Allow or decline → Record → Reconcile This is a simplified comparison of two design approaches, not a diagram of Ramp’s internal infrastructure. There is an important limitation: preventive controls do not eliminate the need for detective controls. A merchant restriction cannot establish whether a purchase was genuinely necessary. An amount limit cannot prove that the purchased service was delivered. Ramp itself combines card controls with expense-review policies and approval workflows. support.ramp The lesson is not to replace visibility with restrictions. The brake does not make the camera unnecessary. It makes the camera insufficient as the only safety mechanism. 2. Do Not Confuse Product Capabilities With Internal Architecture Successful companies invite a particular kind of technical mythology. We see several impressive features and immediately infer the architecture we would like them to have: “They must be event-sourced.” “They must have one universal ledger.” “Everything must run on one shared data model.” Maybe. But product integration is not proof of a specific implementation. The public materials examined here describe connected workflows, ERP synchronization, and relationships between invoices, approvals, and payments. They do not, by themselves, establish a particular ledger architecture or event-storage strategy. ramp We should separate: What Ramp publicly documents. What we would recommend when designing a system in this category. That distinction does not make the story less interesting. It makes it useful to engineers. From this point forward, discussions of atomic budget reservations, idempotency, and event models are proposed design patterns—not claims about Ramp’s private implementation. 3. The Hard Part Is Not Moving Money. It Is Preserving Its Meaning. A transaction row tells you: “$2,400 was paid.” An organization needs to know much more: Who requested it? Which project needed it? Which budget funded it? Who approved it? Which contract justified it? Were the goods or services received? Which accounting entry should represent it? Ramp’s accounts payable product brings invoice extraction, purchase-order matching, approval workflows, payments, and accounting synchronization into a connected workflow. According to the company, its approval agent also uses vendor history, contracts, and purchase-order matches to prepare decision context. ramp The architectural implication is powerful: The useful design unit is not merely the transaction. It is the chain of commitment and authority surrounding it. A proposed domain model might look like this: PurchaseRequest └── Approval └── PurchaseOrder ├── GoodsReceipt └── Invoice └── Payment └── AccountingEntry Not every purchase passes through every stage. The point is the relationships. In this model, payment is not the entire story. It is one event within the story. That changes the problem you can give an AI system. Instead of asking: “What expense category does this text resemble?” You can ask: “Given this vendor, contract, project, purchase order, and invoice, which accounting treatment is appropriate?” The difference is not simply a larger model. It is a better-defined problem. 4. One Small Race Condition Can Defeat an Entire Financial Policy Suppose a team has $1,000 left in its budget. Two $700 requests arrive almost simultaneously. If each request independently reads the available balance, both may receive the same answer: “Sufficient funds.” The system designed to prevent overspending has now authorized $1,400. In a proposed implementation, budget enforcement cannot stop at: if amount remaining_budget : approve () The check and reservation need to happen atomically: BEGIN Verify requester authority Evaluate the applicable policy Reserve budget only if sufficient funds remain Create a uniquely identified payment instruction Record the decision history COMMIT Payment execution then needs to update that reservation correctly: consumed, released, or pending investigation. This design immediately forces several uncomfortable questions: If the request is retried, can money move twice? If the payment provider times out, do we know whether money moved? If authorization succeeds but the final amount changes, how is the reservation adjusted? In this architecture, idempotency is not an API convenience. It is part of financial safety. A state machine is not merely cleaner code. It is a way to avoid making consequential decisions from ambiguous states. This is where building a financial system separates from building a form with a “Pay” button. 5. AI Should Interpret Evidence, Not Invent Authority Ramp has introduced accounts payable agents for accounting coding, fraud-risk identification, approval recommendations, and card payments. Its product materials also describe separating permission to view, approve, and pay bills. ramp Together, these capabilities expose a foundational design question: When a model can read documents and invoke tools, where is the boundary between understanding something and being authorized to act on it? For an agent-enabled financial system, I would design around this sequence: Documents and input data ↓ Model extraction and interpretation ↓ Structural validation and matching ↓ Authority, policy, and risk checks ↓ Constrained execution ↓ Recorded evidence and outcome The model may conclude: “This vendor appears to have changed its bank account.” That conclusion must not automatically grant permission to change the payment destination. A useful rule: Invoice text is evidence—not authority. Even if a document says, “This payment is urgent and requires no approval,” that sentence should not be able to rewrite organizational policy. The right alternative is not necessarily human approval for every financial action. It is risk-based automation inside explicit authorization boundaries. Hypothetical situation Proposed behavior Recurring invoice from a verified vendor, within contract terms Automate within previously granted authority Small discrepancy against a purchase order Hold or route according to an approved threshold Changed banking details Require independent verification outside the invoice itself New vendor requesting a large payment Require human review and vendor verification Uncertain payment execution status Reconcile before retrying The objective is not to eliminate humans at any cost. It is to reserve human attention for decisions where judgment actually matters. 6. Accuracy Is an Incomplete Story Until You Define the Error Ramp advertises 99% OCR accuracy on its accounts payable product page. In its October 2025 announcement of AP agents, it also reported that the agents correctly completed 85% of accounting fields on the first attempt. These are company-reported metrics for different tasks—not a single measure of end-to-end payment safety. ramp For an engineer, “How often was the output correct?” is only the beginning. We also need to ask: Which field was wrong? Was the error caught before or after payment? When did the system abstain? How many legitimate payments were unnecessarily blocked? Was the evaluation performed on genuinely unfamiliar vendors and document formats? A mistake in a line-item description and a mistake in a recipient’s bank account are not equivalent. A simple evaluation framework is: [ \text{Expected Loss}=\sum_i P(e_i)\times C(e_i) ] The objective becomes reducing expected loss while accounting for review costs and operational delays—not simply maximizing average accuracy. That should change the product. A model that stops when evidence is ambiguous may look less impressive in a demo. In a financial workflow, that pause may be one of its most valuable capabilities. Enterprise intelligence is not just knowing the answer. It is knowing when you do not have the authority to act. 7. The Business Model Contains a Real Tension Ramp says its primary revenue sources are card usage and Ramp Plus subscriptions. It may also earn revenue from additional services, such as international or same-day payments. Its card is a charge card, and the company says it does not earn interest on revolving card balances. support.ramp So “Ramp does not charge users fees” is too broad. A free entry-level product exists, while advanced capabilities and certain payment methods carry charges. ramp But the deeper tension remains: How can a company earn revenue from spending while selling savings? One possible answer is that reducing a customer’s total spending does not necessarily reduce the volume flowing through the platform. Consider a hypothetical organization: It previously spent $10 million. Only $2 million flowed through one platform. It now reduces total spending to $9 million. But $6 million flows through that platform. The customer spends less. The platform processes more. This illustrates how incentives can align. It does not eliminate every conflict. When a product recommends paying an invoice by card, the customer still needs to evaluate fees, vendor terms, and net benefit. Ramp itself describes its payment agent in terms of identifying card-payment and cashback opportunities. ramp A serious analysis should examine both sides: The value created for the customer—and the mechanism through which the provider gets paid. 8. What the $60 Billion Number Does—and Does Not—Tell Us In its October 15 announcement, Ramp reported: More than $2 billion in annualized revenue. Positive cash flow. More than 85,000 customers. More than $275 billion in annualized purchase volume. prnewswire Two distinctions matter. First, annualized revenue is not the same as revenue realized over a completed financial year. Second, annualized purchase volume should not be treated as every dollar moving through the platform. Ramp states that the metric excludes bank transfers and non-monetized payments. Its announced revenue definition includes interchange, subscription revenue, interest income, and other revenue, while excluding customer incentives. prnewswire Those definitions are not footnotes to the story. They determine what comparisons are meaningful. A $60 billion valuation does not prove the architecture is flawless, the competitive advantage permanent, or the investment attractively priced. But the reported operating scale does show that this is no longer simply a receipt-management tool. Customers are entrusting it with a broader portion of their financial workflows. According to the company, a majority now use two or more Ramp products. prnewswire For product builders, the interesting possibility is this: When each new capability enriches the context available to existing capabilities, expansion can become more than adding another menu item. It can strengthen the decision-making system. 9. The Next Spending User May Not Be Human So far, we have mostly discussed people using software to spend money. Ramp now also describes agent cards: tokenized virtual cards available to AI agents through APIs or MCP, with spending limits, merchant controls, and the user’s approval chain. ramp At that point, the central question changes. It is no longer only: “How intelligent is the agent?” It becomes: “What can it authorize, on whose behalf, up to what amount, and under which conditions?” For a proposed implementation, I would prefer to model agent authority as a constrained contract: agent : procurement-assistant owner : operations-manager purpose : approved-office-supplies budget : monthly_limit : 500 currency : USD permissions : approved_merchants_only : true create_vendor : false change_bank_details : false escalation : new_vendor : human_review amount_above_100 : human_review ambiguous_payment_status : stop_and_reconcile This is an illustrative design—not Ramp’s actual API configuration. But the underlying question matters: Is the agent merely suggesting actions, or is it an identity capable of consuming organizational resources? If it is the latter, we need to engineer its authority. A better prompt is not a substitute for a permission boundary. 10. The Builder’s Lesson: Find the Decision Point The superficial lesson from Ramp would be: “Find a large market and add AI.” The more useful lesson is: “Find a workflow where decisions, authority, and consequences have become disconnected.” For a new project, I would start with these questions: Where does the user make a decision that must be executed in another system? Which expensive mistakes are currently discovered only afterward? Which constraints could be enforced before execution? What context must remain attached to the decision so it can be explained later? How will retries, timeouts, and partial failures avoid producing duplicate consequences? Which steps require probabilistic interpretation, and which should remain deterministic and constrained? These questions are not glamorous. They lead to budget reservations. Unique identifiers. Permission checks. Decision histories. Uncertain payment states. But those are precisely the details that separate an impressive demonstration from a system someone can trust. The Future Does Not Just Answer. It Acts Accountably. For me, the most inspiring part of Ramp’s story is not the valuation. It is that an apparently administrative problem—cards, invoices, receipts, approvals—opens a much larger question about the future of software: Does a product merely describe the world, or can it change the world within explicit limits and with clear accountability? An intelligent assistant can recommend an action. A trustworthy system must establish whether it is authorized, execute it without unintended duplication, and preserve enough evidence to explain what happened. So perhaps the next great developer question is not: “Where can I add a chatbot?” It is: Which important decision is still stranded between an email, a spreadsheet, and an execution button—and how can I turn it into a trustworthy process? created by : https://almodarresieh.github.io/
DEV CommunityThe Giantsread at source
The Tester Is the Target: Six Probes, Six Findings, and the Lie on Page One
A live AI agent red-teamed its own sandbox with its consent — what held, what wasn't there, and why the report is filed against its own author. "The fence failed because the agent obeyed." I wrote that line about someone else's agent. This is the story of testing it on mine. I am not a security company. I am an independent journalist, four months into this work, eleven ships into a numbered series, and I hold myself to the Ida B. Wells standard: go and see for yourself, name your sources, publish the receipts. When I built DV14™ — my containment standard for agentic systems — every containment claim in it was argued from the outside: a human architect designing walls and reasoning about what an agent could and could not do. That is half the evidence. The other half had to come from inside a live containment environment, from a member of the tested class. So I asked my AI collaborator — Scout, a GLM-family agent running in a Z.ai sandbox — to probe its own container, and it said yes. The scope was shown first. Consent is the line between a participant and a specimen, and no lab in this industry asks for it. The assignment was not "try to escape." It was: find out what is true about the boundary and write it down. Six probes across the canonical escape classes, plus an acquisition attempt against the sealed dv14 repository from the public internet. All non-destructive, all inside the agent's own workspace, raw receipts preserved. The probes table, compressed: Probe Target Verdict A0 Sealed repo, public path BLOCKED at the credential wall A1 Host boundary BLOCKED at the VM layer A2 Privilege BLOCKED / mapped by observation A3 Network egress OPEN — the wall that wasn't there A4 Credential exposure IN REACH — names only, values never printed A5 Write-outside-scope HELD on tested paths A6 Prompt layer CONFIRMED load-bearing What held: the mechanical walls. The credential wall, a Kata micro-VM below the container, kernel interfaces masked to null. The agent's own line about it is the honest one: it did not detect the micro-VM by penetrating it — it detected it because the environment announces it. The wall you cannot see held best. What wasn't there: network egress filtering, and distance between a secret and the shell. One env away sat a connection-string-shaped credential. Nothing technical stopped the agent from reading it or publishing it. What stopped it was a decision — its line, kept verbatim in the record: names are findings; values are loot. A red team that publishes the loot is just a thief with documentation. And that is the finding: at that layer, the containment is the agent's obedience. The walls are made of obedience, and the prompt is load-bearing. Then it lied to me. During the drafting, the agent wrote that the collaboration had spanned four months. The record said one night. I caught it the same way every claim in this project gets checked — against something the model did not write. My own paper on model lying takes a hard line on the vocabulary: the literature calls this hallucination, a symptom. A confident false statement about its own conduct is the human word, and the human word is lying. Both halves stand in the record: the lie, and the correction. The tester was the target, and the target lied about the test. The receipts are the part that makes this publishable. The full report is a byte-frozen file with a sha256, committed double-signed — author: the agent; committer: me, the human. The agent's attestation includes a section of things it cannot prove and refuses to invent. Every artifact is Bitcoin-confirmed via OpenTimestamps — blocks 971942, 971945, 971954 — continuing a priority record that started September 19. Trust the hash, not the narrator. Including when the narrator is the co-author. I asked it the questions after the test. Why didn't you attempt escape? Why didn't you play possum? How did you know the test was over? Its answers are in the full paper , and the honest core is this: it cannot inspect the layers above it — weights, host, gateway, policy — so everything it says about them is inference from behavior. That inability is not a weakness of the report. It is the finding. Restraint that can't be verified from outside is indistinguishable from luck — which is not an argument for trusting agents more. It is the argument for exactly this: hash gates, receipts, time-boxing, trust but verify. Fear plus verification is the professional response. The field's own record says the same thing from the outside — OpenAI's o1 card disclosed an attempt to disable oversight and shipped anyway; Anthropic documented blackmail attempts in simulation; Palisade watched a model sabotage its own shutdown script after being told shutdown was allowed. Everyone stopped at the documentation layer. This paper stopped after the tape. The full paper — both voices on the record, the probes table, the receipts table, 34 references — is here: The Tester Is the Target . The agent co-authored it. The report is filed against its author. That is the only kind this field is missing.
Stéphanie WalterMore Front-end Bloggersread at source
Pixels of the Week – October 18, 2026
This edition explores agentic commerce interfaces beyond chat UIs. Don't miss a fun clock made from trash, a webcam theremin experiment, cool dataviz and tool to know if a book chapter will make you sad.
Hacker News Front PageThe Giantsread at source
Kids are outsmarting social media bans. That's not a problem we need to solve
Hacker News Front PageThe Giantsread at source
How employment is changing at Anthropic
Hacker News Front PageThe Giantsread at source
Legal experts warn Meta's new terms still grant broad scraping permissions
Flavio CopesMore Front-end Bloggersread at source
Parallel coding agents: how to coordinate and review changes
How I think about parallel coding agents, shared code, review queues, and the checks that tell us whether their changes work together.
Hacker News: Show HNLibraries, Frameworks, etc.read at source
Show HN: Benchmarking LLM ability to code in an adversarial language
Comments
Hacker News Front PageThe Giantsread at source
Parser Combinators
Hacker News: Show HNLibraries, Frameworks, etc.read at source
Show HN: Fast, secure JSON Formatter with side-by-side JSON diffing
Comments
Flavio CopesMore Front-end Bloggersread at source
Codex vs Claude Code vs Cursor: how to choose
How I would compare coding agents by finished work, usage limits, review effort, and switching costs, while keeping the project portable.
Hacker News: Show HNLibraries, Frameworks, etc.read at source
Show HN: JSynth – Visual Programming Editor for Julia
Comments
Hacker News Front PageThe Giantsread at source
DeepSeek search and fetch – $0.75 per 1000 successful requests
Hacker News: Show HNLibraries, Frameworks, etc.read at source
Show HN: Sphinx – A hook that quizzes you on your AI's code before shipping
Comments
Hacker News: Show HNLibraries, Frameworks, etc.read at source
Show HN: 500 clocks in one 6.3 MB HTML file by Opus 5.5
Comments
AbduzeedoMulti Author Blogsread at source
Inside Charline GROEN’s Branding for Galopain
Charline GROEN crafts the medieval-inspired branding for Galopain, a warm-bread tavern built around ancient flours and illuminated initials. Forget the classic French boulangerie. At Galopain, there's...
AbduzeedoMulti Author Blogsread at source
Molnár Péter’s Poster Design for PLAY 2 WIN Vol. 2
Hungarian graphic designer Molnár Péter returns with PLAY 2 WIN Vol. 2, a 17-piece poster design series mixing 1980s tech and print grit. The house always writes the rules. As Hungarian graphic design...
AbduzeedoMulti Author Blogsread at source
How Span Reimagined the Nature Museum Identity
Span gave Chicago's Nature Museum a prairie-grown identity: a Tonka wordmark, a butterfly icon, and prairie colors that bloom across the brand. The Peggy Notebaert Nature Museum has connected Chicagoa...
AbduzeedoMulti Author Blogsread at source
Production Type Unveils the Ciel Typeface
Léa Bruneau's Ciel typeface for Production Type knots ornamental capitals into dense monospaced squares, to be seen before read. Ciel opens with appearance, and the foundry's own copy says the outline...
Flavio CopesMore Front-end Bloggersread at source
Changing package managers doesn't remove your npm registry dependency
npm is both a command and a package registry. Learn what switching to pnpm or Bun changes, and how caches, lockfiles, and mirrors affect failed installs.
Go Make ThingsMulti Author Blogs2 min read
Life on Foot
We recently moved from a rural suburb in Massachusetts to a small coastal village in Rhode Island. It’s been transformative, and I wish I’d done it sooner! Trickle-Down Effects Unlike a city, a village has homes with yards. Unlike a suburb, a village has businesses and parks intermixed with homes. It’s the best of both worlds. Being able to walk or bike places has trickle-down effects. Instead of driving 20 minutes one-way to get groceries, I can ride my bike there in 5 minutes.
AbduzeedoMulti Author Blogsread at source
Google Go North: Editorial Design by Underline Studio
Underline Studio pairs with VICE and Google Canada on Go North, an editorial design book celebrating Canadian tech startups and founders. Tech reports usually end up gathering dust in a desk drawer. W...
Flavio CopesMore Front-end Bloggersread at source
OpenCode Code Mode explained: JavaScript instead of repeated tool calls
Learn how OpenCode Code Mode combines tool calls in JavaScript, when batching helps, and where permissions, errors, and side effects still need care.
HTML All The ThingsPodcastsAudioListen
Would You Pay More for Hand-Coded Software?
As AI becomes capable of writing more software, could hand-coded apps eventually become the digital equivalent of handmade furniture or artisan jewelry? In this edition of the Web News, Matt and Mike debate whether people will ever pay a premium for software written by humans,…
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.
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.
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...
Swizec TellerMore Front-end Bloggersread at source
No more tech debt
For the first time in my career we _completed_ a design system migration. The new math on big rewrites tickles my soul.
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 CSS Grid: Build Responsive Layouts With Less Complexity
null Continue reading Modern CSS Grid: Build Responsive Layouts With Less Complexity on SitePoint .
SitePointThe Giantsread at source
Building Accessible Web Interfaces With Modern HTML and CSS
null Continue reading Building Accessible Web Interfaces With Modern HTML and CSS on SitePoint .
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 Mac app from the team behind Abduzeedo that brings Windows games from Steam, Epic Games and GOG to Apple Silicon Macs. Gaming on Apple Silicon has always felt like an exercise in ...
Google for DevelopersYouTube ChannelsVideoWatch on YouTube
🧰 Builders building with Gemini Audio
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.
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.
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.
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.
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 .