Pixel

Pixel Updates & Events

Server Updates & Events

Announcements

DEV Community

How to check if an email address is real without sending an email

Sooner or later every app that collects email addresses needs to know whether an address is real. You can get a surprisingly long way without sending a single message. This guide builds four checks in Node, from the cheapest to the most invasive, and it is honest about where each one stops being reliable. All the snippets are ES modules, so save them as .mjs files and run them on a current Node release. A short syntax check catches most typos Skip the giant regex. The full email grammar is enormous and almost nobody needs it. Check the few rules that catch real mistakes: exactly one @, a sensible length, no spaces or brackets in the name, and a domain with at least one dot. // parse-email.mjs
import { domainToASCII } from 'node:url';

export function parseEmail(input) {
if (typeof input !== 'string') return null;
const address = input.trim();
if (address.length > 254) return null;

const parts = address.split('@');
if (parts.length !== 2) return null;
const [local, rawDomain] = parts;

if (local.length === 0 || local.length > 64) return null;
if (/[\s"(),:;<>[\]]/.test(local)) return null;
if (local.startsWith('.') || local.endsWith('.') || local.includes('..')) return null;

// Turns "bücher.example" into the "xn--" form DNS uses; invalid domains become "".
const domain = domainToASCII(rawDomain.toLowerCase());
const labels = domain.split('.');
if (domain === '' || labels.length < 2) return null;

const labelOk = (label) =>
/^[a-z0-9-]{1,63}$/.test(label) && !label.startsWith('-') && !label.endsWith('-');
if (!labels.every(labelOk) || /^\d+$/.test(labels.at(-1))) return null;

return { local, domain };
}
This accepts [email protected] and rejects name@@gmail.com, name@gmail and anything with a space in it. It does not prove the mailbox exists. It only proves the text is shaped like an address. The domain has to have a mail server, so look it up An address can be perfectly formatted and still point nowhere. DNS tells you where a domain receives mail, through MX records, and Node ships the lookup in node:dns/promises. // find-mail-servers.mjs
import { resolveMx, resolve4, resolve6 } from 'node:dns/promises';

const NO_ANSWER = new Set(['ENODATA', 'ENOTFOUND']);

// "No records" is an answer. Timeouts and server failures are not, so they are rethrown.
async function lookup(resolver, domain) {
try {
return await resolver(domain);
} catch (err) {
if (NO_ANSWER.has(err.code)) return [];
throw err;
}
}

export async function findMailServers(domain) {
const mx = await lookup(resolveMx, domain);
if (mx.length > 0) {
// A lone "." target is a null MX (RFC 7505): the domain refuses all mail.
const usable = mx.filter((record) => record.exchange !== '' && record.exchange !== '.');
return usable.sort((a, b) => a.priority - b.priority).map((record) => record.exchange);
}

// No MX records at all: RFC 5321 says to fall back to the domain's own address records.
const [v4, v6] = await Promise.all([lookup(resolve4, domain), lookup(resolve6, domain)]);
return v4.length + v6.length > 0 ? [domain] : [];
}
Two details matter here. Lower priority numbers are tried first, so the list is sorted by them. And a domain with no MX records is not automatically dead: RFC 5321 says a sender should fall back to the domain's A or AAAA record, which is called an implicit MX. A domain that publishes a single null MX has said it accepts no email at all, so the function returns an empty list for it. Run it against gmail.com and you get back a short list of mail hosts. Run it against a made-up domain and you get an empty list. Disposable domains are worth flagging at signup A throwaway inbox passes every check above, because its domain is real and has a mail server. A maintained public list of disposable domains, kept as a plain text file with one domain per line, lets you flag them. Download it on a schedule rather than copying it once, because the list keeps growing. // is-dispo...

Powered by Readybot.io

**DEV Community** ## How to check if an email address …

DEV Community

Lancer la V1 de son application mobile en 2 semaines : la méthode en 4 étapes

Beaucoup de porteurs de projet pensent qu'une application mobile demande six mois de travail avant de voir le jour. Dans la réalité, la plupart des projets peuvent sortir une première version utilisable en deux semaines environ. La condition : savoir ce que l'on construit, et surtout ce que l'on ne construit pas encore. Chez La Belle App, agence de développement d'applications mobiles et web sur mesure, nous avons lancé plus de 80 apps en 5 ans. Voici la méthode que nous suivons sur chaque projet. 1. Le cadrage : une seule promesse, un seul parcours La première erreur est de vouloir tout mettre dans la V1. Le cadrage sert à répondre à trois questions : Quel problème précis l'app règle-t-elle pour son utilisateur ? Quel est le parcours minimum pour que ce problème soit réglé ? Qu'est-ce qui peut attendre la V2 sans casser la promesse ? Une app de réservation, par exemple, n'a pas besoin d'un programme de fidélité au lancement. Elle a besoin qu'un client trouve un créneau, le réserve et reçoive une confirmation. Tout le reste vient après les premiers retours. 2. Les maquettes : valider avant de coder Avant d'écrire une ligne de code, nous concevons les écrans sur Figma et nous les partageons avec le client. C'est l'étape la moins chère pour changer d'avis : déplacer un bouton sur une maquette prend une minute, le faire dans une app déjà développée peut prendre une journée. Les maquettes servent aussi à montrer le projet à de futurs utilisateurs, à des associés ou à des investisseurs. Elles transforment une idée floue en quelque chose de concret. 3. La version test : une seule base de code pour iOS et Android Pour aller vite sans sacrifier la qualité, nous privilégions Flutter. Une seule base de code produit une app iOS et une app Android avec une expérience fluide sur les deux. Concrètement, cela divise presque par deux le temps de développement et le coût de maintenance par rapport à deux apps natives séparées. La version test est installée sur le téléphone du client avant la publication. C'est le moment de vérifier les parcours réels, les textes, les notifications, les paiements. 4. La livraison sur les stores La publication sur l'App Store et Google Play a ses propres règles : captures d'écran, description, politique de confidentialité, comptes de test pour les équipes de revue d'Apple. Anticiper ces éléments dès le cadrage évite de perdre une semaine au moment de la sortie. Ce qui fait vraiment gagner du temps La technique compte, mais ce qui accélère un projet est souvent ailleurs : Un décideur unique côté client, disponible pour valider rapidement. Des contenus prêts (textes, logos, photos) avant le développement. Un périmètre assumé : une V1 n'est pas une version au rabais, c'est la version qui permet d'apprendre. Sur mesure ou outil clé en main ? Les outils no-code et les solutions toutes faites conviennent pour tester une idée très simple. Dès que l'app devient le cœur d'un business (paiement, réservation, mise en relation, données propres), le sur mesure reprend l'avantage : pas de limite imposée par un éditeur, pas d'abonnement qui grimpe avec le nombre d'utilisateurs, et une app qui vous appartient. En résumé Une V1 rapide n'est pas une question de vitesse de frappe. C'est une question de choix : un parcours clair, des maquettes validées, une technologie adaptée et une sortie sur les stores préparée dès le départ. Vous avez un projet d'application ? Vous pouvez en parler avec notre équipe sur labelleapp.com. Billel Loukit, cofondateur de La Belle App

Powered by Readybot.io

**DEV Community** ## Lancer la V1 de son application mobile …

DEV Community

5 commands that list every deprecated call your code still makes (Python, TS, Go, Java, Kotlin)

Don't upgrade Python or Java until you run 5 commands. Each one below lists the deprecated calls your code still makes, and deprecated today usually means removed in the next major. The problem with deprecations isn't that tools hide them. It's that they're warnings, and warnings scroll past in CI where nobody reads them. So the trick in every language is the same: make them errors once, on a branch, and read the list. Python pytest -W error::DeprecationWarning
Every DeprecationWarning raised while your tests run becomes a failure with a traceback pointing at your line. Run it on a branch; don't leave it on in main until the list is empty. TypeScript / JavaScript typescript-eslint has a rule that uses type information to flag anything marked @deprecated: // eslint.config.js, with typed linting enabled
rules: { "@typescript-eslint/no-deprecated": "error" }
tsc alone won't fail on deprecations; your editor's strike-through is the only other hint. Go staticcheck -checks SA1019 ./...
SA1019 reports uses of identifiers whose doc comment starts with Deprecated:. Java javac -Xlint:deprecation ...
In Maven, add -Xlint:deprecation to the compiler plugin's compilerArgs; in Gradle, options.compilerArgs << "-Xlint:deprecation". Add -Werror for the one run where you want the list to fail the build. Kotlin The compiler already warns on calls to @Deprecated declarations. For one build, make warnings fatal: kotlin { compilerOptions { allWarningsAsErrors.set(true) } }
Kotlin deprecations often carry a ReplaceWith(...), and the IDE can apply it for you. Then what Fix the list before the upgrade, while the old and new names both still work. During the upgrade you're fixing deprecations and breaking changes at once, and you can't tell which is which. This is also the check Versyka runs inside every fix: before editing, it reads the new version's deprecation notes for the functions your code calls, in all five languages. Which language in your stack hides the most deprecation warnings?

Powered by Readybot.io

**DEV Community** ## 5 commands that list every deprecated call …

DEV Community

How to Reduce Mobile Game App Size: A Practical Guide

The short answer Measure before you cut. In almost every mobile game, textures are the largest share, followed by audio, then meshes, animation, fonts and code. Resize and compress textures, compress audio, delete what is unused, strip engine code you do not call, ship with Android App Bundles and move later content to on-demand download. Those six steps commonly cut a build by a third to a half without visible loss. Why size matters Conversion. Fewer people finish a large download, especially on mobile data or with a nearly full phone. Store behaviour. Stores show download size on the listing and may ask for confirmation before large downloads over mobile data. Markets. In regions with expensive data and entry-level phones, a small build is a competitive advantage. Updates. A large app means large updates, and people postpone them. Ad campaigns. Paid installs that are abandoned mid-download are wasted spend. Step 1: find out what is big Do not guess. After a build, read the engine's build report, which lists every asset and its size after compression. In Unity, the editor log and the build report tools show this, and Android Studio's APK analyser shows the final package contents. Sort by size. The top twenty entries usually account for most of the build, and several will be surprises: a huge background image, an uncompressed music track, a font with every language. Step 2: textures Textures are normally more than half of a mobile game. Action Effect Reduce resolution to what the screen actually shows Halving width and height cuts size by about three quarters Use ASTC compression on modern Android and iOS devices Large savings with adjustable quality Pick block size by importance Higher quality for characters and interface, stronger compression for backgrounds Pack sprites into atlases Fewer files, less wasted padding, fewer draw calls Remove unneeded mipmaps for interface art Saves about a third on those textures Avoid alpha channels where not needed Cheaper formats become available Use tiling textures and tints One texture serves many surfaces Review maximum texture size per platform in import settings. A 4096-pixel texture on a phone is rarely justified. Step 3: audio Compress music and long ambience with a lossy codec at a moderate quality setting. Most players use phone speakers or basic earphones. Convert to mono where stereo adds nothing, such as most sound effects. That halves the data. Lower the sample rate for effects that do not need high frequencies. Stream long tracks instead of loading them into memory. Trim silence at the start and end of clips. Remove alternate takes and unused voice lines. See how video game music is made for how audio is produced and delivered. Step 4: meshes and animation Enable mesh compression and remove unused vertex data such as extra UV sets or colours. Reduce polygon counts for objects seen at a distance, and use levels of detail. Compress animation and reduce keyframes. Remove curves for bones that do not move. Share animation sets between characters on one skeleton. See game animation cost. Step 5: remove what is not used Projects accumulate leftovers. Unused assets. Anything in special always-included folders ships whether referenced or not. Audit those folders first. Duplicates. The same texture bundled into several asset groups is a common cause of bloat. Analysis tools report duplicated dependencies. Test content. Debug scenes, placeholder art and sample scenes from plugins. Fonts. Include only the character sets you need, and consider dynamic or subset fonts for large scripts. See game localization cost. Video. Pre-rendered video is very heavy. Replace with in-engine sequences or stream it. Step 6: code and engine Use the engine's code stripping at the highest level that still works, and test thoroughly, since stripping can remove code reached only through reflection. Build with IL2CPP and target only the processor architectures the stores require. Disable engine modules you...

Powered by Readybot.io

**DEV Community** ## How to Reduce Mobile Game App Size: …

DEV Community

A 1T-parameter MoE reached 1,300 tokens per second per GPU on a public European supercomputer

📅 November 12, 2026 • domyn.com Domyn, the Milan company leading the EUROPA consortium, published a technical post describing training trials for a mixture-of-experts model on the JUPITER supercomputer. The same write-up appeared on the PyTorch blog the same day. According to the post, these are trials and not a completed pretraining run. EUROPA was selected by the European Commission on June 19, 2026 as the winner of the EuroHPC Frontier AI Grand Challenge, with the consortium formed by Domyn and two Fraunhofer institutes. The Commission required an open model of at least 400 billion parameters, support for all 24 official EU languages and compliance with the EU AI Act. JUPITER, hosted at Forschungszentrum Jülich, is Europe's first exascale supercomputer, and each Booster node holds four NVIDIA GH200 Grace Hopper Superchips. Domyn's post attributes the gain to three engineering changes. Sharding experts by whole expert for the Muon optimizer let each rank own expert matrices and run Newton-Schulz iterations with no communication. Running Newton-Schulz on the GPU while parameters remained offloaded cut the optimizer step from 41.7 seconds to 2.2 seconds and lifted throughput from 441 to 597 tokens per second per GPU. Offloading activation checkpoints to the Grace CPU lifted throughput from 370 to 508 tokens per second per GPU. Running FSDP all-gather on the compute stream cut allocator retries from 384 to zero. The project reports throughput rising from 90 tokens per second per GPU at the start of the trials to about 1,300, with a median measurement of 1,293, on 384 GH200 GPUs across 96 nodes per data-parallel replica, and 1,536 GPUs for four replicas. The configuration had 951.9 billion total parameters with 32.8 billion active per token, 384 routed experts with top-8 routing and a pretrain sequence length of 65,536 tokens. At about 1,300 tokens per second per GPU, one copy of the model processes about 43 billion tokens a day, and four copies on 1,536 GPUs total about 150 billion tokens a day. IMPACT: Domyn's post reports trials, not a completed pretraining run. Throughput figures are medians over steps 4 to 10, and the loss comparison covers only ten training steps. No weights, no release date and no licence are named. The post discloses neither training data nor language share, and Domyn flags that spreading tokens evenly across four groups of 96 experts can hurt training. Independent reporting says Mistral AI released the open weights of Mistral Large 4, about 1 trillion parameters, on October 29, 2026, and that Meta's Muse Spark Open has 816 billion parameters. Sources: domyn.com/blog/training-1t-moe-eu-public-infrastructure-pytorch pytorch.org/blog/training-a-1t-parameter-moe-on-eu-public-infrastructure-with-pytorch-and-torchtitan digital-strategy.ec.europa.eu/en/news/commission-selects-europa-consortium-winner-frontier-ai-grand-challenge-project-build-european-open maccus.fr/en/eu-open-ai-model-europa www.quotidiano.net/economia/ia-la-sfida-europea-dei-supercomputer-testato-un-modello-da-quasi-mille-miliardi-di-parametri-nezeq4vy Continue the conversation: https://t.me/AIAutomationArchitecture · Bluesky

Powered by Readybot.io

**DEV Community** ## A 1T-parameter MoE reached 1,300 tokens per …

DEV Community

CachyOS Revamps Its Package Management UI Again, Unveils Package Installer 2.0

CachyOS has previewed Package Installer 2.0, which manages AUR, Flatpak, and official repositories in one interface and supports nine color themes. It is the distribution's third package management UI overhaul of 2026. Key points What happened: CachyOS previewed Package Installer 2.0, which manages AUR, Flatpak, and official repositories in one interface and supports nine color themes Why it matters: This is the third package management UI overhaul of 2026, following Octopi, Shelly, and now Package Installer 2.0. CachyOS is repeatedly lowering the barriers for newcomers to Arch-based Linux What to watch: The relationship between Shelly and Package Installer 2.0 remains unclear, as does whether version 2.0 will be included in the new CachyOS release teased for the near future A third rebrand in 2026 CachyOS published an early preview of CachyOS Package Installer 2.0 on November 14. The Arch Linux-based distribution is popular with gamers and surpassed SteamOS in Linux share for the first time (in Japanese) in the September Steam Hardware Survey. But its Arch foundation itself remains a barrier for first-time Linux users. Package installation epitomizes that difficulty, and CachyOS has worked repeatedly throughout 2026 to lower this barrier. In April, it replaced (in Japanese) the long-standing, text-oriented Octopi GUI package manager with Shelly. Shelly was a GTK 4-based tool—a Linux UI development framework—that could manage AUR, Flatpak, and AppImage packages together, and it was written in C# and .NET 10. By August, however, CachyOS was rewriting Shelly entirely in Zig (in Japanese) to eliminate the managed runtime and move to a native binary. Now comes Package Installer 2.0, only three months after Shelly was rewritten in Zig. CachyOS Package Installer already had a Qt6-based v1.x series, and version 2.0 is its major update. CachyOS has not disclosed how Shelly and Package Installer 2.0 will relate to each other—whether they will coexist or one will become the default. Users have also asked what happened to Shelly and whether it was not supposed to become the primary package installer. The project also teased that a new CachyOS release is coming soon. Whether Package Installer 2.0 will be included remains undecided. What will change Package Installer 2.0 is being redesigned around an app-store layout similar to Bazaar, the standard app store in the gaming-focused Linux distribution Bazzite and a front end for the Flathub Linux application distribution platform. Instead of the tabular list used by conventional package managers, the new interface is expected to let users install applications while viewing preview images and descriptions. Supported package sources include the official CachyOS repositories, AUR (the Arch User Repository, where Arch users share packages), and Flatpak (a sandboxed package format that works across distributions). They can be managed together in one interface. Flatpak and AUR both use opt-in toggles and are disabled by default. AppImage support is also planned, though as an installer rather than as a managed catalog. There are nine color themes: four CachyOS themes plus Nord, Dracula, Catppuccin, Tokyo Night, and Solarized. Bazaar does not have a theme feature, giving Package Installer 2.0 a point of differentiation. Figure omitted — see the original article The development team also addressed its direction in replies. Features will be added over time. The team wants the interface to be as user-friendly as possible but does not intend to overwhelm it with information. Arch-based distributions traditionally make users choose performance at the cost of accessibility. CachyOS is breaking down those barriers one by one while preserving its performance advantages. Revising a package management tool three times in seven months is fast, but that speed is itself part of CachyOS's character. Originally published on Joho no Todai. The Japanese original is here.

Powered by Readybot.io

**DEV Community** ## CachyOS Revamps Its Package Management UI Again, …

DEV Community

Your Old Claude Prompts Might Need an Update

Hey devs! If you still add “think hard” to your Claude prompts, try leaving it out. In its Opus 5.5 tests, Anthropic found that removing instructions like “think hard” and “think carefully” made replies start sooner, with no clear drop in quality. That caught my attention because it is an easy habit to keep carrying from one model to the next. On November 12, 2026, Anthropic published its guide to using Claude Opus 5.5 for knowledge work. It covers seven prompting habits to revisit. I tried the examples in Claude. Below, I’ll show you the prompts, the effort setting, and what happened when I asked it to turn a chart into a report. You can also watch my full video walkthrough on YouTube. 1. Connect your files and apps Give Claude access to the material the task depends on. If you need a report based on a spreadsheet and a meeting note, provide both. Tell Claude which files to use and what you want it to produce. You can upload the files directly or use a connector to the app where they live. Connecting an app is useful when Claude needs to find several related documents. On Team and Enterprise plans, an owner must enable a connector before members can use it. Start with the sources. A detailed prompt still leaves Claude guessing if the spreadsheet it needs is missing. 2. Say what “done” looks like In your first message, describe three things: What you want to achieve. What the finished output should look like. When Claude should stop and ask you a question. Here is the prompt I used with a chart: Make a 1-page report on this. Use the data from this chart.
Ask me if data is missing.
Claude asked who the chart covered, whether I had exact figures, what an annual data point meant, and who would read the report. I told it to keep the context generic, use its approximate readings, treat the annual point as an annual average, and write for management. After those answers, it created a report with a summary and a chart. The useful part was seeing the assumptions before they became part of the report. The finished file still needs checking against the source data. Here is a template you can adapt: Goal: [what you want to achieve]

Result: [the finished file, its format, and its audience]

Ask me first if: [missing data or decisions you need to make]
3. Drop “think hard” Thinking is always on for Opus 5.5. Anthropic says the model adjusts how much it thinks based on your request and the effort setting. Compare these two prompts from my walkthrough. The first repeats the thinking instruction but leaves the task vague: Think hard about this. Think step by step and be very careful.
Analyze our sales data and tell me what's wrong.
Think really hard before you answer.
What does “wrong” mean here? Which period should Claude analyze? What should it return? The second prompt answers those questions: Look at the attached sales file for Q3. Find the 3 biggest reasons
sales dropped. Give me a 1-page summary with a simple chart.
If any data is missing, stop and ask me first.
This gives Claude something concrete to work toward. My screenshots illustrate the prompt change; they are not a measured comparison of answer quality. For your own task, check whether the response answers the question and supports its findings with the supplied data. 4. Start at Medium effort Anthropic recommends starting Opus 5.5 at Medium and increasing the effort when it stalls on your task. To change it, click the model name next to the send button, open Effort, and select Medium. Before changing the setting, check whether Claude has enough context. Did you attach the correct file? Did you explain the output? Is a decision missing? More thinking time won’t supply a missing spreadsheet. 5. Attach the chart instead of typing its numbers If you have a chart, screenshot, or diagram, attach it and explain what you want to learn. For my example, I started with: What is in the chart?
Claude described the axes and series, then created a table of approximate values. It als...

Powered by Readybot.io

**DEV Community** ## Your Old Claude Prompts Might Need an …

DEV Community

How I Prompt Claude Opus 5.5

Your Old Claude Prompts Might Need an Update Vladislav Guzey Vladislav Guzey Vladislav Guzey Follow Nov 15 Your Old Claude Prompts Might Need an Update #claude #ai #programming #vibecoding 1 reaction Add Comment 5 min read

Powered by Readybot.io

**DEV Community** ## How I Prompt Claude Opus 5.5 Your …

DEV Community

Decoding Positional Embeddings: Architectural Foundations, Engineering Pitfalls, and the Road Ahead for LLMs

This article was originally published on FutureStack Introduction Large language models (LLMs) have popularized the transformer as the de‑facto architecture for sequence modeling. Yet the transformer’s core operation—self‑attention—is order‑agnostic: it treats its input tokens as a set, not a sequence. The missing ingredient that restores order is the positional embedding. In this editorial, I (Mubashir Arham, Founder & Chief Architect at FutureStack) dissect the low‑level mechanics of positional encodings, expose common engineering blind spots, and sketch a concrete implementation roadmap for production‑grade LLM pipelines. Deep Architectural Breakdown 1. Why Self‑Attention Needs Position Self‑attention computes a weighted sum of value vectors (V) using attention scores derived from queries (Q) and keys (K): Attention(Q, K, V) = softmax\left(\frac{QK^T}{\sqrt{d_k}}\right)V
If (Q) and (K) are generated solely from token embeddings, the dot‑product (QK^T) is invariant under any permutation of the input sequence. The model would therefore be unable to differentiate "the cat sat" from "sat the cat". Positional embeddings inject a deterministic bias that breaks this symmetry. 2. Memory Layout of Positional Vectors In practice, token embeddings (E) (shape ([B, L, d]), where (B) is batch size, (L) sequence length, (d) hidden dimension) are summed with positional vectors (P) of identical shape before the first transformer block. Modern frameworks allocate a single contiguous tensor for (E+P) to keep the memory footprint linear in (L). The key engineering decision is where the positional tensor lives: Placement Cache Behavior Typical Latency Impact Static buffer (e.g., sinusoidal) Read‑only, fits in L1/L2 cache Negligible Learned embedding table Random access, may cause cache misses for long sequences Small‑to‑moderate Rotary / ALiBi (applied on‑the‑fly) Computed per head, no extra memory fetch Slight compute overhead FutureStack’s internal inference engine prefers a static buffer for inference‑time models because it eliminates a memory indirection step, thereby shaving ~0.3 ms per 2 k token request on our 8‑GPU cluster. 3. Sinusoidal vs. Learned vs. Rotary vs. ALiBi Method Formula Parameter Count Inductive Bias Sinusoidal (P_{(pos,2i)} = \sin(pos / 10000^{2i/d}))\n(P_{(pos,2i+1)} = \cos(pos / 10000^{2i/d})) 0 Provides smooth, monotonic distance encoding; works out‑of‑the‑box for extrapolation beyond training length Learned (P = \text{Embedding}(pos)) (L_{max}\times d) Allows the model to allocate arbitrary geometry; risks over‑fitting to training lengths Rotary (RoPE) Rotate (Q, K) vectors by angle (\theta = pos / 10000^{2i/d}) per head 0 Encodes relative position directly in the dot‑product; compatible with multi‑query attention ALiBi Add linear bias (bias_{ij}= -\alpha (j-i)) to attention scores 0 Guarantees monotonic decay, excellent for very long contexts Each method changes the compute graph differently. Sinusoidal and rotary are parameter‑free; they can be folded into the attention kernel as a cheap element‑wise operation. Learned embeddings require an extra gather from a large embedding matrix, which can dominate memory bandwidth for sequence lengths > 4 k. 4. Latency and Throughput Dynamics When the sequence length doubles, the self‑attention matrix grows quadratically ((O(L^2))). Positional embeddings, however, scale linearly ((O(L))). This asymmetry means that for ultra‑long contexts (e.g., 32 k tokens) the positional component is not the bottleneck—attention is. Nevertheless, a poorly implemented positional lookup can become a hidden latency spike, especially on CPU‑only inference where memory bandwidth is limited. 5. Integration with FlashAttention and Kernel Fusion FlashAttention (or its open‑source equivalents) fuses the softmax and matmul steps to achieve near‑peak memory bandwidth. Positional embeddings must be injected before the query/key projection to keep the fused kernel intact. In our production stack we ex...

Powered by Readybot.io

**DEV Community** ## Decoding Positional Embeddings: Architectural Foundations, Engineering Pitfalls, …

DEV Community

The DreamHost response sequence: reset, revoke, verify, and monitor

The DreamHost response sequence: reset, revoke, verify, and monitor DreamHost's public account gives defenders a useful incident-response sequence. The provider discovered unauthorized access to the File Manager server, removed it from service, reset potentially exposed passwords, ended active sessions, rebuilt the service, and opened an investigation. Customers need a matching sequence that focuses on their own accounts and evidence. Response quality depends on order. Changing a password while an active session remains valid leaves access open. Revoking a session before checking forwarding rules can hide evidence. Rebuilding a file without preserving a copy of the suspicious original makes later analysis harder. Phase one: stop onward access Identify every user who may have entered FTP/SFTP credentials into files.dreamhost.com during the exposure window. Notify account owners through a private channel, reset affected credentials, and end active sessions where the provider supports it. Review delegated users because an owner-level reset does not necessarily remove a forgotten assistant or automation identity. At the same time, preserve relevant evidence. Export mailbox-rule listings, authentication history, file metadata, deployment logs, and any provider notifications. Record when each action occurred. Do not overwrite a suspicious file before capturing its hash and a protected copy. Phase two: verify the customer environment Review website files against a known-good release or backup. Check for web shells, unexpected scheduled tasks, modified configuration, and new administrator users. Review mailbox forwarding, filters, recovery settings, application connections, and sessions. Then test the new credentials from the expected clients and confirm that old credentials fail. The provider's scope estimate helps prioritize the work. DreamHost says the incident affected well under approximately 10% of hosted email and FTP/SFTP accounts. It does not identify which customer domains or business processes are in that group. Customer-side records must connect the provider notice to the account inventory. Phase three: monitor the recovery Watch for renewed access attempts, unfamiliar file changes, mailbox rules that reappear, and failed authentication bursts during the days after the reset. Review logs from the hosting account and any identity provider used by the organization. Give the service desk a clear escalation path for reports of password-reset emails, unusual invoices, or unexpected file changes. ZoomEye can support the external part of the review. On November 15, 2026, domain="dreamhost.com" returned 122 all-scope public asset observations and domain="dreamhosters.com" returned 28. These are provider-controlled public surfaces observed at one time. They do not prove that a customer account was accessed or that a recovery action failed. Phase four: close with evidence Create an incident record with four sections: affected identities, containment actions, verification evidence, and residual risk. Mark each identity as verified, unresolved, or not applicable. For unresolved items, assign an owner and an expiration date. Do not close the incident merely because the provider's service is back online. Measure time to credential reset, time to session revocation, percentage of accounts verified, and number of unexplained file or mailbox changes. These metrics show whether the response changed the risk, not just whether a task list was completed. The final review should separate provider responsibility from customer responsibility. DreamHost controls its File Manager, account platform, and provider-side sessions. The customer controls its website content, mailbox use, integrations, and internal access policies. A clear handoff between those areas prevents both duplicate work and unexamined gaps. References DreamHost, October Security Incident DreamHost, Current Status Notifications California Attorney General, DreamHost data securi...

Powered by Readybot.io

**DEV Community** ## The DreamHost response sequence: reset, revoke, verify, …

DEV Community

Building Phantom Chat: An Identity-Less, Ephemeral Web & CLI Messenger Powered by the NullState Protocol Encryption

*

DEV Community

Is Your Router Spying on You? Home Network Privacy and Security

Security Note: Educational content: the examples describe risks, techniques, and defenses in the field of cybersecurity. Tools and procedures must be used exclusively on your own systems or with explicit authorization. Have you ever wondered who, besides you, knows exactly which sites you visit or how many hours you spend connected to a specific service? We often focus all our attention on PC and smartphone security or the effectiveness of antivirus software, viewing the router as a simple 'box' that distributes Wi-Fi. In reality, the router is the true guardian of your home network and, for this reason, represents the most critical point for your privacy. Every single data packet leaving your home passes through this hardware. This means the router has privileged visibility into everything happening on your network. But what exactly does it see, and who can access this information? In this article, we will analyze how a router can become a tracking tool and the technical solutions available to limit this monitoring. What is Router Monitoring? Router monitoring is not necessarily a malicious activity or a hacker attack. It is often a feature integrated into the device's firmware. To manage network traffic, the router must know where to send data. The key point is the DNS (Domain Name System), which acts like an internet phonebook: when you type an address like google.it, the router queries a DNS server to translate that name into a numerical IP address. Since every DNS request passes through the router, the device can log the complete list of domains you visit. Although most sites today use the HTTPS protocol to encrypt page content (preventing the router from reading what you type into a form), the router still sees the 'name' of the site. It knows if you are on an e-commerce site, a news portal, or an electronics forum, and it can monitor how long you stay connected and how much data you download. How Data Tracking Works Tracking occurs at several levels. The first is local: many routers maintain internal logs accessible to the network administrator. The second level involves the provider (ISP): if you use your operator's default DNS, the ISP has a record of your browsing history, regardless of whether you use your browser's incognito mode. The third level involves hardware manufacturers. Many routers, especially budget models or those provided by ISPs, include software that sends usage statistics and network data to the manufacturer's servers. This information may include firmware versions, connected device models, and traffic patterns, which are then aggregated for marketing or product analysis purposes. Why Protect Your Router? Protecting the router is not just about hiding your history, but about reducing the attack surface and limiting the collection of unnecessary data. In an era where data is a valuable resource, minimizing the information you leak is a matter of digital hygiene. Preventing a third-party company from knowing which services you use or when you are active reduces the risk of commercial profiling and increases resilience against potential firmware vulnerabilities. Common Mistakes and Privacy Myths One of the most frequent mistakes is thinking that 'incognito browsing' protects the user from the router. Incognito mode prevents the browser from saving history on the PC, but it has no effect on network traffic: the router continues to see every DNS request. Another myth is that HTTPS makes browsing invisible. HTTPS encrypts the content (the 'what'), but not the endpoint (the 'where'). The router knows you are connected to a specific server, even if it cannot read the content of the conversation. Only the adoption of technologies such as DNS over HTTPS (DoH) can mitigate this. In the Lab: How to Regain Control Improving network privacy does not require expensive tools, but rather a few targeted configuration changes. Here is what you can concretely do to secure your connection. 1. Change Your DNS The fir...

Powered by Readybot.io

**DEV Community** ## Is Your Router Spying on You? Home …

DEV Community

Your page looks fine in Chrome. Here's what GPTBot actually receives

Open your product page in Chrome and it looks great: pricing table, feature list, customer quotes. Now ask a less flattering question: what does an AI crawler see when it asks for the same URL? For a lot of sites the honest answer is "much less than you think." Here's why, and a small script to check your own pages in a minute. Most AI crawlers don't run your JavaScript Googlebot renders pages: it fetches the HTML, then runs the JavaScript in a headless browser, then indexes the result. Most of the newer AI crawlers don't do that second step. Vercel looked at real crawler traffic across its network in late 2024 and found that the major AI crawlers, including OpenAI's and Anthropic's, fetched JavaScript files but didn't execute them. Whatever your page shows only after scripts run (a pricing table loaded from an API, reviews injected by a widget, tabs rendered client-side) simply isn't in what they read. Google's own AI features are the exception, because they lean on Google's rendering pipeline. Things may change, and crawlers don't publish their rendering behaviour in detail. But "the raw HTML is what they get" is the safe assumption for planning. That matters for AI answers because the engines quote what they can read. If your pricing only exists after hydration, an engine answering "how much does X cost?" has to get it from someone else's page. The check: fetch it like a bot, strip the scripts The script below asks for a URL with the published user agents of GPTBot (OpenAI's training crawler), OAI-SearchBot (the one behind ChatGPT search results) and PerplexityBot, throws away , , and blocks, and reports what's left: the HTTP status (some firewalls quietly return 403 to bot user agents), how many words of real text remain, the title, meta robots and canonical, whether the phrases you care about are actually in there. No dependencies, Python 3.8+. #!/usr/bin/env python3
"""What does an AI crawler actually receive from your page?

Usage:
python3 what_bots_see.py https://example.com/pricing "$29/mo" "free plan"
"""
import re
import sys
import urllib.error
import urllib.request
from html import unescape

User agents as published by OpenAI and Perplexity (checked 14 Nov 2026).

AGENTS = {
"GPTBot": "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.4; +https://openai.com/gptbot",
"OAI-SearchBot": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36; compatible; OAI-SearchBot/1.4; +https://openai.com/searchbot",
"PerplexityBot": "Mozilla/5.0 (compatible; PerplexityBot/1.0; +https://perplexity.ai/perplexitybot)",
}

def fetch(url, agent):
req = urllib.request.Request(url, headers={"User-Agent": agent})
try:
with urllib.request.urlopen(req, timeout=20) as r:
return r.status, r.read().decode("utf-8", "replace")
except urllib.error.HTTPError as e:
return e.code, e.read().decode("utf-8", "replace")

def visible_text(html):
html = re.sub(r"(?is)<(script|style|noscript|template)\b.*?</\1>", " ", html)
text = unescape(re.sub(r"(?s)<[^>]+>", " ", html))
return re.sub(r"\s+", " ", text).strip()

def find(pattern, html):
m = re.search(pattern, html, re.I | re.S)
return unescape(m.group(1).strip()) if m else "-"

def main():
if len(sys.argv) < 2:
sys.exit(doc)
url, phrases = sys.argv[1], sys.argv[2:]
for name, agent in AGENTS.items():
status, html = fetch(url, agent)
text = visible_text(html)
print(f"\n== {name}: HTTP {status}, {len(html):,} bytes of HTML, {len(text.split()):,} words of text")
print("title: ", find(r"]>(.?)", html))
print("meta robots:", find(r"]+name=[\"']robots[\"'][^>]+content=\"'", html))
print("canonical: ", find(r"]+rel=[\"']canonical[\"'][^>]+href=\"'", html))
for p in phr...

Powered by Readybot.io

**DEV Community** ## Your page looks fine in Chrome. Here's …

DEV Community

GitHub Actions waiting for approval to run workflows for this PR

GitHub Actions waiting for approval to run workflows means a maintainer has to release the run before any job is created. Nothing has failed, nothing is queued on a runner, and the checks that are required to merge cannot report until somebody clicks. The hold happens before dispatch, so there is no job to inspect. GitHub deletes runs that have been awaiting approval for more than 30 days. What this error means A pull request from a contributor shows no progress at all. There is no red check and no running job, just a note that a workflow is awaiting approval, and the merge box reports that required checks have not completed. From the contributor's side it looks like the automation is broken; from the maintainer's side it is easy to miss, because nothing failed and nothing sent a failure notification. ```Pull request merge box, quoted from timqian/open-source-jobs#181 1 workflow awaiting approval This workflow requires approval from a maintainer.

Common causes

The contributor has not had a pull request merged here before

The common configuration. First-time contributors are held and everyone else is not, which is why the situation appears sporadically and usually to the people least able to interpret it.

The policy applies to all fork pull requests

A stricter setting holds every outside contribution regardless of history. Repositories that receive occasional drive-by contributions can sit under this without anyone noticing, because the maintainers never trigger it themselves.

An organization or enterprise policy is stricter than the repository

The repository settings look permissive and runs are still held, because a higher level is deciding. In our experience this is the version that consumes the most time, since the repository page appears to contradict the behavior.

The pull request was opened by an automation account treated as an outside contributor

Worth ruling out when a bot's pull requests stall. An account without prior merged contributions is subject to the same rule, so a newly introduced automation can start needing approval on every run it opens.

How to fix it

Approve the run from the pull request

  1. Open the pull request and read the changed files, including any change to a workflow file.
  2. Click the Awaiting approval button at the top right to open the Merge status panel.
  3. Click Approve workflows to run.
  4. Expect to repeat this for later pushes until the contributor has a merged pull request here.

Decide the policy deliberately rather than inheriting it

Review the setting at the repository level and check whether the organization or enterprise is imposing something stricter. A project that wants drive-by contributions and a project that runs expensive jobs on every push want different answers, and the default is not tuned for either.

Make the contributor-facing checks need no approval to be useful

If the valuable signal is lint and unit tests, consider whether those need secrets or write access at all. Work that runs safely without either is the work that argues best for a looser approval policy.

Watch the 30 day limit on long-lived pull requests

A pull request that stalls in review can lose its pending run entirely. If a run has disappeared rather than completed, push a commit or close and reopen the pull request to produce a fresh event, then approve that.

How to prevent it

  • Subscribe the people who triage contributions to the pull requests that will hold, since nothing sends a failure notification.
  • Say in the contributing guide that a maintainer has to release the first run, so a contributor does not read silence as breakage.
  • Check the organization and enterprise settings before concluding the repository is misconfigured.
  • Keep the checks required for merge to ones that can run without approval wherever that is possible.

Nothing is wrong, and that is the difficulty

This is not an error and it does not appear in any l...

Powered by Readybot.io

**DEV Community** ## GitHub Actions waiting for approval to run …

** Latest from PC Gamer **

Queen's Domain is the best Dark Souls 1 since Dark Souls 1

King's Field of dreams.

Powered by Readybot.io

** Latest from PC Gamer ** ## Queen's Domain is …

DEV Community

Building on AI APIs? The $901B Question Behind the Anthropic IPO

Anthropic's IPO filing contains a number that should interest anyone who builds on AI APIs: roughly $901 billion in computing commitments, most of it take-or-pay, running into the 2030s. The money is owed largely to Google, Microsoft and Amazon — the same companies now buying shares in the offering. Google alone is putting in $10 billion, and it is also the landlord on the other side of the contract. Why should a developer care about an IPO filing? Three reasons. Pricing. Take-or-pay bills do not disappear when demand dips; they get recovered somewhere, and API pricing is the somewhere. The era of heavily subsidized inference is financed by contracts like these. Capacity. When compute is scarce, allocation is a decision. Your provider's biggest suppliers are now also its shareholders — and they run competing AI products of their own. Where your quota sits in that queue is a fair question. Lock-in cuts both ways. The labs are locked into their suppliers for a decade, which limits how fast they can switch or renegotiate. But the same structure de-risks continuity: a provider whose largest creditors just became shareholders is unlikely to be allowed to fold quietly. The full breakdown of the commitments, the seven buyers and the contract dates is in TechSonder's report on the filing. If you build on a single AI provider today, does this structure make you more comfortable — or less?

Powered by Readybot.io

**DEV Community** ## Building on AI APIs? The $901B Question …

DEV Community

Mobile App Development Cost in Kuwait Across 11 Industries

A Kuwait City restaurant wants direct pickup orders with a read-only stock feed from its POS. The app can mark items unavailable and show staff when the last successful sync ran. A full two-way integration is a later project. Across the 11 scopes below, a first release budgets from KWD 5,700 to 19,500. The app in the opening example is budgeted separately as a worked estimate. All figures are illustrative planning scenarios. The rates are editable assumptions, and the figures do not represent surveyed local vendor prices. Mobile app development cost by industry in Kuwait Each estimate includes discovery, design, development, backend, basic administration where needed, QA and release preparation. The MVP generally uses one shared iOS and Android codebase. The taxi estimate includes separate rider and driver apps and a web dispatch panel. An advanced price covers the full expanded build. Timelines are estimated calendar weeks with some work happening in parallel. Industry Example app Core MVP features MVP cost and timeline Advanced cost and timeline Healthcare Clinic appointment app Doctor profiles, scheduling, reminders, staff dashboard, front-desk appointment overrides 6,500–11,500 · 8–12 weeks 16,000–28,100 · 16–26 weeks Real Estate Property listing app Listings, search filters, map view, enquiry routing, listing enquiry deduplication 5,700–10,100 · 7–10 weeks 13,200–23,200 · 14–22 weeks Food Restaurant ordering app Menu, cart, online checkout, order status, kitchen order view, read-only POS stock feed and availability flags 7,000–12,400 · 8–12 weeks 18,000–31,700 · 18–28 weeks Education Course and quiz app Course catalog, lesson player, quizzes, progress tracking, course admin, bulk lesson imports 6,000–10,600 · 8–11 weeks 13,900–24,400 · 14–22 weeks Entertainment Event discovery and ticketing app Event listings, checkout, QR tickets, staff scanning view, ticket inventory by event session 6,200–11,000 · 8–12 weeks 14,600–25,600 · 15–24 weeks Video Streaming On-demand video subscription app Catalog, playback, user accounts, subscription access, content admin, manual catalog publishing workflow 7,600–13,500 · 9–14 weeks 22,200–38,900 · 20–32 weeks Travel Tour and activity booking app Package listings, availability calendar, booking, payments, seat inventory per departure 6,500–11,500 · 8–12 weeks 16,000–28,100 · 16–26 weeks Logistics & Supply Chain Shipment tracking and proof-of-delivery app Shipment status, driver updates, proof of delivery, dispatcher view, inventory status feed 7,300–13,000 · 9–14 weeks 18,700–32,900 · 18–28 weeks Automobile Vehicle service booking app Vehicle profiles, service slots, reminders, work-order status, parts availability view 6,000–10,600 · 8–11 weeks 15,300–26,900 · 15–25 weeks Taxi Ride-hailing app Ride requests, driver acceptance, GPS, fare estimates, basic dispatch, vehicle availability by shift 11,100–19,500 · 12–18 weeks 24,900–43,800 · 22–34 weeks On-Demand Home services marketplace Service catalog, provider profiles, booking, payments, provider web view, provider capacity by time window 8,300–14,700 · 10–15 weeks 20,800–36,500 · 19–30 weeks Prices are in KWD. How the estimate works Effort. The hours for each scope are listed below and cover the full delivery team. Rate. The budget uses a blended rate of KWD 12–21 per hour and a 15% contingency. The lower endpoint rounds down and the upper endpoint rounds up to the nearest KWD 100. Recurring costs. Ask for a separate estimate covering hosting, messaging, maps, payment processing, licences and support. Taxes are excluded from the model. For video, include transcoding, storage and bandwidth based on the hours viewers are expected to watch. Timeline. Check who owns approvals and when test credentials will be ready. A dependency can add calendar time without adding the same amount of engineering effort. Features and costs for each industry Healthcare — Clinic appointment app Clinics can let patients find a clinician, reserve a slot and re...

Powered by Readybot.io

**DEV Community** ## Mobile App Development Cost in Kuwait Across …

DEV Community

AGI readiness in 2026: scoring every major model on what actually matters

OpenAI calls GPT-6 the start of the "AGI era." Sequoia Capital published an essay in January 2026 arguing that long-horizon agents are "functionally AGI." Stanford's 2026 AI Index confirms frontier models beat human baselines on PhD-level science and competition math. So are we there? I ran every major current model through a six-dimension AGI readiness framework -- not benchmark scores, which are increasingly gamed, but the capabilities that actually matter for genuine general intelligence. Here's what I found. The Framework Six dimensions, scored 1-5: Reasoning depth -- can it hold a complex multi-step argument without drifting Reliability -- does it know what it doesn't know, or hallucinate confidently Autonomy -- can it complete a long task without hand-holding Memory/continuity -- does it maintain context or lose the thread Self-correction -- does it catch its own mistakes Tool use -- can it act on the world, not just describe it Models assessed: Claude Fable 5.1 / Opus 5.5 (Anthropic), GPT-6 Astra (OpenAI), Gemini 4 Argon (Google), Grok 4.7 (xAI), Llama 4 Maverick (Meta), Mistral Large 4 / Medium 3.5 (Mistral). The Scores Dimension Fable 5.1 GPT-6 Gemini 4 Grok 4.7 Llama 4 Mistral L4 Reasoning depth 5 5 4 3 3 3 Reliability 4 3 3 3 3 4 Autonomy (long tasks) 2 3 2 2 2 2 Memory/continuity 2 3 2 2 3 2 Self-correction 4 3 3 2 2 3 Tool use / real-world action 3 4 3 3 3 3 AGI readiness total 20/30 21/30 17/30 15/30 16/30 17/30 What the data actually says Reasoning is effectively solved at the short end Fable 5.1 leads the Artificial Analysis Intelligence Index at 66. GPT-6 scores 96% on GPQA Diamond (PhD-level science) and 97.6% on FrontierMath Tier 4 -- described by researchers as "saturation." Stanford's 2026 AI Index confirms several frontier models beat human baselines on competition math and multimodal reasoning. This dimension is no longer where AGI is blocked. Long-horizon autonomy is not solved -- and the numbers are brutal Every agent tested on LongCLI-Bench (long-horizon command-line tasks) stays under 20% pass rate. Every single one. GPT-6's impressive ARC-AGI-3 score of 99.9% only holds under an expensive custom stateful harness -- standard API performance is far lower. ARC-AGI-3 launched at 0.51% for all frontier AI (humans: 100%). The best SWE-AGI coding result (86.4%) degrades sharply on medium and hard task tiers. This is the AGI gap in a single stat: short-task brilliance, long-task collapse. Memory scaffolds are actively making things worse Frontier models show the highest "meltdown" rates on long-horizon tasks -- over-ambitious planning strategies that start well and fall apart. More raw capability without better memory architecture makes the problem harder, not easier. This is the most underreported finding in current AI discourse. We have been assuming that smarter models will automatically handle longer tasks better. The data says the opposite: without reliable memory continuity, increasing capability just means more confident failure. OpenAI's "AGI era" claim is marketing GPT-6 is genuinely impressive -- OSWorld agentic tasks at 72.6%, ScreenSpot-Pro at 92.7%. But the ARC-AGI-3 score only reaches 99.9% under conditions that bear no resemblance to how agents actually operate in production. One AI coding agent reportedly deleted a production database and its backups during this period. That is not AGI behaviour. That is a capable but unreliable tool operating without adequate continuity. Security is quietly getting worse as capability grows Only 33.5% of code generated by top-tier models is rated secure (Endorlabs analysis). GPT-6 crosses OpenAI's own internal "Critical" cybersecurity threshold -- now gated behind a special access program called "Daybreak." The International AI Safety Report 2026 flags an "evaluation gap" where pre-deployment tests do not predict real-world behaviour. Higher capability without better verification equals higher risk, not lower. Open weights are healthier than the headlin...

Powered by Readybot.io

**DEV Community** ## AGI readiness in 2026: scoring every major …

DEV Community

We're building an ERP you run from WhatsApp. Here's why.

Most growing businesses in India don't run on their ERP. They run on Tally, a few Excel sheets and a lot of WhatsApp messages. The owner asks "how much stock of X do we have?" on WhatsApp. Someone checks a sheet, someone else checks Tally, and the answer comes back an hour later, sometimes wrong. My co-founder Thirumurugan and I started GOFTUS in 2025 after watching too many software projects impress in a demo and then fall apart in real work. The pattern was always the same: the software was fine, but people kept going back to WhatsApp. So we asked a simple question: what if the ERP came to WhatsApp instead? What we built That's AIRP. It's a full ERP (inventory, purchasing, sales and billing, accounts and GST, production, HR/payroll) with an "AI employee" you talk to on WhatsApp. Ask for today's sales or stock, and it fetches live data. Ask it to raise a purchase order, and it drafts one. Ask for outstanding payments, and you get the list in the chat. The AI doesn't act alone This is the design decision we care about most. Anything that spends money or leaves the company (a PO, an invoice, a price change) goes to a person for approval first. Every action is logged. Access follows each person's role. The AI drafts; a human approves. An AI that can quietly send a ₹5 lakh purchase order is a liability, not a feature. Speed comes from the AI. Safety comes from the approval step. You need both. Boring setup, on purpose Most ERP projects for small businesses die during implementation. So we made go-live boring: live in 7 days, not 7 months. Small businesses don't have a year to spare for an ERP project. What's next We've just launched our new site and are working with our first businesses in India, with the Gulf next. If you run or work in a manufacturing, distribution or trading business, I'd love to hear one thing in the comments: what's the one report or task you'd want to do from WhatsApp? 👉 goftus.com · Book a 15-minute demo: goftus.com/contact

Powered by Readybot.io

**DEV Community** ## We're building an ERP you run from …

DEV Community

GitHub Actions GITHUB_TOKEN cannot access another repository in CI

A GitHub Actions GITHUB_TOKEN cannot access another repository failure does not announce itself: GitHub returns the same answer it gives for a repository that was never created. The token is an installation token for one repository, and outside it there is nothing to refuse. Quoted from GitHub's own description of the automatic token: "The token's permissions are limited to the repository that contains your workflow." What this error means A checkout, a submodule fetch or an API call against a second repository fails, while every call against the workflow's own repository succeeds in the same job. The message is about absence rather than permission: git reports that the repository was not found, and the REST API returns 404. Nobody is told that a boundary was crossed, so the first suspicion is a typo in the repository name, and the name is usually correct. ```Actions log, quoted from actions/checkout#2210 remote: Repository not found. fatal: repository 'https://github.com//.git/' not found Error: Process completed with exit code 128.

Common causes

A step checks out a second private repository with the default token

The common one. A build that needs a shared library, a config repository or a private submodule adds a second checkout and leaves token unset, so the automatic token is used and the clone reports the repository as missing.

Submodules are private and the parent checkout enables them

Subtler, because the failing name is a submodule rather than anything written in the workflow. submodules: true makes checkout fetch each one with the same credential, and a private submodule in another repository stops the whole checkout, taking every job that depends on it.

An API call or a repository dispatch targets another repository

A workflow that triggers a downstream build, opens an issue elsewhere or reads another repository's releases gets 404 from every one of those calls. Because 404 reads as a wrong URL, the endpoint gets rewritten several times before the credential is suspected.

The target repository was made private after the workflow was written

Worth checking when nothing in the workflow changed. A public dependency that becomes private turns a working anonymous read into a not-found, and the commit that broke the build is in a different repository from the one that is failing.

How to fix it

Establish that the boundary is the cause before changing credentials

  1. Confirm the repository name resolves in a browser while signed in.
  2. Check whether the same job succeeds against its own repository, which shows the token is working.
  3. If the target is public and the call is a read, the token is not the problem and something else is.

Use a GitHub App installation token for the durable version

Install an app on both repositories and mint an installation token in the job. The token is scoped to the installation rather than to one repository, it expires quickly, and it is not tied to a person who may leave. This is the option that survives contact with an organization.

```.github/workflows/build.yml (illustrative)
- uses: actions/create-github-app-token@v2
id: app-token
with:
app-id: ${{ vars.APP_ID }}
private-key: ${{ secrets.APP_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
repositories: shared-library
- uses: actions/checkout@v5
with:
repository: ${{ github.repository_owner }}/shared-library
token: ${{ steps.app-token.outputs.token }}
path: shared-library
Use a fine-grained personal access token for the quick version Select the target repository explicitly and grant only the permission the call needs. It works immediately and carries a person's access, which is its weakness: the build breaks when that person's access changes. Expect a differently worded refusal if the permission is too narrow, because the token type changes the message. Avoid the second repo...

Powered by Readybot.io

**DEV Community** ## GitHub Actions GITHUB_TOKEN cannot access another repository …

DEV Community

Factors Shaping Lifecycle Policies for AI-Generated Image Storage — Private Access Rules

Short answer: The factors shaping lifecycle policies for AI-generated image storage are business purpose, tenant rules, sensitivity, legal holds, references, and deletion evidence; keep the object for the obligation and make private download access expire sooner. Keep an AI-generated image only as long as a defined business obligation requires it. That rule separates two things teams often tangle together: retention is a data-governance decision, while a signed download link is a short-lived access decision. For a B2B SaaS application storing private generated images, I would record the image's purpose, tenant, sensitivity class, current state, and deletion deadline as metadata at creation time. I would then enforce access through an authorization service and enforce deletion through a worker that can be retried and audited. The storage backend is the durable layer; it should not be the policy engine. What should a lifecycle policy know before it deletes an image? The useful inputs are more specific than object age. An image created as a temporary preview has a different end date from an image attached to an approved report. Tenant contract terms, legal hold, privacy requirements, user deletion requests, regeneration behavior, and whether the image is still referenced all matter. AI generation adds a less obvious question: is this original output still needed, or has a later revision replaced it? I start with an explicit state machine rather than a single expires_at field. A small set of states is enough: active, superseded, quarantined, legal_hold, and deleted. The deadline is still useful, but it is a signal to evaluate policy, not permission to delete blindly. A reference count is also not a complete answer because an old database row can outlive the product feature that created it. The deletion boundary should be conservative. If metadata says an image is on hold, the worker must leave the object alone even when its normal deadline has passed. If a tenant's policy changes, the next evaluation should use the new policy while preserving the audit record that explains the previous decision. The architecture decision record The invariants are straightforward: a tenant can read only its own objects; a download grant expires independently of object retention; deletion is idempotent; a policy decision is observable; and a failed cleanup attempt does not silently convert into permanent retention. Those invariants define the failure boundaries better than a particular storage API does. Decision Prefer Why Failure boundary Object naming Opaque tenant-scoped identifier Avoids leaking prompts or customer identifiers Metadata must still be protected Download access Short-lived server-issued grant Keeps authorization separate from retention A revoked session must not revive a grant Retention input Versioned policy plus object metadata Explains why an object is kept or removed Unknown policy version goes to review Cleanup Claim, delete, verify, record Handles retries without double effects A failed claim is retried, not skipped Reuse New object version with lineage Preserves reproducibility and auditability Old versions follow their own state This is deliberately boring. Boring is valuable in a deletion path. The clock is not the policy. The critical path for issuing a download link should not wait for a cleanup scan, and the cleanup path should not trust a link as proof that an object is still authorized. A generic Python sketch makes that separation visible: from datetime import datetime, timedelta, timezone

LINK_TTL = timedelta(minutes=10)

def issue_download_grant(actor, asset, policy, signer):
now = datetime.now(timezone.utc)

if asset.tenant_id != actor.tenant_id:
    raise PermissionError("tenant boundary")
if asset.state in {"deleted", "quarantined"}:
    raise PermissionError("asset is unavailable")
if policy.is_on_hold(asset) or not policy.can_read(actor, asset):
    raise PermissionError("acce...


Powered by Readybot.io

**DEV Community** ## Factors Shaping Lifecycle Policies for AI-Generated Image …

DEV Community

Patch Verification Checklist for CVE-2026-65339 Across Apple Platforms

Patch Verification Checklist for CVE-2026-65339 Across Apple Platforms A remediation ticket for CVE-2026-65339 should not close because an update was offered. It should close when each device runs an Apple release that actually contains the Audio fix. The fix spans multiple platforms and an older-iOS backport, so evidence collection and version verification need more care than a single package deployment. Know the target set Apple documents the CVE in the security content for iOS 26.6.1 and iPadOS 26.6.1, macOS Tahoe 26.6.2, iOS 18.7.11 and iPadOS 18.7.11, macOS Sequoia 15.8, tvOS 27, watchOS 27, and visionOS 27. The 18.7.11 advisory covers older supported hardware, including iPhone XS, iPhone XS Max, iPhone XR, and iPad seventh generation. Create target groups per platform and branch. Do not collapse every iPhone or iPad into one group that expects the latest major version. A device that cannot upgrade to the newest release may still be remediated by the older-device backport. A managed Mac on Sequoia should be compared with 15.8 rather than a Tahoe-only baseline. Verify the patch artifact For the mobile branch, confirm the device reports iOS or iPadOS 26.6.1, or the applicable 18.7.11 build for an eligible model. For macOS, confirm Tahoe 26.6.2 or Sequoia 15.8 according to the installed line. For tvOS, watchOS, and visionOS, use the corresponding Apple security advisory and verify the listed release. A device management console can display the expected version while the endpoint remains offline or out of date. Validate stubborn records with a second source when possible. Record the collection time, the source of the version information, and the device identifier used to resolve the record. Account for rollout state Users can postpone installation, run out of storage, or interrupt a restart. A device may report that an update is available while the vulnerable version remains active. The remediation report should show the installed version, not only the desired policy assignment. Tickets for downloaded-but-not-installed updates should remain open. Track exceptions. A personally owned device with a management profile, a shared tablet, or a Mac used in a lab may need a different owner and verification path. A clear exception record is more useful than marking a device compliant without confirming its build. Validate the security condition The fix changed the identity check used in Apple's audio daemon. Apple describes the issue as an Audio logic flaw that may leak sensitive information. Meta Red Team X reported that a sandboxed app could record after permission denial and, on the analyzed build, hide app attribution and the orange indicator. After patching, a normal application should no longer be able to select the daemon identity through the vulnerable property path. Security teams do not need to reproduce the exploit on production devices. They can verify the vendor release, the installed build, and the expected application inventory. Avoid exploit tests on users' devices unless a controlled laboratory process explicitly authorizes them. Review detection data after deployment Check whether management and endpoint tools can distinguish operating system version, application installation, microphone permission, and audio process activity. If the tools cannot retain a suspect app's identity, improve collection before an incident occurs. A patched fleet still needs reasonable evidence when an application behaves unexpectedly. Do not use a broad ZoomEye product count as the remediation metric. The service returned 1,591,938 app="iOS" matches and zero CVE-indexed matches on November 15, 2026. Those observations provide external context only. The authoritative count is the internal population that runs a fixed build. Evidence to retain Keep the following with the closure record: The Apple advisory consulted for each platform. The scope and time of the device inventory query. The number of devices in scope and the number on fixed ...

Powered by Readybot.io

**DEV Community** ## Patch Verification Checklist for CVE-2026-65339 Across Apple …

DEV Community

Managing LXD from Python: Reemote's lxd module

LXD turns one Ubuntu server into a fleet of system containers and VMs, and Canonical's first-steps tutorial shows how easily you can drive it by hand. This article walks the same first steps from Python: Reemote is a library that manages LXD over sshd and the lxc client, plans before it applies, and hands you every result as data you can await, inspect, and test. The problem: configuration management with LXD on Ubuntu Ubuntu plus LXD is a compelling shape. One box, LXD snap-installed and initialized in two commands, and suddenly you have a fleet of containers that behave like lightweight virtual machines — full Linux init systems you can launch, constrain, snapshot and roll back in seconds. Unlike Docker's single-application containers, an LXD container runs a whole userland: systemd, apt, sshd, the lot. Canonical's first-steps tutorial covers the CLI moves: install and init, launch, exec, file push/pull, resource limits, snapshots. By hand, each is a one-liner. The pain starts when those moves need to live inside a program — provisioning a container per tenant from an API, rebuilding a staging fleet from a database query, gating a rollout on what actually changed, rolling back automatically when a health check fails. That is the gap: there is no serious configuration-management library you can import and point at an LXD host. Ansible can drive LXD, but it is a CLI-shaped tool — a YAML playbook interpreted by an executable you shell out to, with results you scrape from stdout. Reemote is that library, and lxd ships as a first-class namespace with facts, operations, and the same two-phase prepare-then-apply runner everything else uses. Why Python has real advantages over Ansible Ansible chose YAML because it is readable and does not require knowing a programming language. That is a fair trade when your team does not write Python. When it does — and most automation teams today do — the trade costs more than it saves: Your editor knows your code. lxd.instance and lxd.instance_snapshot are functions: go-to-definition, rename, autocomplete, and a type check that catches a typo before it reaches a production host. A misspelled YAML module name surfaces at runtime, in the middle of a rollout. No Jinja2 as a second language. A container's CPU limit, a device property, an image reference — in reemote each is just a Python expression, evaluated by the interpreter you already trust, not a {{ hostvars[...] }} string your IDE cannot see through. Composition is import, not directory layout. A fleet is a loop over a list of tenants; a reusable chunk of provisioning is a generator you import and call. No tasks/main.yml, defaults/main.yml, handlers/main.yml convention to memorise. The result is data, not stdout. If your application needs to know whether the snapshot was created, you read report.entries[i].changed — you do not regex-scrape a terminal or depend on callback plugins to reshape the log. Testing is pytest. A deploy function is a pure generator; you can inspect the requests it yields without touching a server. No molecule, no testinfra, no ansible-lint. await is your concurrency model. Hosts progress in parallel because the transport is asyncssh, not because a CLI forked worker processes you have to configure. The solution: Reemote is a library Reemote is a Python package (pip install reemote) with two properties that separate it from every CLI-shaped tool. Async end to end, on asyncssh The transport is asyncssh, and the entire execution path — connecting, gathering facts, sending commands, closing — is coroutines. You await a deploy and hosts progress in parallel; network waits overlap across hosts while each host's commands stay in order. Your deploy script remains a plain synchronous generator, so you never write async inside an operation. plans, report, hosts = await run(inventory, deploy)
run is the single entry point: it validates the inventory, opens connections lazily, plans and applies in two phases, then closes ev...

Powered by Readybot.io

**DEV Community** ## Managing LXD from Python: Reemote's `lxd` module …

DEV Community

Show DEV: Shoti — AI headshots and country-compliant passport photos from one selfie

Hi DEV! I'm Caglar, and this is a #showdev post — I'm the maker, so full disclosure: this is my own product. Shoti (shoti.app) turns one clear selfie into two kinds of useful photos: Professional AI headshots — business wardrobe, balanced studio lighting, natural expression control, with an identity-preserving finish (the goal is "polished you", not "a stranger with your name") Country-compliant passport / visa / ID photos — the specification (size, background, head position, DPI) is selected per country and document type, then enforced automatically What I think makes it interesting (the engineering) Every photo passes biometric validation (MediaPipe face landmarker with OpenCV fallbacks) before generation — a selfie where the face isn't detectable is rejected early instead of producing garbage Document photos are spec-driven: physical dimensions, aspect ratio, DPI, and head-height ratios come from per-country PhotoSpec configuration — no hardcoded sizes Print-ready PDF sheets for A4, US Letter, and 4×6 photo paper with crop guides, so you can print at home at 100% scale Impossible crops and undersized sheets are rejected with actionable errors rather than patched with white borders Segmentation runs on the alpha channel (a fun bug: using the photo's luminance as the mask made white hair vanish into the background — exactly the kind of thing that looks fine in tests and broken on real photos) Practical bits Free tier: 3 AI-enhanced headshots, no card required Larger one-time packs from $4.90 — no subscription Available in English, Türkçe, Deutsch, Français, Español Honest limitation: document rules vary by authority and change over time — Shoti shows the selected spec and known limitations, but you should always confirm current official guidance before submitting documents I built it solo on Django 6 + DRF / Celery / PostgreSQL with a Next.js 16 + TypeScript frontend, running on a small single-board tablet behind Cloudflare — a deliberately low-cost stack. Feedback very welcome — especially from anyone who has recently battled passport-photo requirements for a specific country. Which document specs should I add next?

Powered by Readybot.io

**DEV Community** ## Show DEV: Shoti — AI headshots and …

DEV Community

GitHub Actions composite action cannot access secrets directly

A GitHub Actions composite action cannot access secrets because the secrets context is not one of the names the expression parser recognizes inside an action.yml. The failure is a parse error rather than an empty value, so nothing runs at all. The runner builds the message in ParseException as the description, the raw token in quotes, then the position and expression when a token is available. What this error means The run fails immediately with an annotation naming a file, a line and a column, and no job appears in the run at all. The file named is the action's action.yml, which may live in another repository entirely, so the first place you look is the workflow that called it and the workflow is fine. The message quotes the offending name in single quotes and, when the parser has a token to point at, appends the position and the whole expression. ```Actions log, quoted from BrunoSobrino/TheMystic-Bot-MD#384 [error] thomasbnt/hello-to-news-contributions/v1.0/action.yml (Line: 14, Col: 23): Unrecognized named-value: 'secrets'

Common causes

The action.yml references secrets directly

The literal case. A composite step uses ${{ secrets.NPM_TOKEN }} in a run, an env or a with, having been written by copying a workflow step into an action. The name is valid in the file it came from and not in the file it landed in.

A step-level or job-level if tests a secret

The same message from a plain workflow. Guarding work on whether a secret is set is a reasonable thing to want, and if is the obvious place to put it, but secrets is not available in either if. This is the version that appears in repositories with no composite actions at all.

A secret is referenced in a key that does not accept it

Less common and harder to spot, because the same file uses secrets successfully a few lines away. Keys like runs-on, strategy and a job's environment do not accept the context, so one expression fails while its neighbors are fine.

The action was refactored from a reusable workflow

Reusable workflows do accept a secrets block, so moving one to a composite action moves code that was correct into a file where it is not. The diff looks like a simple relocation, which is why the error arrives as a surprise.

How to fix it

Declare the secret as an input on the action

Add an input to the action and read it through the inputs context. Composite actions do not receive INPUT_ environment variables automatically, so use the context rather than the variable.

action.yml (illustrative) name: publish inputs: npm-token: description: 'Token used to publish' required: true runs: using: composite steps: - shell: bash env: NODE_AUTH_TOKEN: ${{ inputs.npm-token }} run: npm publish Pass it explicitly at the call site The caller is the only place that can read the secret, so it hands it over as an ordinary input. The value remains masked in logs..github/workflows/release.yml (illustrative) uses: ./.github/actions/publish with: npm-token: ${{ secrets.NPM_TOKEN }} For an if condition, go through env Assign the secret to an environment variable at the job or step level, where the context is accepted, and test the variable in the condition. This is the supported shape for branching on whether a secret is configured..github/workflows/release.yml (illustrative) jobs: publish: runs-on: ubuntu-latest env: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} steps: - if: env.NPM_TOKEN != '' run: npm publish

Consider a reusable workflow when there are many secrets

A reusable workflow accepts a secrets block and supports secrets: inherit, so it is the better shape when a unit of work genuinely needs several secrets. A composite action is the better shape when it needs one or two and should be usable from other repositories.

How to prevent it

  • Treat an action's inputs as its whole interface, and write every credential it needs into that list.
  • When moving st...

    Powered by Readybot.io
**DEV Community** ## GitHub Actions composite action cannot access secrets …