The HIPAA Security Rule’s Technical Safeguards (§164.312) define five standards and nine implementation specifications covering access control, audit controls, integrity, authentication, and transmission security.
The guidance also covers the 2025 NPRM proposed changes,including encryption at rest and in transit becoming required, multi-factor authentication (MFA) becoming mandatory for all electronic Personal Health Information (ePHI) access, and new specifications for network segmentation, configuration management, anti-malware protection, patch management, software removal, incident response and breach notification.
Key topics included
Shared responsibility for HIPAA on AWS – A responsibility matrix mapping each §164.312 specification to what AWS manages nd what the customer must configure and operate.
ePHI boundary architecture – Guidance on establishing a defined ePHI boundary
ePHI data flow and encryption – A reference architecture tracing ePHI with the applicable §164.312 specification
Foundation checklist – Prerequisite recommendation before configuring individual Technical Safeguard controls.
This guidance is written for cloud architects, security engineers, CISOs, and compliance teams at covered entities and business associates building or operating AWS healthcare workloads. It assumes familiarity with AWS services and is intended as a practical implementation reference, not a legal or regulatory interpretation. This guidance focuses exclusively on Technical Safeguards.
HHS published a Notice of Proposed Rulemakingin January 2025, proposing significant updates to the HIPAA Security Rule—including eliminating the Addressable designation, making encryption, MFA, and asset inventory mandatory, and introducing new technical requirements not present in the current rule. As of June 2026, the final rule has not been published. This guidance covers both the current rule and the proposed changes and recommends treating all specifications as Required for new workloads.
For questions about HIPAA readiness on AWS, including Administrative Safeguards, Physical Safeguards, risk analysis, and assessment preparation, contact the AWS Security Assurance Services teamor your AWS account representative.
This guidance is provided by AWS Security Assurance Services, LLC, a HITRUST External Assessor Firm and PCI-QSAC along with contribution from AWS HCLS, AWS Compliance teams. It is for informational and guidance purposes only and does not constitute legal, regulatory, or compliance advice. Recipients are solely responsible for determining applicability to their specific environments and legal obligations.
If you have feedback about this post, submit comments in the Comments section below.
On the IPI benchmark, Opus 5 improved over Opus 4.8, reducing the probability of an attacker succeeding within 15 attempts from 5.5% to 2.0%, and from 0.5% to 0.2% on 1 attempt. It also improved on Sonnet 5 (5.9% at k=15) and Mythos 5 (2.6%), making it the most robust model evaluated. Opus 5 also outperformed all non-Claude models on this benchmark. The most robust non-Claude model was Muse Spark at 16.5% within 15 attempts—more than eight times Opus 5’s rate. The most capable GPT 5.6 variant, Sol, was comparable to its predecessor GPT 5.5 (20.0% versus 20.8% within 15 attempts), and was 10 times as likely to be successfully attacked as Claude Opus 5 at 2.0%. The other GPT 5.6 variants are less robust, at 30.4% (Terra) and 43.9% (Luna). A single attempt against GPT 5.6 Sol succeeded 3.1% of the time, higher than the 2.0% an attacker achieved against Opus 5 after fifteen attempts.
We know that preventing prompt injection is impossible in the general case. But we are getting much better at blocking it in specific cases.
Netflix supports a vast and evolving set of features and content types, ranging from 4K streaming and immersive audio to live streaming and cloud gaming, across a diverse ecosystem of devices. However, not all devices are created equal. Hardware limitations such as available RAM, CPU cores, display capabilities, or platform support mean that some features cannot be supported on certain device models. To ensure the best possible user experience, we rely on a deep understanding of device capabilities. We have invested in building a comprehensive device capability data model and integrating feature flags from internal systems, paving the way for smarter, more granular feature management across our global device landscape. This approach helps us identify bottlenecks in feature penetration and accelerates the pace of innovation.
We have designed our data storage and modeling strategies to efficiently support analytics at scale. We use a cumulative table to process information about the device’s capabilities. This table is structured to efficiently capture the latest state of each device and its associated capabilities (like Screen resolutions, Video Profiles Supported, Surround Sound, RAM size etc) making it ideal for analytics and reporting use cases.
For aggregate analytics, we leverage a histogram table that captures active device counts over the past 28 days, broken down by device model and software version. This table also records the number of devices supporting specific capabilities, enabling detailed distribution analysis. One use case for this histogram data is to analyze the distribution of external display capabilities attached to streaming sticks. For example, the histogram below shows that out of total X number of devices, all supported the HD profile (playready), while only 20% devices supported the UHD profile (hevc).
We have built analytical products that leverage these datasets to provide a comprehensive view of feature reach such as 4K Ultra HD, Netflix Spatial Audio, Cloud Gaming and the latest UI. By relying on data-driven insights, we can make informed decisions about which features to enable on specific devices, ensuring both performance and reliability.
Suppose a user searches for café and your corpus contains CAFÉ, or they type straße and you’ve stored STRASSE. To make these count as matches, you need a canonical form that erases case distinctions, so that two strings which differ only in case compare equal. That form is case folding, and it shows up wherever text is matched rather than displayed: search engines, regex (?i) flags, case-insensitive usernames and hostnames.
It’s a basic operation, but at GitHub we run it a lot. Blackbird, GitHub’s code search engine, indexes over 180 million repositories—more than 480TB of source code. Every byte is case-folded before we extract ngrams and build the index, and for every potential query result, another (implicit or explicit) case folding operation is needed to locate matches. At that scale, the speed of even a basic operation starts to matter.
This post is about how we made it fast, and it starts somewhere counterintuitive: the biggest win in the ASCII fast path came from removing an optimization, not adding one. It turns out to be faster to sweep the whole buffer with no branches than to stop early at the first non-ASCII byte. We open-sourced the result as a Rust crate called casefold.
Folding is not lowercasing
It is tempting to reach for str::to_lowercase, but lowercasing and folding are different operations with different goals:
Lowercasing is for display, and it’s locale- and context-sensitive: Greek final sigma lowercases to ς at the end of a word and σ elsewhere, and Turkish I lowercases differently than English I. Case folding is for comparison, and it’s deliberately context-free and locale-independent. The point is a relation that stays stable and symmetric, so that if A folds to match B, B folds to match A in any locale. The Unicode Character Database ships an explicit CaseFolding.txt for exactly that.
The two operations diverge on real characters—ß, İ, final sigma—which is why lowercasing as a stand-in silently produces wrong matches. This crate implements only the simple (1-to-1) folds—statuses C and S in CaseFolding.txt—and not the multi-character “full” folds (ß → ss) or Turkic locale folds (the dotted İ). This isn’t an unusual choice: common tools and regex engines like ripgrep make the same restriction, and being consistent across tools is important.
The counterintuitive core: Don’t stop early
We deal mostly with source code, so the text we fold is overwhelmingly ASCII and making it run at memory speed is the single most important thing we can do. Everything else just has to keep the rare non-ASCII path from spoiling it.
The fold of an ASCII letter is trivial—A..=Z map to a..=z, everything else is unchanged—so the ASCII pass is really just “sweep the buffer, lowercase in place.” Ask any LLM for it and you might get something like this:
let bytes = s.as_bytes_mut();
for (i, b) in bytes.iter_mut().enumerate() {
if *b >= 0x80 {
break; // non-ASCII at index i: hand the rest to the Unicode path
}
if b.is_ascii_uppercase() {
*b += 32; // 'A'..='Z' → 'a'..='z'
}
}
It looks ideal: do the cheap byte work, and the instant you hit a non-ASCII byte, break and let the “real” Unicode path take over: “only do the cheap work until you have to.” On an Apple M4 this runs at about 3 GiB/s. That sounds fine in isolation, but it is more than 15× short of “optimal” because of the if branches.
Let’s delete every branch, line by line:
if b >= 0x80 { break } → don’t stop at all. ORevery byte into an accumulator and test it once, after the loop: high_bit_acc |= *b. Same information (was there any non-ASCII byte?), zero branches in the body.
TheA..=Zrange test → make it arithmetic. b.wrapping_sub(b'A') < 26 is true exactly for A..=Z (any other byte wraps to ≥ 26), yielding a 0/1 mask with no branch.
The conditional write → fold the mask into the store.| (is_upper << 5)sets bit 5—turning an upper-case letter lower-case and being a no-op on everything else—the byte is always written, never branched on.
What’s left has no branch in its body and no early exit:
let mut high_bit_acc: u8 = 0;
for b in &mut bytes {
high_bit_acc |= *b; // detect any non-ASCII byte
let is_upper = b.wrapping_sub(b'A') < 26; // branchless A..=Z test
*b |= u8::from(is_upper) << 5; // set bit 5 → lowercase, else no-op
}
if high_bit_acc & 0x80 == 0 {
return bytes; // pure ASCII: already folded in place, no second buffer
}
A loop with no data-dependent control flow is trivially vectorizable: LLVM emits 16-byte-at-a-time NEON and the whole thing runs at > 45 GiB/s—essentially memory bandwidth. And we come out of the pass already knowing, from high_bit_acc, whether there’s any non-ASCII work left to do.
How much did each step matter? Measuring the cumulative ladder on pure ASCII (Apple M4, 5.7 KB buffer):
Version
Throughput
Vectorized?
naive (break + branch test)
3.1 GiB/s
no (0 vector instrs)
→ branchless test/write, keep break
2.6 GiB/s
no (0 vector instrs)
→ drop the early-exit break
7.6 GiB/s
partially (25 vector instrs)
→ branchless test + write (the loop)
>45 GiB/s
fully (41 vector instrs)
The early-exit is what gates vectorization: keep the break but make the body perfectly branch-free and you still get zero vector instructions (~2.6 GiB/s); a data-dependent loop exit is enough on its own to keep the loop scalar. Only once the break is gone can the compiler vectorize. The final step—making the upper-case fold branchless—then turns a partially vectorized loop (which still compiles the conditional store to a compare-blend-masked-store, ~7.6 GiB/s) into the straight-line arithmetic that hits memory bandwidth.
Note: Branchless is apessimizationin scalar code. Look again at the table: making the body branchless while keeping the break (2.6 GiB/s) is actually slower than the naive branchy loop (3.1 GiB/s). The asm explains why. The branchy version only stores a byte when it actually changes one; its conditional strbis skipped for every lowercase letter, digit and space (the vast majority of real text), and the well-predicted branch that guards it is nearly free. The branchless version replaces that rarely taken store with an unconditionalstrbevery iteration, writing back all ~5,700 bytes instead of just the handful of upper-case ones. Extra write traffic for no benefit. Branchless-write only wins once the loop vectorizes, because then the store becomes a single 16-byte vector write regardless of content, and the per-byte cost disappears. The lesson: a branchless body is worth it only as the enabler for vectorization. On its own, in scalar code, it can cost you.
There’s also a middle ground, and it’s what standard libraries use. Instead of testing one byte at a time, [u8]::is_ascii scans a machine word at a time—on a 64-bit target it tests 16 bytes per iteration by OR-ing two u64 lanes and checking all their high bits with a single & 0x8080_8080_8080_8080 mask. You can build the ASCII fast path on top of that: chunk-scan to find the ASCII prefix, then run the branchless (vectorizable) convert over it. That keeps the early-exit ability—it still bails on the first non-ASCII block—while letting both halves go fast. The catch is that it reads the data twice (once to scan, once to convert), landing at about 23 GiB/s—roughly half of the single-pass branchless sweep, and ~7× the naive break loop. A solid, general-purpose default; just not the absolute ceiling when you control the whole loop and can fold detection and conversion into one branch-free pass.
Wouldn’tfusingthe two passes be faster? It’s the obvious next thought: keep the chunked early-exit but convert each 16-byte block right after you’ve confirmed it’s ASCII, reading the data only once. Measured, it’s ~2.6× slower—8.7 GiB/s versus the two-pass 23. The inner block convert still vectorizes to a single 16-byte op, but now there’s a data-dependent early-exit branch every 16 bytes, and that branch pins the loop to one block at a time: the compiler doesn’t unroll or software-pipeline across blocks, and each iteration pays the full load→test→branch→convert→store latency with nothing to hide it behind. Split into two passes, each one is clean: the scan is a branch-light, store-free word scan that races through memory, and the convert is the fully-vectorized branch-free sweep at >45 GiB/s. Two fast, branch-free passes beat one branchy fused pass—even though the fused version touches the data half as many times. It’s the same lesson one more time: in the hot loop, the branch is the enemy.
Avoiding the heap
Forty-Five GiB/s also means doing zero unnecessary allocation. simple_fold takes the input String by value, owning the heap buffer it can mutate and return it. If the OR-accumulator’s high bit was clear, the input was pure ASCII already folded in place. We hand the same allocation straight back, no second buffer and no copy. Otherwise, we memchrto the first non-ASCII byte and scan the tail from there, leaving the output buffer unallocated (a null write cursor) until we hit a character that folds to different bytes. Text whose multibyte content never folds—CJK, Hangul, Kana, Arabic, Hebrew, symbols—also returns the original allocation untouched, never copying a byte.
Why a second buffer rather than rewriting in place like the ASCII pass? Because folding can make the string longer: almost every fold preserves the UTF-8 length or shrinks it, but two outliers grow—U+023A (Ⱥ) and U+023E (Ɀ) are 2 bytes each yet fold to 3-byte characters (ⱥ, ɀ). Once one appears, the output no longer fits in the input’s bytes, and we need somewhere new to write.
We allocate that buffer once, sized for the worst case, rather than growing it as more folds appear. Incremental reserve calls would mean re-checking capacity, occasionally reallocating, copying everything written so far, and juggling extra length/capacity bookkeeping; a single up-front allocation lets a raw write cursor run straight to the end with none of that. And since the cursor is nulluntil that first growing/changing fold, it doubles as the “have we allocated the extra buffer yet?” flag.
Sizing it needs a bound on growth, and those same two outliers give it: every 2 input bytes yield at most 3 output bytes, capping the output at 1.5× the input—exactly the capacity we reserve:
out = Vec::with_capacity(bytes.len() + bytes.len() / 2 + 4);
After that the loop writes through a raw pointer with no capacity checks and calls set_len once at the end. Two more details keep it branch-light. The run of unchanged bytes between two folds is moved with a single copy_nonoverlapping rather than byte by byte. And each fold unconditionally writes all 4 bytes of a little-endian word before bumping the cursor by only the folded length (1–4)—dropping a branch on the output length from the hot path, with the + 4 in the reservation as the headroom that makes the final character’s over-store safe.
Making Unicode cheap too
When a character does fold, we still don’t want to fall off a cliff—decode UTF-8, hash lookup, re-encode. Unicode 16.0 has 1484 simple-fold mappings, but they’re a very sparse and very structured relation. Four observations shrink them to 1776 bytes and let the fold run without ever decoding a full character.
Even on the non-ASCII path, the overwhelming majority of characters do not fold. The hot operation isn’t really “fold this character,” it’s “does this character fold?” Almost always no. The table has to make that negative test as cheap as possible; the actual folding is the rare case on an already-rare path. That priority is what shapes the layout below—the page bitmap exists precisely so a non-folding character is rejected in a single bit test, straight from its leading UTF-8 bytes, without decoding or scanning anything.
This is exactly why a HashMap<u32, u32> is the wrong shape for the job, not just a bigger one. A hash map is optimized for the hit: it finds a present key in roughly one probe, and only spends extra work (more probes, full key comparison) when load factor or collisions bite. But our workload is dominated by misses—characters that aren’t in the table at all—and a miss is a hash map’s least favorite query: it still has to hash the key, jump to a bucket, and walk the probe sequence far enough to prove absence.
Foldable code points cluster into 64-code-point “pages”
Foldable code points bunch together. Slice the code space into 64-code-point “pages” and the ~1484 folds touch just 59 of ~1960 possible pages. A one-bit-per-page presencebitmap answers the negative test on its own: a clear bit is a definitive “no fold”—copy through, done—which is what makes fold-free scripts cheap. Only on a set bit do we consult a second structure, a cumulative-popcount side table that ranks the page (how many populated pages precede it) to find its slice of entries, storing nothing for the ~1900 empty pages.
let (word_idx, bit_idx, c_len) = if lead < 0xE0 {
(0usize, lead & 0x1F, 2usize) // 2-byte: word 0
} else if lead < 0xF0 {
((lead & 0x0F) as usize, bytes[read + 1] & 0x3F, 3) // 3-byte: word = nibble
} else {
(
(((lead & 0x07) as usize) << 6) | (bytes[read + 1] & 0x3F) as usize,
bytes[read + 2] & 0x3F,
4usize,
) // 4-byte: merge 2 bytes
};
// reject without decoding: clear bit ⇒ no fold
if word_idx >= PAGE_BITMAP.len() || (PAGE_BITMAP[word_idx] >> bit_idx) & 1 == 0 {
read += c_len;
continue;
}
Because word_idxdepends only on the lead byte (and, for four-byte sequences, the first continuation byte), the bitmap load can be issued early.
Within a page, folds come in runs
A set page bit tells us something on this page folds, but not which code points or to what. The obvious encoding is one entry per foldable code point—but that is both bulky and slow to search: a page can hold dozens of folds, and we’d have to scan them all to find the one matching the current code point. The structure of the data rescues us again. Adjacent code points overwhelmingly share the same delta to their fold: A–Z all map +32, and Latin Extended is full of alternating runs like 0x0100, 0x0102, 0x0104, … where every second code point folds. Instead of per-code-point entries we store runs—start, end, stride, delta—and a 1-bit stride flag covers both the contiguous and the every-other case. This interval compression collapses the ~1484 individual folds into just 238 runs across the 59 pages (≈four per page), leaving the within-page search only a handful of entries to look at instead of dozens. This range-with-delta encoding (including the stride trick) is borrowed from Go’s unicode package, whose CaseRange records store a Lo/Hi range plus per-case deltas, with an UpperLower sentinel marking the alternating blocks. Runs are split at the page boundaries so a run never straddles two pages.
A run record is two clean bytes
With both endpoints inside one page they fit in 6 bits, split across two arrays: RUN_END_LOW[``i``] = end & 0x3F (the scan key) and RUN_START_STRIDE[``i``] = (start & 0x3F) | ((stride − 1) << 6) (read only on a hit). Because each key is one clean byte, the within-page search can go wide: rather than comparing cp & 0x3F against the runs one at a time, we load 8 end_low bytes into a single u64 and test all of them at once with one branchless SWAR step—(chunk | 0x80…80) − broadcast(low) & 0x80…80 sets the top bit of every lane whose key is ≥ cp & 0x3F. A single bit-scan of that mask (the keys are sorted, so the first set lane is the run we want) finds the slot. A page holds ~4 runs on average; that one 8-wide compare almost always resolves the entire search in a single step. One unlucky page does hold 30 runs, which puts the compare inside a short loop that strides eight keys at a time—but that loop trips at most a handful of times on exactly one page in all of Unicode, and never on the common ones. Either way: no per-run branch, and no code-point reconstruction anywhere.
/// Offset of the first run with `end_low >= low_v` in a page of `n` runs,
/// or `n` if none. Scans 8 `end_low` bytes at a time via SWAR.
#[inline]
fn scan_end_low(lo: usize, n: usize, low_v: u8) -> usize {
const HIGH: u64 = 0x8080_8080_8080_8080;
const ONES: u64 = 0x0101_0101_0101_0101;
let bcast = (low_v as u64).wrapping_mul(ONES);
let mut base = 0;
while base < n {
// RUN_END_LOW is padded by 8 bytes so this read is always in bounds.
let chunk = u64::from_le_bytes(
RUN_END_LOW[lo + base..lo + base + 8]
.try_into()
.expect("8-byte slice"),
);
// `(b | 0x80) - low_v` keeps its high bit iff `b >= low_v` (no
// cross-lane borrow). The first set lane is the first run `>= low_v`.
let ge = (chunk | HIGH).wrapping_sub(bcast) & HIGH;
if ge != 0 {
let j = base + (ge.trailing_zeros() / 8) as usize;
return if j < n { j } else { n };
}
base += 8;
}
n
}
Folding is a little-endian byte addition
On a little-endian machine the folded character’s UTF-8 bytes, read as a u32, equal the source bytes (as a u32) plus a per-run constant. A parallel BYTE_DELTA[i] table then turns the whole fold into a masked load, one wrapping_add, and a 4-byte store:
let word = u32::from_le_bytes(next_four_bytes) & length_mask; // keep this char's bytes
let folded = word.wrapping_add(BYTE_DELTA[i]); // the fold, as one byte add
write_u32_le(dst, folded); // store all 4 bytes...
dst += utf8_len(folded); // ...advance by the folded length
Both lengths in that snippet—the length_mask for the source character and the advance by the folded length for the destination—come from one more tiny trick. A UTF-8 sequence’s length is fixed by the top four bits of its lead byte, letting the 16 possible lengths pack one nibble each into a single 64-bit constant (0x4322_1111_1111_1111); the length is then a shift and a mask, (LEN_BITS >> (4 * (lead >> 4))) & 0xF—no if chain, no table memory, nothing for the predictor to get wrong. (A count leading ones—(!lead).leading_zeros()—would also work, since a lead byte carries one leading 1-bit per byte of the sequence.)
/// Number of bytes in the UTF-8 sequence whose lead byte is `lead`.
#[inline]
pub fn utf8_len(lead: u8) -> usize {
const UTF8_LEN_BY_LEAD: u64 = 0x4322_1111_1111_1111;
((UTF8_LEN_BY_LEAD >> (4 * (lead >> 4))) & 0xF) as usize
}
Because we advance by the folded length, this even handles length-changing folds—U+212A KELVIN SIGN (3 bytes) → k (1 byte), or U+023A Ⱥ (2 bytes) → U+2C65 ⱥ (3 bytes)—by writing fewer or more bytes than were read. That’s the part we believe is genuinely new: every other folder we looked at—ICU, Go’s unicode, Rust’s regex, CPython, glibc—decodes UTF-8 to a code point, applies the fold there, and re-encodes (even SIMD folders decode first). Doing the arithmetic in byte space skips both the decode and the encode, which is exactly why this path can outrun a hash map that already has the answer tabulated—the hash map still has to decode its key and encode its result. The byte-space arithmetic assumes the input is well-formed, shortest-form UTF-8—every code point encoded with the minimal number of bytes. Reading the source bytes as a u32and adding a per-run delta only lands on the correct folded encoding when the source is in canonical form; an overlong encoding (a code point padded into more bytes than necessary, e.g. / as 0xC0 0xAF) has a different byte pattern and would break thelength_mask and the delta arithmetic. This is not a real restriction in Rust—&str/String are guaranteed to hold valid UTF-8, which by definition rejects overlong sequences—but a caller feeding raw bytes from elsewhere must validate (or otherwise normalize) them first.
The ASCII shortcut in the tail loop
One more shortcut rounds out the tail loop. Remember the first pass already lowercased every ASCII byte, so when the scan meets an ASCII byte in the tail it advances a single byte and moves on—no page probe, no table touch at all. And it doesn’t copy that byte either: unmodified bytes (ASCII and non-folding multibyte alike) aren’t moved one at a time. The scan just keeps walking until it reaches a character that actually folds, then flushes the whole unchanged run between the last fold and this one with a single copy_nonoverlapping. Mixed text—CJK with ASCII spaces and punctuation, or code with the occasional accented identifier—therefore races through the ASCII filler and only consults the bitmap for genuine multibyte characters, copying in bulk rather than byte by byte.
Putting it together: the whole table
Component
Bytes
PAGE_BITMAP (1 bit per 64-cp page)
248
POPCNT_SAMPLES (cumulative popcount)
32
PAGE_OFFSET (per populated page)
60
RUN_END_LOW (scan key, end & 0x3F, +8 pad)
246
RUN_START_STRIDE (start & 0x3F | stride)
238
BYTE_DELTA (little-endian fold delta per run)
952
Total
1776
That’s 9.6 bits per fold entry, over half of it the BYTE_DELTA side table we trade for the decode-free path; the index + run records alone are ~4.4 bits/entry.
Next to the obvious alternatives, that 1776 bytes is an order of magnitude or more smaller—and unlike most of them, it never decodes a character:
Representation
Size
Naïve [(u32, u32); 1484]
~11.6 KB
regex-syntax’s case_folding_simple table
~70 KB
Go’s unicode.SimpleFold (orbit + ASCII + ranges)
~7.3 KB
A runtime HashMap<u32, u32>
~17 KB
This crate (paged bitmap + packed runs)
1776 B
Where it lands against the alternatives
On the common case, ASCII, folding runs at memory bandwidth (>45 GiB/s), more than an order of magnitude ahead of other real folders and more than 50% faster than the (non-equivalent) str::to_lowercase function. To get a rough “upper bound” for the non-ASCII case, we measured the optimized Utf8 decoding + encoding round trip without performing any actual case folding using the simdutf crate. This experiment achieves consistently about 2GB/sec and is only about twice as fast than our solution for the worst case all-folding input. A naive hash map trails everything on all workloads.
The three columns are real case folders that produce identical output: simple_fold (this crate), simd_normalizer (the simd-normalizer crate), and HashMap (naive CaseFolding.txt lookup). The workload rows are chosen to simulate different scenarios from typical to worst case:
Workload (input size)
simple_fold
simd_normalizer
HashMap (byte path)
Pure ASCII (5.7 KB)
>45 GiB/s
1.21 GiB/s
213 MiB/s
Chinese/Japanese/Korean, no folds (8.1 KB)
2.95 GiB/s
1.97 GiB/s
558 MiB/s
Symbols / Myanmar, no folds (9.0 KB)
2.96 GiB/s
1.56 GiB/s
410 MiB/s
Worst case: Latin/Greek/Cyrillic (Unicode U+0000–U+FFFF), all folding (8.8 KB)
869 MiB/s
922 MiB/s
334 MiB/s
Length-changing folds (1.7 KB)
1.26 GiB/s
716 MiB/s
233 MiB/s
Treat the absolute figures as illustrative, not portable: the whole design leans on auto-vectorization, SWAR, and little-endian byte arithmetic, so the numbers—and even the ratios between rows—can shift substantially on a different microarchitecture (a wider or narrower vector unit, different memory bandwidth, a big-endian target, x86 vs ARM).
Case folding is about as basic as text operations get, which is exactly why it was worth the effort: we run it across every byte we index. The wins came from two ideas that both cut against instinct—sweep the whole buffer branch-free instead of stopping early, and do the fold as byte-space arithmetic instead of decoding to a code point. Together they let the common case run at memory bandwidth and the rare fold run without a decode, in a table small enough (1776 bytes) to stay resident. The decode-free byte-space fold is the piece we believe is genuinely new; it’s why this path can beat a hash map that already has the answer.
There’s surely more to find here, and we’d like to see it. The crate is casefold; the generated table and full design notes live alongside the source.
Song Liu believes that the way that programmers assemble complex BPF programs
will be changing rapidly in the future.
At a session of the 2026
Linux Storage,
Filesystem, Memory-Management, and BPF Summit, he shared his thoughts on what
that change could look like, though he did not have any concrete proposals for
what, if anything, the BPF maintainers should do. He anticipates an
ecosystem of Rust BPF packages developing, which is significant because BPF
does not really have a package manager at the moment.
The Arch Linux DevOps team has announced
that adoption of orphaned packages in the Arch User Repository (AUR)
has been disabled due to “the current influx of malicious package
adoptions and follow-up commits made via the AUR“. Michael Taggart
has posted a brief analysis of the malware being added to a long
list of packages in this round of attacks. The payload appears
to be an remote-access trojan (RAT) that takes commands over the
Tor network and attempts to upload a wide range of user data.
The project had suspended
new account registration in June. That followed a campaign in which an
attacker or attackers created new accounts to adopt orphaned packages
and push malicious updates to them that would install malware on user
systems. AUR registration was reopened
on July 13 after the DevOps team added some minor, and apparently
ineffective, restrictions on creating new accounts.
Last year, we enabled Media over QUIC (MoQ) on every Cloudflare server and opened the network for anyone to test. It provided a global MoQ endpoint, but not the isolation and access controls needed to run an application.
Today, we’re adding those isolation and access controls. The new MoQ provisioning API lets you create an isolated relay for your application and issue separate credentials for publishers and subscribers. The relays you create are available across Cloudflare’s network within seconds, with no servers to deploy, size, or load balance. Cloudflare now supports the draft-14 and draft-16 versions of the MoQ Transport protocol with authentication support.
You can create relays through the API and the Cloudflare dashboard. They are completely free to use during beta.
A QUIC recap on MoQ
MoQ (originally short for Media over QUIC) is a new open protocol under development at the Internet Engineering Task Force (IETF), the standards body that also standardized HTTP, TLS, and QUIC. It is being developed in the open and will become a free public standard (an RFC) that anyone can implement. No single company owns it.
MoQ is a publish/subscribe system. A publisher sends out streams of data that have names, and subscribers ask for those streams by name. Between them sit relays, which are just CDN servers that copy each stream to everyone who wants it. A relay never has to look inside the data it forwards, so one publisher can reach a large audience without handling the fan-out itself.
Because relays don't care what's in the data, the same protocol can carry many things that each used to need a separate system: live video, video calls, low-latency messaging, and more. It runs on QUIC, the transport under HTTP/3, which is what keeps latency low.
The practical result is that you don't have to build and run your own fleet of specialized servers. You publish to a CDN through one simple API and get both low latency and large scale for much less cost.
How we got here: the MoQ open preview
Last year, we launched the first global MoQ relay network: every Cloudflare server in over 330 cities became a MoQ relay, free and open to anyone. Because these endpoints required no authentication, they were ideal for protocol testing and client development. More than 1,000 unique clients still connect each day to test against them.
But an unauthenticated relay isn't suitable for production, because you can't control who publishes and who subscribes. That rules out any application that needs confidentiality, access control, or a clear split between publisher and subscriber roles. Take a live auction site, where bids have to reach bidders in milliseconds. MoQ is a good fit, but publishers and subscribers need different permissions, so that a viewer's credentials can't be used to hijack the publisher's tracks.
What is a relay on the Cloudflare MoQ Network?
In most MoQ deployments today, a relay is a dedicated server or a dedicated process on a shared server. Scaling this architecture means running more instances, assigning clients to them, and adding load balancers as demand changes. This is not how any Cloudflare service works, including our Realtime SFU WebRTC service.
Provisioning a relay doesn’t start a virtual machine, container, or dedicated process. Instead, it creates an isolated scope across the existing global network.
That scope separates your namespaces, tracks, and objects from those belonging to other relays. It also defines who can enter the scope and whether they can publish or subscribe. Clients connect to the Anycast endpoint, and Cloudflare handles routing them across the network.
If you’re familiar with web hosting, creating a Cloudflare relay is more like adding a virtual host than starting a new web server. Since the infrastructure is already running, the provisioning API adds your application’s configuration and credentials. This makes the relay available immediately without choosing regions, estimating capacity, or setting up a load balancer.
The control plane API for MoQ at Cloudflare
The provisioning API is a control plane: it manages relays and the tokens used to reach them, and it never touches the media that flows through them.
There are two kinds of resources.
A relay is the isolated scope from the previous section, so one application's streams never mix with another's.
A token is a credential that grants a set of operations (publish, subscribe, or both) on a single relay. Handing publishers and subscribers different tokens is what stops a viewer from taking over a broadcaster's tracks.
Each token is scoped to the operations a client needs, can be given an expiration, and can be revoked on its own. That lets you grant exactly the access a client should have, and take it back later without disrupting anyone else.
For now, each token applies to an entire relay and permits publishing, subscribing, or both. We're working in the IETF and the wider MoQ community on a richer scheme that works for everyone. If you have opinions, tell us at [email protected].
Creating a relay takes a single API call and only needs a name:
Cloudflare returns a relay ID and the two default tokens: The first token can publish and subscribe, and the second can only subscribe.
To give a client narrower access, add more tokens. This one is a subscribe-only token for viewers that expires at the start of 2027:
In the Cloudflare dashboard
You can also create a relay in the dashboard:
Go to Media > Realtime > MoQ Relay. Select Create relay, give it a name, and then confirm.
Connect a publisher and a subscriber
You can create and manage tokens through the API or dashboard, just as you can the relay itself. Give your broadcaster the publish-and-subscribe token and your viewers the subscribe-only token. Each client sends its token when it opens a MoQ session, and the relay enforces what that token is allowed to do.
The token travels in the URL path. For example, with the open-source moq-rs tools, a broadcaster can publish a fragmented MP4 stream from ffmpeg:
A viewer connects with moq-sub:
The relay reads the token when the session opens and checks whether the requested operation is allowed.
What we changed to support draft-16
The provisioning API is only one part of what’s new. The MoQ transport itself is advancing fast, and Cloudflare now supports draft-16 of the IETF MoQ spec in its relays. This draft adds two features relevant to publishing and subscribing.
PUBLISH now lets a publisher send a track to a relay before a viewer requests it. Without PUBLISH, the first subscription must travel through the relay chain to the publisher before the publisher starts sending. With PUBLISH, the relay can already be receiving the track when the first viewer connects.
SUBSCRIBE_NAMESPACE lets a subscriber request every track announced under a namespace instead of requesting tracks individually. The subscription also covers tracks added later, such as a new video rendition or audio track introduced during a live stream.
You can now connect a draft-16 client to use both features.
Built in the open
MoQ is an open standard, developed at the IETF by engineers across the industry. This lets clients and relays implement a common protocol. That interoperability is less useful if every relay provider requires a different control plane for creating scopes and issuing credentials.
In that vein, we’re documenting the design behind this API in the MoQ CDN Provisioning Internet-Draft. The draft calls the provisioned resource a scope rather than a relay, but both terms refer to the same logical delivery context: a boundary that applications create and then enter with a credential.
The goal is for multiple CDN and relay implementations to support a common provisioning model. The document is still an Internet-Draft, not an RFC, and its API model may change as the working group develops it.
Available today, still free in beta
The MoQ relay provisioning API is available now, as part of the MoQ beta. It's free to use at any scale during this preview period.
The API will change as we develop it, so we recommend checking the developer docs for updates and breaking changes.
We’d also love to hear what you want next. Finer-grained permissions? Bring-your-own signing keys? Let us know at [email protected].
Black Hat USA returns to Mandalay Bay in Las Vegas this August, bringing together security practitioners, researchers, and leaders from around the world. Rapid7 will be there in the Business Hall, with new capabilities, live demonstrations, expert-led sessions, and two days of activities at the Border Grill.
This year, our focus is preemptive security: helping security teams anticipate credible risk, respond at machine speed, and maintain an accurate view of their security and compliance posture as their environment changes.
Visit the Rapid7 booth at Black Hat USA
You can find Rapid7 at booth #2445 in the Mandalay Bay Business Hall, open and running on the following days and times:
Tuesday, August 4: 4:00–7:00 p.m.
Wednesday, August 5: 9:00 a.m.–6:00 p.m.
Thursday, August 6: 9:00 a.m.–4:00 p.m.
The booth will include two demonstration stations, seating, giveaways, and our friendly team of Rapid7 experts – there to help you explore the challenges most relevant to your organization. A chess-inspired theme reflects the principle behind preemptive security: understanding what may happen next and acting before risk becomes an incident.
Live demonstrations will cover four connected areas of the Rapid7 platform:
Predictive risk and vulnerability management: See how attacker behavior and exposure context can help teams focus remediation on vulnerabilities that present credible risk.
Agentic threat detection and response: Explore how the Rapid7 AI Engine and technology from Kenzo Security support adaptive investigations and reduce the time analysts spend gathering context.
Continuous compliance automation: See how Cyber GRC connects governance workflows with live security data, automates evidence collection, and identifies control drift.
Preemptive MDR: Learn how continuous SOC operations, exposure context, and Rapid7 Labs threat intelligence can extend the coverage of internal security teams.
Explore the latest Rapid7 launches at Black Hat
Black Hat will provide a closer look at several additions to the Rapid7 platform, including the general availability of Cyber GRC.
Cyber GRC brings security operations and governance teams closer together by connecting GRC workflows with live security data. The solution draws evidence from SecOps telemetry into compliance dashboards, helping teams maintain a current view of their controls, while AI-assisted workflows reduce the manual inputs involved in third-party risk questionnaires and other repetitive tasks.
Attendees can also learn more about Preemptive MDR Alerts, predictive vulnerability management, and enhanced agentic SOC investigations. These capabilities combine exposure data, asset criticality, threat intelligence, and detection context to help teams identify where attackers are most likely to act. Some will be presented as early-access previews, so availability will vary.
Join us at Border Grill
Rapid7 will take over the Border Grill at Mandalay Bay on Wednesday, August 5 and Thursday, August 6. The space will include additional demonstrations, meeting areas, expert presentations, breakfasts & lunches, and opportunities to speak with Rapid7 leaders and product teams.
Rapid7 Executive Chairman Corey Thomas will discuss how AI-driven threats are changing security operations and what it takes to move toward a more preemptive model.
Agentic SOC: Threat Detection and Response
Thursday, August 6, 9:30–10:15 a.m.
Lisa Washburn, Senior Director of Product Management, will explore how AI agents can investigate alerts at machine speed while keeping expert judgment involved.
Cyber GRC in the Age of AI
Thursday, August 6, 11:30 a.m.–12:15 p.m.
Jon Schipp, Senior Director of Product Management, will show how live security data and automated evidence can support continuous audit readiness.
Border Grill will also host live demos, customer and executive meetings, and the Rapid7 Happy Hour on Wednesday. VIP access begins at 4:00 p.m., followed by general admission from 5:00–7:30 p.m.
Hear from Rapid7 security researchers
Rapid7 researchers Jack Heysel and Spencer McIntyre will present The Metasploit Framework 6.5: Malleable C2 Payloads, New Relay Capability and Protocol Session Upgrades at Arsenal Station 4 in the Business Hall on Wednesday, August 5 from 4:00–5:00 p.m.
Book time with Rapid7 at Black Hat
Whether your priority is reducing exposure, giving SOC analysts better context, improving response speed, or strengthening audit readiness, you can book a meeting or tailored demonstration with the Rapid7 team.
Last month, the story broke (alternate link) that Madison Square Garden uses facial recognition software on everyone entering the facility, and—among other groups—flags activists that oppose using facial recognition.
Turns out that the system was shut off for Taylor Swift’s wedding.
Evan Greer—one of the people that MSG alerts on—comments:
Ironically, Swift herself has reportedly used facial recognition at her own concerts to identify stalkers. This “privacy for me, surveillance for thee” attitude feels like a perfect encapsulation of the future we’re already living in: one where wealthy elites can afford privacy, while the rest of us are forced to live in a corporate surveillance panopticon.
Whatever privacy measures Swift had in place for the wedding seems to have worked. No photos have leaked online.
Дизайнът винаги ме е привличал. Дотолкова, че в един момент от младостта си дори си представях как го изучавам в университета. Слава богу, открих фотожурналистиката преждевременно (или тя мен), а веднага след нея – и визуалния сторителинг (разказване на истории – б.р.). Всичко оттам нататък бе подчинено на едно-единствено желание: да разказвам истории в образи.
В дизайна също има немалко сторителинг. В него безкомпромисно стои и функцията. Именно тук се различават дизайнът и художествените изкуства. Много млади хора биват привлечени от територията на дизайна, бъркайки я с място за естетическо себеизразяване. Както често отбелязва моята колежка и бизнес партньорка Деница Тонева, между двете съществува фундаментална разлика: дизайнът е длъжен да служи на човека, докато изкуството няма такова прагматично задължение. Поне не и в ежедневния, утилитарен смисъл. Изкуството служи на духовните ни потребности и на емоционалното свързване със самия себе си и с другите в обществото.
Въпреки това в дизайна има огромно пространство за творчество, защото той сам по себе си е метод/начин на работа и светоглед (като не-дизайнер мога да си позволя лукса да се изказвам лаически). Дизайнът борави с визуалния език и с всички смисли и знаци от историята на изкуството, през семантиката, до съвременния начин на живот и съответните културни и трансдисциплинарни елементи от ежедневието. Но истината е, че оставам силно заинтригувана от методологията, тоест от начина, по който дизайнерите сканират околната ни среда, как събират, курират, разчитат и накрая превеждат хаоса на езика на формите. Това за мен си е висш пилотаж на вкуса.
Под полите на Витоша
Дизайнът е просторно понятие. В него съжителстват дузина паралелни светове: от анатомията на буквите и шрифтовете, през физическите обекти, до пространствените инсталации и дигиталните преживявания. Затова и не пропускам фестивала „Мелба“, на който екипът на студио „Комплект“ привлича световни имена от тази сфера.
Тази година София беше домакин на фестивала Европейски награди за дизайн 2026(European Design Awards). Зад организацията на това мащабно гостуващо събитие стои дългогодишният упорит труд на Бояна Гяурова и Адриана Андреева от студио „Комплект“, които парче по парче градят местната дизайн среда. Този път те буквално поставиха България на европейската карта, привличайки стотици чуждестранни специалисти, които се „вмъкнаха под полите на Витоша“ (директно намигване към визуалната идентичност на събитието, разработена от дигиталната агенция Next-DC).
Фестивалът за комуникационен дизайн се проведе между 11 и 14 юни в София и предложи богата програма с изложба на плакати, посещения в български дизайн студиа, обмен между европейски специалисти, изложба „20 години комуникационен дизайн“ и два дни вълнуващи лекции на международни и български дизайнери. Всичко това, последвано от черешката на тортата – наградите в множество категории. Един от най-интересните моменти на подобни събития са лекциите, за някои от които ще споделя в следващите редове.
Оголване на излишното
В добрия дизайн всяка стъпка логично следва предишната. Едно от златните му правила гласи: „Кажи го кратко и ясно.“ Няколко от лекторите подчертаха, че простите идеи не са скучни или повърхностни – те са достъпни. Извън този празничен балон обаче в България все още дизайнът се бърка с декорацията, с повърхностното „разкрасяване“, а не със смисленото структуриране. В този контекст простото се възприема като враг – като нещо празно, недостатъчно сочно и лишено от превземки.
Нидерландското студио G2K (представено от Франк Баас и Юри Наута) обаче изповядва тъкмо обратното верую: Keep it simple. Неговата философия изисква да се оголи излишното, за да се разкрие есенцията. Баас и Наута илюстрираха своя подход, давайки пример с работата си по визуалната идентичност на театъра в Гронинген. След като достигат до есенцията на тази културна институция, се ражда и техният визуален преразказ на същността ѝ: „Да провокираме и разбъркаме мисълта.“ Така се създава една смела, директна визия, която умишлено залага на объркания текст, доверявайки се на факта, че човешкият мозък има капацитета да се справи с хаоса и да сглоби смисъла сам.
Понякога дизайнът се проявява и в ежедневните решения. Доказаха го немският графичен дизайнер Пол Вогенрайтер и българският му колега Мирослав Живков. Тяхното сътрудничество се разгръща по оста София – Велико Търново – габровското село Баланите. Пол постепенно се мести от Германия към Пловдив, после към Търново и накрая се установява в къща в село наоколо, а Мирослав основава независимото си печатно студио NoPoint Atelierв село Баланите.
NoPoint Atelier преобразява една стара къща в творческа лаборатория, където ежедневното рисуване и аналоговите процеси се превръщат в терапия и начин за осмисляне на света. За Мирослав Живков е нормално да произведе 20 скици за час. Динамика, в която той умишлено търси свобода, за да не позволи на рутината да пречупи творческото му аз. Заедно с Пол Вогенрайтер осъществяват концепцията за плакат със своите проекти, създадени за пространството ТаМ. Постоянното изследване на границите между подреденото мислене и визуалния експеримент донесе на техния съвместно номиниран проект сребърно отличие от Европейските награди за дизайн 2026 – първото подобно признание за България на този форум.
Изчезващото усилие
Дизайнът освен всичко друго може да бъде и титанично усилие. Янис Константинидис от спечелилото „Еми“ анимационно студио NOMINT започна презентацията си с интригуваща метафора: атлазените беседкови птици, които прекарват целия си живот в изтощително градене и цветово подреждане на гнездо, като рискът да загинат е близо 70%. Цялото това огромно усилие служи единствено за привличане на партньор.
Константинидис пренася акцентиращия върху трудността подход в киното: неговите филми за WWF и BBC са заснети с истински топящ се лед, реален огън и дим. Процесът е толкова труден, че става неделим от посланието. Константинидис ни напомни, че вложеното усилие е основната награда от творческия процес – съзнанието, че си дал всичко от себе си, за да сътвориш нещо автентично.
Това физическо усилие изчезва с всеки технологичен напредък в света на изкуствения интелект, смята гръцкият дизайнер. А когато усилието изчезне, рискуваме да останем в капана на бързата, лесна и дълбоко посредствена заблуда за липсата на смисъл. Ето защо Константинидис е противник на използването на изкуствен интелект в дизайна.
Кампанийното видео, създадено за WWF от студиото NOMINT, използва сложен и трудоемък формат, за да разкаже за проблемите на затоплящите се океани
По време на лекциите дизайнът стана и поле на противоречие. Тъкмо в сблъсъка на противоположни мнения по екзистенциални въпроси се ражда интересният дебат. Веднага след Янис Константинидис на сцената излезе Мария Тодорова от Next-DC, която от години изследва дигиталната трансформация и иновациите. Пред зала, пълна с утвърдени дизайнери, тя сподели, че трябва да прегърнем трансформацията, защото в противен случай ще останем зад борда. И хвърли тежка ръкавица:
Изкуственият интелект вероятно ще заличи средната класа дизайнери.
Фестивалът SHAPESHIFT празнува трансформиращата сила на творчеството, науката, технологиите и иновациите.
Никой не може да предвиди бъдещето с абсолютна точност, но тревогата от подмяната е съвсем реална. Когато си прекарал голяма част от живота си в учене и усъвършенстване на занаят, мисълта, че уменията ти могат изведнъж да се окажат остарели исторически артефакти, предизвиква сериозна криза. Криза, която усещам както в себе си, така и в цялата гилдия. И все пак чувството след този сблъсък не беше пораженческо, а по-скоро мобилизиращо – желание да останеш в играта, дори това да изисква пълна лична трансформация.
Изборът да останеш
Дизайнът може да бъде и позиция. За пловдивското студио Punkt (Красимир Ставрев и Светла Тодорова) той е поредица от решения, дълбоко свързани с концепцията за дома. Във времена, когато е най-лесно да бъдеш глобален номад, Красимира и Светла избират да останат. В Пловдив, където впоследствие постепенно променят визуалната култура на града, привличайки ключови културни институции, чийто публичен образ преработват и осъвременяват.
Визуалната идентичност за „Пловдив – Европейска столица на културата 2019“, разработена от студио Punkt и прераснала в идентичността на града
Техен е и визуалният език на „Пловдив 2019 – Европейска столица на културата“, както и проектът за дигиталния шрифт на града Plovdiv Typeface, сглобен от почерците на самите пловдивчани. Когато проследиш развитието на подобен визуален език, си даваш сметка за суперсилата на дизайна: способността му да укроти нещо толкова голямо, шумно и абстрактно, като едно общество, и да го разкаже чрез образи и форми.
Представителите на Beetroot се припознаха в наратива на Punkt, защото според тях също „да останеш е активен избор“, както се изразиха. Простираща се между Атина и Солун, творческата вселена на студиото Beetroot обединява дизайн студио, концептуално кафене, арт галерия, гурме ресторант и собствен бранд за деликатеси в едно вдъхновяващо градско пространство.
Освен че поддържа тези знакови места, Beetroot създава своя собствена линия продукти. Тоест от подизпълнител трансформира себе си в „свой собствен клиент“. Мечта за много дизайн студиа, сигурна съм.
За съжаление, в една статия не може да се събере всичко от двата наситени дни на фестивала.
Дизайнът, както и архитектурата ни изграждат и могат да оказват влияние върху нас в продължение на дълги периоди. България изпитва силна потребност от разговор за визуалния език. Рекламите, неоновите табели, застарелите знаци и въобще голяма част от заобикалящата ни среда могат да бъдат тема на този разговор. Радвам се, че все повече хора се занимават с тази проблематика. Макар и невинаги да е ясно защо и какво може да донесе визуалният подход. Понякога не всички имат ресурс да оценяват или търсят високо ниво, но както казва и Янис Константинидис от Nomint, би било тъжно, ако колективно спрем да полагаме усилия, защото няма търсене.
Нужни ли са тогава усилията?
Ако възприемем дизайна като „просто комуникация“, тогава изкуственият интелект може да я свърши по-бързо, по-евтино и по-мащабно. Но ако дизайнът е позиция; ако той е съзнателният избор на Мирослав Живков и Пол Вогенрайтер да оставят мегаполиса и да се потопят в своето творчество в габровското село Баланите; на студио Punkt – да остане и изгради визуалния дом на Пловдив; или на Янис Константинидис – да снима филми с истински топящ се лед, тогава вложените усилия са всичко, което имаме.
Защото формата без усилия е просто празна, бездушна опаковка. Именно подходът, усилията, желанието да провокираш отвъд функционалното разбиране приближават занаята до изкуството. Точно това автентично присъствие с отворено сърце и изцапани с мастило ръце е единственото нещо, което никой алгоритъм не може да репликира.
Смисълът винаги се ражда в детайла, в укротяването на хаоса и в смелостта да се довериш на самия процес. Тъкмо в тези споделени и трудни усилия се крие имунитетът ни срещу посредствеността. Докато има автори, готови да платят тази цена, и публика, която да я разчете, бъдещето на разказването на истории – и в дизайна, и в живота ни – остава нужно. Поне засега.
Абсолютното мнозинство е най-големият политически лукс. То дава възможност да промениш държавата, без да търсиш оправдания в коалиционни партньори. Затова първите 100 дни са най-добрият тест за истинските намерения на едно управление.
През април двама нови европейски политици спечелиха огромни мнозинства на парламентарни избори. Партия ТИСА взе 138 мандата от 199 (конституционно мнозинство) в унгарския парламент, а „Прогресивна България“ – 131 от 240 в българския. Лидерите на двете формации Петер Мадяр и Румен Радев оглавиха правителства. Първият обяви, че ще разгражда мафиотския модел на Орбан, вторият – олигархичния модел „Борисов–Пеевски“. И тук свършват приликите.
Още в първите седмици кабинетът на Петер Мадяр започна да изпълнява предизборните си обещания – демонтаж на институционалната архитектура, изграждана от Виктор Орбан в продължение на 16 години. С конституционни промени мандатите на министър-председателя и депутатите бяха ограничени до два, започна и чистка на политическите назначения на Орбан по върховете на държавата. Създадени бяха нови антикорупционни механизми, а в резултат на административната реформа министерствата на образованието, здравеопазването и околната среда отново станаха самостоятелни. В сферата на образованието започват значими промени, като сред първите са открити конкурси, а не назначавани от властта директори на училищни окръзи.
Преместването на премиерския кабинет от пищния Кармелитски дворец в сграда, близо до парламента, беше ясен знак за дистанциране от разточителното управление на автократа Орбан.
Мадяр извърши и още нещо, което ще се помни дълго в Унгария. След като той дойде на власт, унгарската обществена телевизия (канал M1) поднесе официално извинение за дългогодишната пропаганда. Рупорът на политиката на Орбан излъчи надпис с извинение на черен фон за лъжите си:
Обществените медии не трябва да лъжат. Извиняваме се, че въпреки това сме го правили в продължение на много години! В момента обществените медии се преструктурират, за да станат отново независими и достоверни. Излъчването на новини е временно прекъснато. Моля, останете с нас!
А в България властта се кани да въведе задължителна учебна дисциплина добродетели и религия от учебната 2027–2028 година, подобно на руския модел за патриотично образование, основано на традиционни ценности, и на Орбановия модел на „християнска демокрация“.
Сравнението с България е показателно.
Румен Радев дойде на власт с обещание да разгради стария модел на властта, но през първите 80 дни по-скоро го пренареди около себе си. Смени политическата реторика и външнополитическия курс, но запази основните механизми на управление – зависимостта на общините от централната власт, кадровото разпределение между познати партийни мрежи и отсъствието на реален удар срещу икономическите и задкулисните центрове на влияние.
Първите месеци са достатъчни, за да покажат посоката. Най-значимите действия се оказаха бюджет с дефицит 5,7% от БВП, заради който България е поставена в процедура по свръхдефицит, и разрешение за поемане на нов държавен дълг до 10 млрд. eвро. Според плановете на „Прогресивна България“ размерът на държавния дълг ще нарасне до над 50,5 млрд. евро, или 35,2% от БВП към края на 2028 г.
Наред с това винетките поскъпват с 30%, минималните осигурителни прагове за част от професиите се увеличават, а максималният осигурителен доход достига 2300 евро. През ноември Европейската комисия ще направи нова оценка на дефицита, тогава ще са ясни и параметрите на новия бюджет за 2027 г. Но Брюксел отново предупреди за ръста на разходите в тазгодишния.
Там, където са най-големите притеснения на хората – ръста на цените, корупцията, здравеопазването, пътната безопасност – промяна няма. „Кошницата с грижа“ (основни храни на по-ниски цени в големите вериги) се оказа обещание, което бързо се изпразни от съдържание. Жертвите по пътищата се увеличават – за първите 6 месеца на годината те са 261, с 33-ма повече от същия период на 2025-та.
Замислената отпреди четири десетилетия Национална детска болница пак няма да я има, но пък се предприемат действия за нейния „рестарт“. В здравеопазването управляващите не показват намерения да променят системата с приетия бюджет за 2026 г., нито декларират такива намерения за следващия, който ще бъде внесен след три месеца. Увеличеният с 8,5% бюджет на НЗОК (до 5,256 млрд. евро) ще се разпределя така, както си върви от години – в услуга на безконтролното нарастване на болнични легла и с нисък дял публични средства за профилактика.
Това става на фона на разкрития от бивш служител на ДАНС в предаването „Извън ефир“ за схеми за източване на Здравната каса и спрени проверки за милиони. В същото време в годишния си доклад, който трябва да бъде приет от правителството и парламента, българското контраразузнаване отчита като критична зона проблемите със: достъпа и качеството на здравните услуги и опитите за посегателства срещу публични ресурси за здравеопазване; дефицитите на фармацевтичния пазар, свързани с логистични затруднения и неравномерно разпределение; схемите за паралелен износ.
За 69,2% от българите здравеопазването и спирането на изтичане на средствата в сектора е сред трите най-големи проблема пред управлението и само 14% смятат, че правителството предлага успешни мерки в сектора. Социологическо проучване на агенция „Алфа Рисърч“ за нагласите в навечерието на стоте дни на кабинета „Радев“ показа, че „Прогресивна България“ е все така фаворит и при избори днес ще получи над 40% от гласовете, но обществото вече е критично и се съмнява, че ще се справи с големите проблеми.
Ако във вътрешната политика обаче промените са формални, то във външната настъпиха още през първите седмици.
Смяна на посоката
Подкрепата за Украйна отдавна не се възприема единствено като солидарност с държава, станала жертва на руската агресия, нито само като въпрос на геополитическа ориентация. Тя се превърна в тест за мястото на всяка страна в новата система за европейска сигурност, която се изгражда след руската инвазия през 2022 г. Подкрепата за Киев е част от тази архитектура – редом с общите европейски програми за превъоръжаване, увеличаването на отбранителните разходи и укрепването на източния фланг на НАТО.
В Бялата книга за европейската отбранителна готовност до 2030 г. подкрепата за Украйна е поставена редом с военната мобилност, увеличаването на производството и преодоляването на критичните дефицити във въоръжението.
Най-непосредствената и най-належаща заплаха идва от Русия, която след пълномащабното си нахлуване в Украйна през 2022 г. се превърна в основния дестабилизиращ фактор в Европа. Войната в Украйна доведе до стотици хиляди жертви и масово разселване на населението. Русия премина към икономика на военни релси, като 40% от федералния ѝ бюджет (9% от БВП) са насочени към военни разходи. Тя увеличи капацитета на своята военна индустрия и задълбочи отношенията си с авторитарни съюзници като Беларус, Северна Корея и Иран. Все по-често Русия разчита на ядрени заплахи и хибридни стратегии. В същото време последователно допринася за нестабилността по периферията на Европа, особено в Грузия, Молдова, Армения и Западните Балкани.
Joint White Paper for European Defence Readiness 2030
На срещата на върха на НАТО в Анкара съюзниците поеха ангажимент за 70 млрд. евро военна техника, помощ и обучение за Украйна през 2026 г. и за запазване поне на същото равнище през 2027 г.
Какво направи Радев? Заяви, че България ще помага „според своите възможности“, подчертавайки приоритета да се изграждат собствените отбранителни способности на страната.
На 7 юли, още преди срещата на лидерите, в Анкара се проведе NATO Summit Defence Industry Forum, посветен именно на отбранителната индустрия, инвестициите, производството и новите технологии. България отсъстваше от него.
Най-видимият знак за промяната дойде през юли в Париж. България не участва в срещата на т.нар. Коалиция на желаещите – формата, в който европейски държави координират военната подкрепа за Украйна и обсъждат бъдещите гаранции за сигурност, включително сътрудничество в областта на противовъздушната и противоракетната отбрана. Въпреки че премиерът Румен Радев получи лична покана от президента Еманюел Макрон, той отказа участие с аргумента, че „мястото на България не е там“, защото страната не участва в коалиция, която настоява за продължаване на финансовата и военната помощ за Украйна
Правителството свежда възможната подкрепа до сферата на енергетиката и хуманитарните действия, но без да спира продажбите на оръжие и така да лиши военната индустрия от значителни приходи. За предоставената на Украйна помощ България е получила над 203 млн. евро по различни механизми на ЕС.
Като премиер Радев продължи с миротворческите призиви, които отправяше и като президент, Европа да смени политиката си спрямо войната.
Решението на този конфликт не е в удължаването му с военни средства, а в силна дипломатическа мисия, която най-накрая ще сложи край на ескалацията.
България изрази резерви и към трима от руските граждани в 21-вия пакет санкции срещу Русия. За да не бъде блокиран целият пакет от евентуално вето, бяха извадени съоснователят и най-голям акционер в „Лукойл“ Вагит Алекперов, руският патриарх Кирил и милиардерът Искандар Махмудов. Управляващите пазеха до последно в тайна олигарха Махмудов, като единствената информация беше, че е „свързан с метрото“. Узбекът е сред акционерите на руската компания „Трансмашхолдинг“, чието дъщерно предприятие „Метровагонмаш“ е доставчик на най-старите влакове на метрото в София (линия 1). Двете компании са под американски санкции, защото произвеждат части за военна техника.
Въпреки че е избегнал европейски санкции благодарение на България, а преди това – на унгарския премиер Орбан, Махмудов е обект на санкции от САЩ, Великобритания, Канада и Нова Зеландия заради подкрепата за руския режим.
За всеки от спасените от eвропейски санкции бяха намерени аргументи. За Алекперов – инвестициите в бургаската рафинерия, за Махмудов – метровлаковете, а патриархът (някога агент на руските служби) бил измъкнат, защото „сме едно семейство с Руската църква“.
Радев обяви, че България няма да подкрепя санкции, които създават риск за българската икономика. Формално кабинетът не прекъсва общата европейска линия, но ограничава икономическия натиск върху Москва. Стигна се дотам Европейската комисия да изпрати в София българската еврокомисарка Екатерина Захариева, в опит да се изясни позицията на България относно подкрепата за Украйна.
Няма друга област, в която правителството да е толкова последователно, колкото раздалечаването от общата политика на ЕС и НАТО за подкрепа на Украйна.
Към разнопосочните сигнали се добави и темата за американските военни самолети цистерни и протестите срещу тяхното пребиваване в авиобаза „Безмер“. Правителството не обясни ясно нито характера на мисията, нито ангажиментите на България, оставяйки вакуум, бързо запълнен от страхове и антинатовска реторика. Иран предупреди, че ще държи отговорни държави, които подпомагат действията на САЩ. От информация за телефонен разговор между външната министърка Петрова-Чамова и иранския ѝ колега Абас Аракчи се разбра, че той е използвал остър тон, предупреждавайки България, че съдейства за агресията на Вашингтон.
Объркване възникна и около проекта с „Райнметал“. След първоначалните внушения за ревизия или отказ от джойнтвенчъра за завод за барут и за 155-милиметрови снаряди, впоследствие се оказа, че съвместната работа с германската компания продължава.
Решения на тъмно
Не по-малко показателен от самите решения е начинът, по който се вземат. Най-важните външнополитически и енергийни решения остават без публично обсъждане и без комуникация от страна на правителството.
По БНР политологът доц. Огнян Минчев коментира, че „Прогресивна България“ като културен код, кадри и наследство е всъщност бившата БКП и от тази гледна точка „нейното поведение е свързано с опитите на свръхконцентрация на власт“.
Управленските решения от първите месеци трудно могат да опровергаят подобно впечатление, а комуникацията и публичното говорене на депутати от „Прогресивна България“ звучат доста арогантно и обидно.
Показателен пример е развитието около 13-годишното споразумение между „Булгаргаз“ и „Боташ“, което също беше сключено на тъмно от служебния кабинет на президента с премиер Гълъб Донев (сега вицепремиер и министър на финансите). Срещу какви обещания от българска страна турският президент Ердоган се е съгласил да замрази двустранните договорености, по които България дължи над 360 млн. долара заради скъпия и неизползван капацитет, за който не се плаща от юли 2024 г.?
Темата е от особено значение за енергийната сигурност на ЕС. Украйна разполага с близо 32 млрд. куб. м подземни газови хранилища – едни от най-големите в света. В условията на отказ от руски тръбен газ те се превръщат в ключов елемент от европейската енергийна сигурност.
За сравнение, българското газохранилище „Чирен“, чийто проект за разширение стана обект на разследване на Европейската прокуратура, би трябвало да увеличи обема си до 1 млрд. куб. м спрямо сегашните 550 млн.
Причината да се заговори за газ в отношенията България–Украйна са доставките на aмepикaнcки втeчнeн пpиpoдeн гaз (LNG) зa eвpoпeйcкo пoтpeблeниe в yкpaинcкитe xpaнилищa. За да стигне до Украйна, този газ няма как да заобиколи България, а трасето му зависи от това дали танкерите ще пристигат на гръцки терминал, както беше с първите доставки, или на турски (което би включило вече и споразумението с „Боташ“).
Към решенията, вземани на тъмно, спада и кадровата политика на правителството. Вместо обещаното скъсване с партийния модел, първите назначения показаха добре познатата практика ключовите позиции да се разпределят между хора с политическа лоялност или дългогодишни връзки с някои от управляващите, пък били те ГЕРБ, „Има такъв народ“ или БСП. Вместо да демонстрира нов стандарт на управление, кабинетът пренарежда дялани камъни. В държавните дружества и администрацията започна да се оформя управленски микс от кадри на БСП, хора от служебните кабинети на президента и фигури от предишни управления.
След като отстрани уличената в неправомерно високи възнаграждения и скандални договори шефка на НДК Андрияна Татарова, министърът на културата Евтим Милошев назначи съпругата на заместник-председателя на Народното събрание от парламентарната група на „Прогресивна България“ Иван Ангелов. С аргумента, че Ия Петкова-Ангелова e с доказан опит и професионализъм. Макар и новоизлюпен политик, университетският преподавател Ангелов се учи бързо и по bTVнарече войната в Украйна „специализирана военна операция“ – така, както я определя официално режимът в Кремъл.
Цялата тази непрозрачност и подмяна на предизборните обещания с realpolitik се превръща в отличителен белег на първите 80 дни – решенията се обявяват, но мотивите и договорките, поети от името на държавата, остават неизвестни. Правителството продължава да работи без управленска програма, макар че в края на май вицепремиерът Иво Христов обеща да е готова до месец и половина.
Най-голямото мнозинство в най-новата история на България засега произведе най-малко промени в начина на управление.
* През 2001 г. Симеон Сакскобургготски каза, че му трябват 800 дни, за да „се почувства осезаемо повишение на жизнения стандарт на българина“.
The NTPsec Project is pleased to announce the tagging of version 1.2.5
Note: Python 2 and OpenSSL 1.1.0 support will be removed in the next release.
A new ntskelog statistic file has been added to the stats file collection. NTS-KE transactions are now routed here to reduce clutter in the main system log.
Link-Time Optimization (LTO) is now enabled by default on Linux and FreeBSD when --disable-debug-gdb is configured. It remains disabled on NetBSD due to upstream toolchain breakages.
The pool configuration command now natively supports the nts security flag (pool <server> nts).
The server counting logic for maxclock (tos maxclock) has been corrected to skip dynamic POOL slots as well as any remote servers configured with the noselect flag.
The HPGPS reference clock driver received a major update, featuring a new configuration option for listen mode, a fix for the Z3801A GPS Week Number Rollover (WNRO) glitch, the removal of the raw scpi > string from clockstats, and the addition of several new internal tracking variables to clockstats.
Security Fixes:
Fixed a buffer overflow in the Zyfer reference clock driver that could occur when processing continuation chunks (CVE-2026-18321).
Fixed a NULL-pointer dereference crash in the NTS-KE client when SSL_new() fails.
ntpd now uses a cryptographically strong RNG instead of the weak libc random() for association IDs, poll-time dispersal, and mode6 response padding.
Fixed an off-by-one boundary error in ntp_RAND_bytes() that could cause an out-of-bounds read.
Fixed an out-of-bounds read in NTS client extension parsing caused by unchecked nonce/ciphertext lengths.
Fixed NTS pool peers losing their NTS-KE hostname and NTS configuration on cookie renewal, which caused certificate validation to run against the peer’s bare IP address instead of its configured hostname.
Administrative and Scripting Changes:
The ntpleapfetch tool has been hardened with parameter quoting to prevent potential shell execution vulnerabilities.
The statistics directory argument (-s PATH) has been fixed and its default behavior adjusted.
ntpd now explicitly logs a syslog entry when searching for supplemental configuration files inside /etc/ntpsec/ntp.d.
ntpd now logs an explicit message when extra pool servers are actively dropped.
ntpleapfetch now correctly parses the leapfile directive with quoted paths and tab/space-delimited values (NTPsec/ntpsec#883).
waf has been upgraded to 2.1.9, fixing a bug where libntpc.so was installed to the default library path instead of the location given via --libdir (NTPsec/ntpsec#870).
Added missing i386 time64 and mDNS/DNS-SD syscalls to the seccomp sandbox allow-list, fixing potential sandbox kills on i386 and mDNS-enabled builds.
Added missing clock_nanosleep, readlink, and readlinkat syscalls to the AMD64 seccomp sandbox allow-list, fixing SIGSYS crashes.
NTS and NTS-KE Fixes:
NTS-KE requests and responses split across multiple TCP/TLS reads are now correctly reassembled instead of failing on the first partial chunk (NTPsec/ntpsec#858).
Fixed the NTS client failing to reset cookie length when switching to a new cookie length from a key-exchange response (NTPsec/ntpsec#877).
The NTS-KE client now sets the TLS SNI field during the handshake, improving compatibility with name-based TLS proxies and load balancers.
Fixed NTS-KE hostname parsing to strip brackets from IPv6 literal addresses before certificate hostname validation.
Fixed an NTS-KE response containing more cookies than the client can store being misparsed and the entire response rejected, instead of just discarding the extras.
Fixed an NTS-KE connection that completes synchronously (rather than asynchronously) being wrongly treated as a connection failure.
NTS-KE certificate hostname/IP validation now uses the non-deprecated OpenSSL 4.0 APIs (SSL_set1_ipaddr/SSL_set1_dnsname).
The NTS-KE client no longer rejects a server response solely for an unrecognized non-critical record type.
ntpd now validates the aead parameter in both per-server and global NTS configuration and logs an error instead of silently accepting an invalid value (NTPsec/ntpsec#880).
NTS-KE client logging has been improved to emit one detailed message per connection attempt; the client now parses bracketed IPv6 literal addresses, applies a send timeout in addition to the existing receive timeout, and skips already-tried addresses from multi-homed NTS-KE servers.
Fixed a bug where a failed DNS-lookup thread creation or join could leave a peer’s DNS/NTS resolution permanently stuck, blocking further lookups.
Bug Fixes and Protocol Refinements:
Fixed a critical issue where NTPsec failed to declare itself out of sync under specific error and drift conditions.
Fixed a state machine bug (NTPsec/ntpsec#848) where the STA_UNSYNC flag was prematurely cleared at system startup.
Fixed an interactive interface crash in ntpmon triggered by hitting the minus (-) key.
Added native .webp image encoding support to the ntpviz graphing tool.
Fixed ntpd silently ignoring mode 1 (symmetric active) requests, e.g. from Windows clients; they are now answered like ordinary client requests.
Fixed a regression where ntpd failed to clear peer state on interface change, delaying resynchronization after network changes.
Fixed NTP extension-field parsing to stop treating unrecognized non-critical fields as fatal; they are now ignored instead of causing packet rejection.
socktoa() no longer formats AF_UNSPEC addresses as IPv4, correcting address display in ntpq and ntpmon.
mode6 control protocol responses now omit peer addresses that are empty or otherwise unprintable instead of emitting malformed data.
Fixed ntpdig to build a fresh request packet (timestamp/MAC) for each destination address tried, instead of resending the same packet.
Fixed ntpdig crashing with an unhandled UnicodeError when a configured server name with non-ASCII characters fails DNS resolution.
Fixed a crash in ntpq’s interactive `noflake command (NTPsec/ntpsec#863).
Fixed a crash (NameError) in ntpq under Python 2 caused by referencing the Python-3-only BrokenPipeError.
Fixed a crash in ntpq and ntpmon when a peer’s source address is empty, e.g. NXDOMAIN or a POOL association.
sys_var_list is no longer marked as a default variable, so it is excluded from ntpq’s default `rv (readvar) output.
Removed:
Removed the undocumented -s/--srcname and -S/--srcnumber display options, and the hostname/hostnum arguments to ntpq’s hostnames command, from ntpq and ntpmon. This shipped in 1.2.4 but was never documented in NEWS and has now been fully reverted.
This release is signed with the GPG key id
E57235D22764129FA4F2F4D17F52608ED0E49D76
The collective thoughts of the interwebz
Manage Consent
To provide the best experiences, we use technologies like cookies to store and/or access device information. Consenting to these technologies will allow us to process data such as browsing behavior or unique IDs on this site. Not consenting or withdrawing consent, may adversely affect certain features and functions.
Functional
Always active
The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network.
Preferences
The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user.
Statistics
The technical storage or access that is used exclusively for statistical purposes.The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
Marketing
The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes.