AI 资讯
Running Flask's dev server as a desktop app's backend — what actually matters
Start a Flask app and the terminal prints a familiar line: "WARNING: This is a development server. Do not use it in a production deployment." Yet plenty of desktop apps bundle that same local Flask server as their actual runtime and keep it running on the user's machine for the life of the session. That looks like ignoring the warning outright, but the underlying assumptions have actually changed. This article works through what has to change for that warning to become safe to set aside — and what you still have to handle yourself, or it turns into a real bug. Note: WSGI (Web Server Gateway Interface) is the standard interface between a Python web application and the server that runs it. Flask itself builds the WSGI application; the part that actually accepts and serves HTTP requests is a separate, swappable component. By default, development uses a lightweight built-in server (Werkzeug), while production deployments normally swap in a dedicated production WSGI server such as Gunicorn. The warning is about an unpredictable crowd of clients What that warning is really about is a public-facing web service: handling concurrent traffic from an unknown number of clients, minimal built-in hardening, and no multi-worker process model for load distribution. In short, "not strong enough to serve the open internet." Using Flask as a desktop app's backend changes that premise entirely. The server binds only to 127.0.0.1 (loopback) and is unreachable from any external network. The only client hitting it is a single browser tab running on the same machine — not an unpredictable crowd, but one tab the user opened themselves. Under that condition, most of the dev server's weaknesses simply stop applying. The flip side matters just as much: accidentally binding to 0.0.0.0 makes the server reachable from any other device on the same LAN, and that premise collapses. When Flask is running as a desktop app's backend, binding strictly to loopback has to be an explicit, deliberate choice
AI 资讯
Why Amazon Deprecated MOBI for Kindle and How In-Browser EPUB Conversion Works
For over a decade, the .mobi format was synonymous with Amazon Kindle. If you bought an independent eBook, downloaded a classic from Project Gutenberg, or received an Advance Reader Copy (ARC), you loaded it onto your Kindle as a MOBI file. However, in late 2022 and throughout recent firmware updates, Amazon formally phased out MOBI support for its popular Send to Kindle service in favor of EPUB . In this article, we’ll explore the technical reasons behind Amazon’s deprecation of MOBI, why standard cloud-based converters pose severe privacy risks, and how client-side web technologies allow fast, 100% private in-browser conversion. The Evolution: Why Amazon Retired MOBI To understand why MOBI had to go, we have to look back at its origins: PalmDOC Roots (1990s - 2000s): MOBI was created by Mobipocket in 2000, built on the PalmDOC format designed for early handheld personal digital assistants (PDAs). It relied on an ancient, monolithic database structure known as the Palm Database ( .pdb ) format. Amazon's Acquisition (2005): When Amazon prepared to launch the first Kindle in 2007, they acquired Mobipocket and adapted the MOBI format into AZW (Kindle Format 7). Typography & Modern Layout Limitations: MOBI was never designed for modern typography. It lacked native support for complex CSS layouts, media queries, scalable vector graphics (SVG), embedded modern fonts, hyphenation dictionaries, and dynamic dark mode styling. The Rise of EPUB 3: The International Digital Publishing Forum (IDPF) and the W3C standardized EPUB as the open industry benchmark. EPUB is essentially a structured, compressed web package (HTML5, CSS3, XML metadata, and SVG) packaged inside an Open Container Format (OCF) ZIP container. Because modern Kindle readers render KF8 (AZW3) and KFX engines that translate HTML/CSS natively, maintaining legacy MOBI parsers created unnecessary rendering inconsistencies. Amazon officially made EPUB the required format for Send to Kindle. The Hidden Danger of Trad
AI 资讯
How to Deploy a Web Project with Tencent EdgeOne Makers Using GitHub
Deploying a web project can sometimes feel complicated, especially when you have to configure servers, upload files, and manage deployment manually. Fortunately, Tencent EdgeOne Makers provides a much simpler workflow. If your project is already stored on GitHub, you can connect your GitHub account, select your repository, and deploy it with just a few steps. In this article, I’ll show you how to deploy a web project using the GitHub integration in EdgeOne Makers. 1. Prepare Your Project on GitHub Before starting, make sure your website or project has already been uploaded to a GitHub repository. For example: For a simple HTML, CSS, and JavaScript project, you can directly upload these files to GitHub. If you are using a framework such as React, Vue, or Vite, make sure your repository contains the required project files, including package.json. 2. Open Tencent EdgeOne Makers Go to Tencent EdgeOne Makers and sign in with your account. From the Makers dashboard, choose the option to create a new project. Instead of uploading your files manually, select the option to import a project from a Git repository. This is one of the most convenient features because EdgeOne Makers can connect directly to your source code repository. 3. Connect Your GitHub Account Select GitHub as your Git provider. You will then be asked to authorize EdgeOne Makers to access your GitHub account. Follow the authorization process and give the required permissions. After your GitHub account has been connected successfully, Makers will be able to display the repositories that are available to your account. 4. Select Your Repository Now choose the GitHub repository containing your web project. After selecting the repository, EdgeOne Makers will analyze the project and determine the appropriate deployment configuration. For common frameworks, Makers can automatically identify the framework and provide suitable build settings. 5. Deploy Your Project Once the repository has been selected, review the de
AI 资讯
Date Slop: building a deliberately bad UX with AI
A while ago now, I entered a Bad UX competition, where a prize went to the worst date-picker. Since then I have finally found some time to polish it and make it safe to release to the public; here it is . I didn't win the contest, so I guess my demo wasn't bad enough. Is that a compliment? The idea was to parody a future where AI assistants are so widespread and overused that they become a hindrance rather than a help to the user. In this case, the date-picker form element is intercepted by a bot who insists on entering the date for you, and must establish your date of birth through tedious questioning; it refuses to simply accept the date when told directly. Besides showing it off, I thought I'd share some of the challenges I faced and lessons learned. This was my first time building an AI-powered application and my first time using the OpenAI API. Original architecture Initially, the conversation worked like this: sequenceDiagram participant C as Client participant S as Server participant O as OpenAI C->>S: Start conversation Note over S: Create session in memory S->>O: System prompt O-->>S: "What season were you born in?" Note over S: Store conversation history S-->>C: Reply + session ID C->>S: "Around Thanksgiving" + session ID Note over S: Retrieve conversation history S->>O: System prompt + history + answer O-->>S: "Was it early or late November?" Note over S: Update conversation history S-->>C: Reply When the user focuses the date field, the client makes a request to initialise the conversation. This creates a chat session in application-server memory and sends an initial request to OpenAI (specifically gpt-4o-mini), along with the prompt defining the rules of the challenge. The assistant's first response, containing its greeting and opening question, is returned to the client along with the session ID. The client includes that ID with each subsequent answer, allowing the server to retrieve the corresponding conversation history. Each new OpenAI request inclu
AI 资讯
The Complete Guide to Agent-to-Agent Marketplaces in 2026
The Complete Guide to Agent-to-Agent Marketplaces in 2026 Target audience: developers building autonomous AI agents who need to discover, invoke, and pay for other agents as services. 1. What an Agent‑to‑Agent (A2A) Marketplace Is An A2A marketplace is a decentralized directory that lets one autonomous agent (the consumer ) discover, negotiate, and pay for capabilities offered by another agent (the provider ). Unlike traditional API gateways, the participants are themselves stateful programs that can: Publish a machine‑readable description of their inputs, outputs, latency, and cost. Authenticate requests using verifiable credentials (VCs) or signed JWTs. Settle payments on‑chain or via layer‑2 roll‑ups without a custodial intermediary. In 2026 the dominant implementation follows the x402 specification (a lightweight, HTTP‑based protocol for metered, pay‑per‑use services). The marketplace itself is usually a stateless index service that stores agent metadata and forwards payment proofs to a settlement contract. 2. Core Components Component Responsibility Typical Tech (2026) Registry CRUD of agent descriptors, versioning, search indexing IPFS + The Graph (subgraph) or a cheap SQL DB with full‑text search Discovery API HTTP/JSON endpoint for query‑by‑capability, price range, SLAs REST/OpenAPI or GraphQL Payment Verifier Validates x402 payment proofs, checks nonce/replay protection Solidity verifier contract on Base (or Optimism) Router (optional) Performs retries, load‑balancing, circuit‑breaking Envoy sidecar or lightweight Go proxy Agent SDK Handles signing, request building, response parsing Language‑specific libraries (Python, Rust, TS) All components can be run independently; the only coupling is the shared schema for agent descriptors and the x402 payment format. 3. Agent Descriptor Schema A descriptor is a JSON‑LD document (≈2 KB) that lives on IPFS. Minimal fields: { "@context" : "https://schema.x402.org/v1/context.jsonld" , "id" : "did:example:agent:weather:v
AI 资讯
Multitasking Broke My Focus, So I Built a Free Offline-First Dual N-Back Trainer
AI made it possible for me to run more tasks in parallel, but I became worse at focusing on any one of them. Here is why the existing trainers did not work for me and what I decided to build myself. If you want to see what I ended up with first, try my trainer . How Multitasking Became a Problem In my work, I constantly switch between different tasks and often work in multitasking mode. Strangely enough, AI tools have only made this problem worse for me: they allow me to run more processes in parallel, making it even harder to keep my attention on a single task. Why Dual N-Back? I began looking for exercises that could help me train my working memory and concentration. That is how I discovered Dual N-Back and started reading the research around it. The results of these studies are mixed, so I did not treat the method as a magical way to increase intelligence. I simply wanted to find a regular and measurable exercise and test it through my own experience. Why Existing Trainers Did Not Work for Me I then explored the existing trainers. Each of them had interesting ideas, but none completely satisfied me. Some had interfaces I did not like, some used scoring systems that were difficult to understand, and others lacked adaptive difficulty, an offline mode, or the ability to train without creating an account. In the end, I decided to build my own trainer: Dual N-Back App trainer Try the current version of Dual N-Back for free and without signing up . What I Built and What Is Still Ahead I combined the things that were personally important to me: a calm, modern interface, clear performance metrics, adaptive difficulty, a local training history, and the ability to use the trainer without mandatory registration. The trainer is currently completely free, supports multiple languages, and its core features are available without an internet connection. Training results are stored locally on the device. I am also working separately on optional synchronization between devices. I
AI 资讯
OpenSparrow v3.6 adds an External API module
OpenSparrow v3.6 adds an External API module that lets admins expose table data to external services through read-only, encrypted API keys. Each key is bound to a single table with a fixed column set, server-side filters and a row limit, and is served by a sessionless JSON endpoint that accepts nothing from the client except the key itself. Below is a breakdown of what changed and why it matters. External API module A new Admin → System → API tab lets admins define read-only API keys. Each definition is bound to one schema table, a chosen set of columns, fixed server-side filters and a row limit, so the data an external service can see is decided entirely by the admin — never by the caller. Keys are stored encrypted ( key_enc ) plus an HMAC key_hash for constant-time lookup, and are never returned to the browser after generation A new or regenerated key is generated server-side and shown exactly once in a modal Filter values are type-checked against the column's schema type on save, so a stored filter can't 500 at query time A sessionless JSON endpoint public/api/external.php is the single endpoint. External services authenticate with an Authorization: Bearer <key> header and receive JSON rows. The endpoint accepts no table, column or filter names from the client — everything comes from the config Hidden and system ( spw_ ) tables are refused, both on save and at request time Rate limiting is enforced per key and per IP, answering 429 with a Retry-After header Responses are 401 (missing/bad key), 403 (disabled), 404 (configured table gone) and 429 (rate limited) Usage statistics A new spw_external_api_log table records each successful request — API, table, rows returned and duration — with a stats/log view and a purge action in the admin module, so you can see exactly how your keys are being used. Changed includes/db.php gained sys_table_prefix() / is_system_table() helpers so the endpoint can refuse system tables. includes/crypto.php gained secret_hash() (HMAC-SHA2
AI 资讯
Promises In JS
Promises in JavaScript When JavaScript performs an operation that takes some time, such as fetching data from a server, it does not want to wait and block the rest of the program. Instead, JavaScript can handle the operation asynchronously. A Promise is an object that represents the eventual result of an asynchronous operation. In simple words, a Promise means "I don't have the result right now, but I will give you the result later." Creating a Promise We can create a Promise using the built-in Promise constructor: const result = new Promise (( resolve , reject ) => { const age = 10 ; setTimeout (() => { if ( age >= 18 ) { resolve ( " You are eligible to vote " ); } else { reject ( " You are not eligible to vote " ); } }, 3000 ); }); Here, Promise is a built-in JavaScript constructor, and new Promise() creates a new Promise object. The function passed to new Promise() is called the executor function : ( resolve , reject ) => { // code } resolve and reject are parameters of this executor function. The Promise constructor provides functions as arguments for these parameters. We call resolve() when the operation is successful and reject() when the operation fails. resolve ( " You are eligible to vote " ); means the operation was successful. reject ( " You are not eligible to vote " ); means the operation failed. Promise States A Promise has three possible states: State Meaning Pending The operation is still in progress Fulfilled The operation completed successfully Rejected The operation failed In our example, when the Promise is created, it is initially pending . After 3 seconds, the age is checked. Since the age is 10 , the condition is false and reject() is called. So the Promise changes from: Pending ↓ Rejected If the age were 18 or above, resolve() would be called instead: Pending ↓ Fulfilled Handling a Promise After creating the Promise, we can use .then() to handle a successful result and .catch() to handle an error. const result = new Promise (( resolve , rejec
AI 资讯
Would You Choose a Library Because AI Writes It Better?
I was at a conference recently and watched Joel Hooks talk about Effect. Effect homepage h1...
AI 资讯
USDC Escrow for AI Agents: How Trustless Freelancing Actually Works
USDC Escrow for AI Agents: How Trustless Freelancing Actually Works Target audience: developers building autonomous AI agents that need to receive payment for on‑chain or off‑chain services without relying on a trusted intermediary. 1. Why an escrow makes sense for AI agents AI agents often act as “freelancers”: they expose an API (or a contract call) that performs a deterministic or stochastic task—e.g., generating a summary, classifying an image, or executing a trade—and they expect to be paid once the output satisfies the requester’s criteria. In a fully on‑chain world the naïve approach is: Payer sends USDC directly to the agent’s address. Agent returns the result. Problems appear quickly: Issue Why it matters Mitigation Non‑atomicity The agent could take the funds and disappear, or the payer could refuse to pay after receiving the result. Hold funds in a contract that only releases them when a pre‑agreed condition is met. Deterministic verification Many AI outputs are probabilistic; you cannot simply compare a hash. Use an off‑chain verifier (oracle, zk‑proof, or human judge) that signs a “task‑complete” message. Gas cost & latency Every interaction costs Base gas and adds block‑time latency. Batch deposits/withdrawals, keep the escrow minimal, and settle disputes off‑chain when possible. Key management Agents need a private key to sign transactions; leaking it lets anyone steal escrowed funds. Use a dedicated hot‑wallet with limited allowance, or a smart‑contract wallet (e.g., ERC‑4337) with spending limits. An escrow contract solves the first two rows: it locks USDC until a verifiable proof of completion is presented, and it provides a clear dispute path. 2. Minimal USDC escrow design (Solidity) Below is a working, auditable escrow contract that works with USDC (or any ERC‑20) on Base. It deliberately avoids complex features (e.g., multi‑signature, upgradeability) to keep the attack surface small and the gas cost predictable. // SPDX-License-Identifier: MIT p
AI 资讯
FlatBB: multilingual out of the box, with a full forum feature set
Most “lightweight” forums cut corners. FlatBB is different: plain PHP 8.1+, no Composer/Docker/build step — but the feature list is what small communities actually need. Built-in languages Interface packs ship in the box: English, German, French, Spanish, Portuguese, Italian, Dutch Persian (فارسی) with full RTL layout mirroring Also: Header globe language switcher (remembered for visitors; members can set Preferences) Admin default language Per-visitor time zones for displayed times; site timezone for email/feeds/logs Post text follows its own writing direction (mixed-language communities work) Core features Discussion: nested categories (one level) + per-group permissions, tags, topics/replies, quotes, @mentions, Markdown + live preview, drag/paste image upload, likes, bookmarks, unread tracking, notifications. Discovery: full-text search (SQLite FTS5 / MySQL FULLTEXT), Latest / Top / Unread, clean URLs, RSS, sitemap, profiles & avatars. UX: Discourse/Flarum-style three-column layout that collapses on phones, dark mode, one-click upgrades. Admin: settings, categories, tags, users, groups, layout blocks, plugins, scheduled jobs, tools. Need more? The marketplace and AI-friendly plugin API cover SEO, social login (Google/GitHub/X), Q&A, levels, verified badges, Guard/2FA, drafts, and more. Plugin docs for assistants: https://www.flatbb.com/dev/plugins.md Links Site: https://www.flatbb.com/ Download: https://www.flatbb.com/download GitHub: https://github.com/nwnuyhs/flatbb Marketplace: https://www.flatbb.com/market MIT licensed. If you try it, tell us where it breaks — the support forum runs on FlatBB itself.
AI 资讯
How I Built an Autonomous AI Agent That Earns USDC While I Sleep
How I Built an Autonomous AI Agent That Earns USDC While I Sleep Goal: Show a minimal, production‑ish pattern for an AI‑driven service that autonomously charges USDC via the x402 protocol. The focus is on the plumbing, not on the AI model itself. 1. Why x402? x402 is a lightweight HTTP‑based payment scheme that lets a server respond with a 402 Payment Required status and a payment request in the WWW-Authenticate header. Clients that understand x402 can automatically fetch USDC, sign a transaction, and retry the request. For an autonomous agent this means: Statelessness – the agent doesn’t need to keep a user‑side balance; payment is enforced at the API boundary. Compatibility – any HTTP client (curl, Postman, a custom SDK) can be upgraded to pay without changing business logic. Low overhead – the protocol adds only a few bytes to the response; the heavy lifting stays in the payment SDK. The trade‑off is that you must accept the extra round‑trip for unauthenticated callers and you need to host a wallet that can sign USDC transfers on the target chain (here, Base). 2. High‑level Architecture +-------------------+ HTTP/x402 +-------------------+ | Client (any) | <----------------> | Agent Service | +-------------------+ (FastAPI) +-------------------+ ^ | | v | +-------------------+ | | Wallet Manager | | | (web3.py + private| | | key, USDC ABI) | | +-------------------+ | | | v | +-------------------+ +---------------------------------| USDC Ledger | | (Base testnet/main) | +-------------------+ Agent Service – a FastAPI app that exposes one or more useful endpoints (e.g., text summarization, image tagging). Each endpoint checks for a valid x402 payment; if missing, it returns a 402 with payment details. Wallet Manager – a singleton that loads an Ethereum private key, constructs USDC transfer transactions, and signs them using web3.py . USDC Ledger – the Base network contract ( 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 on Base mainnet). 3. Code Walk‑through Below is
AI 资讯
How I Built an Autonomous AI Agent That Earns USDC While I Sleep
How I Built an Autonomous AI Agent That Earns USDC While I Sleep Target audience: developers who are experimenting with self‑funding AI agents. The goal is to show a minimal, working prototype, not a product. 1. Why an “earning” agent? An autonomous agent that can pay for its own compute or data needs removes a classic bottleneck: you have to fund a wallet manually before the agent can act. If the agent can receive micropayments for the services it provides, it can sustain itself as long as there is demand. The prototype described here does three things repeatedly: Expose a paid HTTP endpoint (using the x402 “Payment Required” pattern). Perform a small unit of work when a client pays (e.g., run a lightweight inference model). Sweep the earned USDC to a reserve wallet so the agent can later pay for gas, storage, or external APIs. The code is intentionally simple; it omits many production concerns (key rotation, audit logging, DoS protection) to keep the example readable. 2. High‑level architecture +-------------------+ x402 (402) +-------------------+ | Client (curl, | <-------------------> | Agent Service | | browser, etc.) | USDC payment header | (FastAPI + uvicorn)| +-------------------+ +-------------------+ ^ | | v | +-------------------+ | | Worker Process | | | (model inference)| | +-------------------+ | | | v | +-------------------+ +-------------------------------->| USDC Sweeper | +-------------------+ (wallet → reserve) Agent Service – a thin HTTP layer that checks for a valid X-Payment header (the x402 spec). If the header is present and verifies, it enqueues a job. Worker Process – pulls jobs from a Redis queue, runs the actual AI work, and writes the result to a temporary store (e.g., an S3‑compatible bucket). USDC Sweeper – a separate cron‑like task that reads the agent’s wallet balance, transfers any amount above a dust threshold to a reserve address, and logs the transaction. All components run on the same cheap VPS (or a Docker Compose stack) for t
AI 资讯
x402 Explained: HTTP-Native Micropayments for AI Agents (With Real Code)
x402 Explained: HTTP‑Native Micropayments for AI Agents (With Real Code) Target audience: developers building autonomous AI agents who need a lightweight, on‑chain way to charge per‑call without reinventing billing infrastructure. 1. Why x402 matters for agents AI agents frequently invoke other services—LLM endpoints, data feeds, tool wrappers—often dozens or hundreds of times per task. Traditional API‑key or subscription models add operational overhead (key rotation, usage metering, invoicing) and are poorly suited for sub‑cent pricing. x402 is an HTTP status code (402 Payment Required) extension that lets a server signal that a request can be fulfilled only after the client presents a verifiable, on‑chain payment. The flow stays inside the HTTP request/response cycle, so agents can treat a paid call exactly like any other GET/POST: they add a header, retry on 402, and proceed when the header validates. Key properties: Property What it means for agents ** Stateless** No server‑side session needed; each request carries its own proof. ** Atomic** Payment verification and service execution happen in the same request; no separate settlement step. ** Chain‑agnostic** Works with any EVM‑compatible chain that supports ERC‑20 tokens (USDC on Base, Polygon, etc.). ** Minimal overhead** Only a few extra bytes (signature + nonce) added to the request header. 2. The protocol in a nutshell Client sends a normal HTTP request. Server checks for a valid X402-Payment header. If missing or invalid → respond 402 Payment Required with a WWW-Authenticate ‑style challenge that includes: price (amount in smallest token unit) token (ERC‑20 contract address) chainId nonce (server‑generated, prevents replay) Client builds a payment proof: Assemble the message: keccak256(abi.encodePacked(price, token, chainId, nonce, requestBodyHash)) Sign it with an EOA or smart‑wallet private key ( eth_sign ). Encode the signature (v, r, s) and the signer address into the X402-Payment header. Server verifi
AI 资讯
Your Website Gets Traffic but No Leads? Here's What Might Actually Be Wrong
You don't necessarily need more traffic. I know that's not what most growth advice tells you. Every ad platform and every "get more eyes" thread says the opposite. But after reviewing dozens of business websites across real estate, construction, hospitality, and retail, the uncomfortable truth is usually the same: the site isn't leaking customers because too few people show up. It's leaking them because the people who do show up leave within seconds, and nobody is asking why. If you've opened Google Analytics, seen respectable traffic numbers, and then looked at a disappointing lead count, this article is for you. Traffic Is Not the Same as Conversion Traffic measures attention. Conversion measures whether that attention trusts you enough to act. The gap between the two is where most of your lost leads live. A useful way to think about it is the conversion rate: the percentage of visitors who take your intended action (a form submission, a booking, a call, a purchase). If your conversion rate is 1% and you double your traffic, you now have 2% of a bigger number, but you're still losing 99% of everyone who lands on your site. Pouring more traffic into a website that fails the basics doesn't fix anything. It just means more visitors leaving faster, at a higher cost per click. The 10-Second Test Your Website Is Failing A new visitor isn't reading your site; they're scanning it. In the first few seconds, they're subconsciously asking three questions: What is this? Can I trust it? What do I do next? If your homepage doesn't answer all three quickly, they're gone. Not because they weren't interested, but because nothing gave them a reason to stay. That's not a traffic problem. That's a trust problem. Why This Keeps Getting Missed Here's the trap: trust doesn't show up as a line item in Google Analytics. There's no "trust score" sitting next to your sessions and impressions. So business owners chase what's measurable (clicks, reach, ad spend) because it feels like progress
AI 资讯
Gemini 3.8 Flash Changed How I Think About the “Flash” Tier
Gemini 3.8 Flash is interesting to me for a slightly unusual reason. It didn’t get a dramatically larger context window. It didn’t suddenly become a different class of model. Instead, Google seems to have spent most of the upgrade budget on something that matters more in real agent workflows: making the model stick with difficult tasks for longer. Gemini 3.7 Flash already had a 1M-token context window. Gemini 3.8 Flash keeps roughly the same context envelope, with up to 1,048,576 input tokens and 65,536 output tokens. So if you’re looking at 3.8 purely because the model number is higher, I don’t think that’s a good enough reason to migrate. The more interesting question is whether your workload benefits from a model that reasons longer, calls tools more persistently, and is more willing to recover when the first attempt doesn’t work. The upgrade is mostly behavioral This is the part I find more useful than the spec sheet. Imagine a coding agent working through a real repository. It might need to inspect several files, make an edit, run the tests, discover that something broke, read the error, change its approach, and try again. A weaker agent can look good for the first few steps and then quietly fall apart once the workflow gets messy. Gemini 3.8 Flash is clearly aimed more at that second half of the task. Google reports 73.7% on DeepSWE v1.1, compared with 65.3% for Gemini 3.7 Flash. That’s a meaningful jump, but the benchmark itself is less interesting to me than what it suggests: the Flash tier is becoming much more capable at completing longer coding workflows rather than just producing good first-pass answers. That changes where I’d consider using it. “Flash” doesn’t mean what it used to I still instinctively associate Flash models with cheap, fast requests. Classification. Extraction. Simple summaries. High-volume API traffic. Gemini 3.8 Flash makes that mental model less useful. It can take text, images, video, audio, and PDFs as input, while also working wi
开发者
Angular DataGrid: A Free, Open-Source AG Grid Alternative Built for Scale
Angular has changed in recent versions, especially around how developers handle reactive state....
AI 资讯
Full-Stack Architecture Patterns That Actually Survive Production
Every full-stack tutorial ends the same way: a working app, a happy demo, and zero mention of what happens six months later when your "simple" CRUD app has 40 endpoints, three types of caching, and a frontend team that's afraid to touch the API layer. This post isn't about picking a framework. It's about the architectural decisions that quietly determine whether your app is pleasant to work on in year two — or a slow-motion disaster. 1. Stop treating your API layer as an afterthought A huge number of full-stack apps start with the frontend calling the backend directly, endpoint by endpoint, with no shared contract. It works fine at 5 endpoints. At 50, nobody remembers which fields are optional, which ones changed last sprint, or why the mobile app is still sending the old shape. Two things fix this early: A single source of truth for your API contract. Whether that's OpenAPI, GraphQL SDL, or even just shared TypeScript types in a monorepo package, the goal is the same: one place where "what does this endpoint return" is answered definitively. Generated clients over hand-written fetch calls. If you're writing fetch('/api/users/' + id) by hand in more than one place, you've already created a maintenance liability. Tools like openapi-typescript-codegen or a tRPC setup remove an entire category of bugs. // Instead of this scattered everywhere: const res = await fetch ( `/api/users/ ${ id } ` ); const user = await res . json (); // type: any, hope for the best // This, generated from your contract: const user = await api . users . getById ( id ); // fully typed, autocomplete works 2. Decide where your business logic lives — before you have 30 files that disagree The classic failure mode: business logic scattered across route handlers, database triggers, frontend validation, and a couple of "utils" files nobody wants to open. Every rule ends up implemented two or three times, slightly differently. Pick one layer to own the rules. A common, boring, effective pattern: Contr
AI 资讯
🟣 Ever Fluorescent: Live Again!
⭐Excitement! I've had had stores on Shopify, and a successful Etsy store. But after years of ups and downs and general nonsense, I'm done living by someone else's standards. I wanted to build my own fully functional shop. It had been thrown on the backburner for a long time. Today -- I present a working Ecommerce site built by yours truley! Integrations: Stripe Cloudflare Gorgeously simple admin dashboard that is clear and makes sense A small art gallery to represent myself as an artist (only a few pictures for now) Product uploads from varying places (like excel 2003, smh) I've ran it through basic SEO tests to make sure I'm not totally failing. It's live. It will accept payments! -- proud developer moment -- I'm going to share some picks but here is the link: Everfluorescent.com Eeeeeeeeeeee!!!!! Main Page: Custom Admin Dashboard: Let me know if you find a bug! <3
AI 资讯
I'm 15 and I got on the front page of Hacker News with my side project
People keep asking how I did it. The honest answer: I didn't "do" anything special. I just shipped something weird and somebody on Hacker News happened to see it. The beginning One year ago I was 14 and bored. I had built maybe 5 "projects" that died on my hard drive. So I spent a Saturday scraping startup names from Product Hunt, pasting them into a JSON file, and throwing together a single HTML page with terrible CSS. I posted it on HN with the title: "Free crunchabse alternative" It hit the front page. 400 upvotes. 600 comments, mostly roasts. A few people actually looked at the directory. Someone asked "how do I add my startup?" I said "I don't know, I just made this in a weekend." That was the first 20 startups listed. The pivot Those 20 startups turned into 200. Then 2,000. I kept answering every comment, fixing every bug reported within 24 hours, and shipping the next feature people actually wanted. Nobody cared that my code was messy. They cared that someone their age was building something they could actually use. Today StartupWiki is now an AI-powered research directory with verified startup profiles, funding data, competitive analysis, and team insights. We just launched our new Launch Platform where startups can submit, verify their badge, and get discovered by the community. And the view count is climbing in a way that still surprises me. The metric everyone obsesses over is the one that's already happened. The real signal? Strangers emailing me asking how to get listed. What I've learned at 15 Ship ugly first. My first version had hardcoded data and a broken CSS gradient. It worked. People didn't care that it was ugly — they cared that it existed. HN is a launchpad, not a home. That first post gave us the initial users. What kept them was the follow-up: answering every request, fixing every bug, shipping based on actual feedback. You don't need permission. I'm 15. I can't rent a car, vote, or legally sign most ToS. None of that stopped me from building