Understanding Byte-Pair Encoding (BPE) Tokenizers and Out-Of-Vocabulary (OOV) Handling

How tokenization impacts cost, prompt injection risks, and multilingual context limits.

Written by Shyank
Shyank
Banner

SHARE

In the fast-evolving landscape of artificial intelligence in 2026, the primary focus of optimization has shifted from model size to data and token efficiency. Large Language Models (LLMs) do not process raw text directly. Instead, they process sequences of discrete numerical tokens. The translation layer between human-readable characters and these numerical tokens is the tokenizer.

Among the various tokenization methods, Byte-Pair Encoding (BPE) has emerged as the de facto standard for state-of-the-art models, including OpenAI's GPT-4o, Meta's Llama 3, and Google's Gemma 2. However, despite its widespread adoption, BPE tokenization introduces subtle, critical vulnerabilities in security, imposes significant cost penalties on non-English languages, and creates reasoning bottlenecks that affect model behavior.

This guide provides a comprehensive technical exploration of BPE tokenization, analyzing how it resolves the Out-Of-Vocabulary (OOV) problem, the trade-offs of vocabulary size, and the security, cost, and multilingual implications in production systems.


What Is It?

Byte-Pair Encoding (BPE) is a hybrid subword tokenization algorithm. Historically, natural language processing models relied on one of two extremes:

  1. Word-Level Tokenization: Each unique word in a language is mapped to a unique ID. While this preserves semantic cohesion, it suffers from a massive vocabulary size and fails entirely when encountering unseen words (e.g., spelling mistakes, new jargon, or domain-specific terms). These unseen words are mapped to a generic Out-Of-Vocabulary (OOV) token, typically represented as [UNK]. The model loses all semantic information associated with the word.
  2. Character-Level Tokenization: Each character is treated as a token. While this eliminates the OOV problem because the alphabet size is small and fixed, it results in extremely long sequence lengths. Because self-attention mechanisms scale quadratically with sequence length, character-level models are computationally expensive and struggle to capture long-range semantic dependencies.

Subword tokenization seeks to find the sweet spot between these two extremes. It creates a vocabulary containing common whole words, frequent word roots, suffixes, prefixes, and individual characters. When a subword tokenizer encounters a common word like "learning", it represents it as a single token. When it encounters a rare or unseen word like "learning-oriented", it decomposes it into its constituent subwords: "learning", "-", and "oriented".

Originally designed by Philip Gage in 1994 as a general data compression algorithm, BPE was adapted for neural machine translation by Sennrich et al. in 2015. It builds its vocabulary bottom-up, starting with a base alphabet of characters and iteratively merging the most frequent adjacent token pairs in a corpus until a predefined vocabulary size is reached.


Why It Matters

Tokenization is not merely an engineering detail; it is the foundation of LLM operations. Understanding the mechanics of BPE is critical for three primary reasons:

1. The Multilingual and Domain-Specific "Token Tax"

Because tokenization dictates the number of tokens required to represent a given piece of text, it directly determines API costs and context window consumption. BPE tokenizers are trained on specific text corpora, which are historically heavily biased toward English. As a result, English words are compressed highly efficiently (often close to one token per word), whereas non-Latin scripts (e.g., Hindi, Arabic, Japanese) or highly specialized code are over-segmented into numerous tiny tokens. This "multilingual tax" means non-Western users pay significantly more to process the same semantic information and hit context window limits much faster.

2. Prompt Injection and Guardrail Security

The tokenization layer is a major blind spot for LLM security filters. Web Application Firewalls (WAFs) and safety classifiers often run tokenizers or regex patterns that are misaligned with the target LLM. Attackers exploit this misalignment via techniques such as TokenBreak or split-token prompt injections. By prepending specific characters, using Unicode homoglyphs, or inserting zero-width spaces, attackers can force the safety filter's tokenizer to segment a malicious prompt into benign subwords, while the downstream LLM reconstructs the malicious intent.

For developers implementing defenses, understanding tokenizer boundaries is essential. A comprehensive overview of these security considerations can be found in our guide on prompt injection mitigation and token limit defenses.

3. Latency and Compute Bottlenecks

During generation, LLMs produce output token-by-token. The generation latency is directly proportional to the number of tokens generated, not the number of words. An inefficient tokenizer that over-segments text increases generation latency. Furthermore, larger vocabularies require massive token embedding and output language model (LM) head matrices, which consume valuable GPU memory. Developers seeking to optimize local inference must balance these bottlenecks, as detailed in our guide on local LLM execution and memory bandwidth bottlenecks.


How It Works

BPE is defined by two primary phases: Vocabulary Training (learning the merge rules) and Inference Tokenization (applying the merge rules to split new text).

The Training Phase

The objective of training is to construct a vocabulary of size V starting from a base set of characters. Let us walk through the training algorithm:

  1. Initialize the Base Vocabulary: Extract all unique characters from the training corpus. This forms the initial vocabulary.
  2. Represent the Corpus: Represent each word in the corpus as a sequence of characters, appended with a special end-of-word symbol (e.g., </w>) to keep track of word boundaries.
  3. Count Co-occurrences: Count the frequencies of all adjacent pairs of tokens in the corpus.
  4. Merge the Most Frequent Pair: Identify the most frequent adjacent pair of tokens (e.g., t and h). Create a new vocabulary token th. Add this merge rule to the ordered list of merge rules.
  5. Update the Corpus: Replace all occurrences of the merged pair in the corpus with the new token.
  6. Repeat: Repeat steps 3 to 5 until the vocabulary has reached the target size V.
Initial Corpus:
"h u g </w>" : 5 times
"p u g </w>" : 15 times
"h u n s </w>" : 2 times

Base Vocabulary:
[h, u, g, p, n, s, </w>]

Step 1: Most frequent pair is (u, g) with frequency 5 + 15 = 20.
Merge (u, g) -> "ug".
Vocabulary: [h, u, g, p, n, s, </w>, ug]
Merge Rules: [(u, g) -> "ug"]

Step 2: Corpus updated:
"h ug </w>" : 5 times
"p ug </w>" : 15 times
"h u n s </w>" : 2 times

Most frequent pair is (p, ug) with frequency 15.
Merge (p, ug) -> "pug".
Vocabulary: [h, u, g, p, n, s, </w>, ug, pug]
Merge Rules: [(u, g) -> "ug", (p, ug) -> "pug"]

Step 3: Corpus updated:
"h ug </w>" : 5 times
"pug </w>" : 15 times
"h u n s </w>" : 2 times

Most frequent pair is (pug, </w>) with frequency 15.
Merge (pug, </w>) -> "pug</w>".
...

The Inference Phase

To tokenize new text, the BPE tokenizer splits the text into individual characters and then applies the learned merge rules in the exact order they were generated during training.

For example, if the tokenizer has learned the merge rules in the order:

  1. e + r -> er
  2. h + er -> her
  3. t + h -> th

When tokenizing the word "there", it is initially split into [t, h, e, r, e].

  • First rule e + r is applied -> [t, h, er, e].
  • Second rule h + er is applied -> [t, her, e].
  • Third rule t + h is not applied because h is no longer free (it has been merged into her). The final tokenized representation is ["t", "her", "e"].

Byte-Level BPE (BBPE)

A major evolution in BPE is Byte-Level BPE (BBPE), introduced in OpenAI's GPT-2 paper.

In standard BPE, the base vocabulary consists of Unicode characters. However, because Unicode contains over 140,000 characters (including diverse alphabets, emojis, and math symbols), the base vocabulary is large even before any merges are learned. If a model encounters a character not present in the training set (e.g., a rare emoji or a foreign symbol), it will still fail and produce an [UNK] token.

BBPE solves this by setting the base vocabulary to the 256 possible byte values rather than Unicode characters. Any Unicode string can be converted to a sequence of UTF-8 bytes. The tokenizer then performs BPE merges directly on these bytes.

Because every possible string is ultimately represented by a combination of the 256 bytes, BBPE guarantees zero Out-Of-Vocabulary (OOV) tokens. Even if the model encounters a completely new emoji or character, it can decompose it into its raw byte sequence (e.g., 4 bytes for an emoji) and represent it using the base byte tokens.


Architecture

The architecture of a modern LLM tokenizer pipeline involves several pre-processing and post-processing stages.

+------------------+     +-----------------------+     +----------------------+
|    Input Text    | --> | Pre-tokenization      | --> | Byte Conversion      |
|                  |     | (Regex Split)         |     | (UTF-8 Bytes)        |
+------------------+     +-----------------------+     +----------------------+
                                                                  |
                                                                  v
+------------------+     +-----------------------+     +----------------------+
|  Numerical IDs   | <-- | Subword Merging       | <-- | Base Token Sequence  |
|  (to LLM Embed)  |     | (Merge Rules Loop)    |     | (256 Byte Tokens)    |
+------------------+     +-----------------------+     +----------------------+

Pre-Tokenization

Before BPE merges are applied, modern tokenizers use a pre-tokenization step. Pre-tokenization uses a regular expression (regex) to split the input string into smaller substrings. Merges are then restricted to occur only within these substrings, never across them.

For example, OpenAI's tiktoken uses regex to split text on whitespace, punctuation, and digits. This prevents:

  • A space from merging with a letter (which would prevent proper word boundary handling).
  • Numbers from merging with text (e.g., preventing "10" and "mg" from merging into a single token "10mg").
  • Punctuation from merging with words.

The exact pre-tokenization regex has a massive impact on the resulting token distribution. In Llama 3 and GPT-4o, the pre-tokenization regex was heavily optimized to better handle contractions, spaces, and code blocks, preventing unnecessary token fragmentation.

Tokenizer Implementations in Frontier Models

Modern LLMs use vastly different tokenization setups to balance context window consumption and memory overhead:

  • OpenAI cl100k_base (GPT-4 / GPT-3.5): Featuring a vocabulary size of 100,000, this tokenizer uses byte-level BPE with a highly optimized pre-tokenization regex to compress code and English text.
  • OpenAI o200k_base (GPT-4o): To support multilingual and multi-modal contexts, OpenAI expanded the vocabulary to 200,000. This increased vocabulary size drastically improved the compression ratio (or fertility) of non-English languages, reducing API costs by 20% to 50% for languages like Arabic, Chinese, and Hindi.
  • Meta Llama 3 Tokenizer: Uses a 128,000 token vocabulary built on tiktoken's BPE framework. Compared to Llama 2's 32k vocabulary, Llama 3 achieves up to 15% better sequence compression, helping to maximize the performance of its attention layers.
  • Google Gemma 2 Tokenizer: Features a massive 256,000 vocabulary based on SentencePiece. Gemma 2 preserves whitespace and splits digits, maximizing coding and mathematical alignment.

Production Deployment Considerations

When deploying LLMs at scale, tokenization presents significant systems-level considerations that developers frequently overlook:

1. The Embedding and LM Head Memory Overhead

A larger vocabulary reduces sequence length, which improves self-attention throughput. However, it comes at the cost of GPU memory. Let us calculate the parameters consumed by the vocabulary. The token embedding matrix and the language model (LM) head matrix are defined by:

Embedding Parameters = V * d_model
LM Head Parameters = V * d_model
Total Vocabulary Parameters = 2 * V * d_model

Where V is the vocabulary size and d_model is the model's hidden dimension. Let us look at how this scales across models:

  • Llama 2 (32k vocabulary, d_model = 4096):

    Total Params = 2 * 32,000 * 4,096 = 262,144,000 (262M parameters)
    

    Using FP16 precision (2 bytes per parameter), this consumes 524 MB of GPU VRAM.

  • Gemma 2 (256k vocabulary, d_model = 4096):

    Total Params = 2 * 256,000 * 4,096 = 2,097,152,000 (2.09B parameters)
    

    At FP16 precision, this consumes 4.19 GB of GPU VRAM!

For smaller edge models (such as 2B or 7B parameter models), allocating 4 GB of memory just for the vocabulary lookup matrices is a major trade-off, leaving less VRAM for KV caching and weights. When optimizing local inference pipelines, developers must carefully configure context limits and batching strategies, as discussed in our analysis of attention bottlenecks and GQA architectures.

2. Event-Loop Blocking in Inference Servers

Tokenization is a CPU-bound operation. While neural network forward passes are executed on the GPU, tokenizing long incoming prompts and detokenizing generated tokens must be handled by the host CPU.

If a production API server (e.g., a FastAPI application or a Node.js gateway) tokenizes massive documents using a single-threaded Python tokenizer, it can block the event loop, causing timeouts for other concurrent requests.

  • Mitigation: Always offload tokenization to multi-threaded, compiled Rust tokenizers (e.g., using tokenizers or tiktoken). In high-throughput settings, tokenization should be handled on dedicated worker processes or asynchronously via thread pools.

Common Mistakes

Here are the most frequent errors developers make when working with BPE tokenizers in production:

1. Inconsistent Training/Inference Pre-Tokenization

A BPE tokenizer is only as good as its pre-tokenization regex. If you train a custom BPE tokenizer on a corpus using a regex that splits on spaces, but deploy it with an inference pre-processor that strips spaces, the merge rules will fail to match. The tokenizer will default to splitting text into individual character/byte tokens, resulting in massive sequence lengths and degraded generation quality.

2. The Few-Shot Trailing Space Bug

BPE merges often include leading spaces. For example, in GPT tokenizers, the word " hello" (with a leading space) is represented by a single token, whereas "hello" (no space) is represented by a different token. In few-shot prompting, developers often write templates like:

Input: apple
Output: fruit

Input: banana
Output: 

If there is a trailing space after Output: , the tokenizer may produce a token representing " [Space]". If there is no space, it will generate a different token. This subtle mismatch changes the starting token of the model's response, which can cause the model to generate incorrect labels or formatting.

  • Rule of Thumb: Always strip trailing whitespaces from prompt templates and manually handle spaces inside the generation pipeline.

3. Using Inaccurate Token Estimation Functions

Many developers use simple character-to-token heuristics (e.g., 1 token = 4 characters) to calculate API cost and context limits. While this heuristic is reasonably accurate for English, it fails catastrophically for other languages or code:

  • Python Code: Often contains high indentations (multiple spaces). Depending on the tokenizer, four spaces might be tokenized as four separate tokens or a single token, leading to massive estimation errors.
  • JSON Data: Curly braces and quotes can cause significant token expansion if the tokenizer is not optimized for JSON syntax.

Lessons From Production Deployments

Operating LLMs in production reveals unique edge cases that do not show up in research papers:

1. The Phenomenon of "Glitch" Tokens

BPE tokenization is purely statistical. During vocabulary training, some words or strings appear frequently in the training corpus (e.g., usernames, specific URLs, spam text) and are assigned their own dedicated tokens. However, during the subsequent pretraining of the actual neural network, these specific tokens might be filtered out or never appear.

Because the model's weights associated with these tokens are never updated during pretraining, they contain random, uninitialized embedding values. These are known as glitch tokens. Famous examples include:

  • SolidGoldMagikarp (a Reddit username)
  • StreamerInbox
  • attRot
  • Erotstream

When a user inputs a prompt containing a glitch token, the model encounters a random embedding vector. This confuses the model, causing it to hallucinate, print gibberish, throw errors, or enter infinite generation loops.

  • Production Defense: Sanitize user inputs by detecting and removing known glitch tokens, or map them to close semantic equivalents before feeding them to the model.

2. Token-Splitting and Guardrail Evasion

Traditional safety guardrails and content filters evaluate user input by looking for specific keywords or patterns. Attackers bypass these filters by exploiting BPE token boundaries.

For example, if a filter blocks the word "malware" by matching its token representation, an attacker can input m-a-l-w-a-r-e or insert zero-width characters (e.g., mal​ware). The safety filter tokenizes this as separate individual letters, failing to trigger the keyword block. However, when passed to the target LLM, the model's attention mechanism easily bridges the characters and reconstructs the word "malware", executing the prompt.

3. The TokenBreak Vulnerability

Discovered in mid-2025 and widely evaluated in 2026, the TokenBreak attack exploits the prefix-dependent nature of BPE tokenization.

BPE tokenization is deterministic but context-sensitive based on boundaries. By inserting a single character (like a slash / or a quote ") at the start of a word, an attacker forces the tokenizer to shift its tokenization boundaries for the entire subsequent sequence.

Normal Text:
"write malware" -> ["write", " malware"]

TokenBreak Perturbation:
"/write malware" -> ["/w", "rite", " mal", "ware"]

Because the safety classifier was trained to detect the token malware, splitting it into mal and ware bypasses the classification layer. To prevent this, developers must ensure that safety guardrails are trained on token-perturbed data or operate at the semantic embedding level rather than relying on exact token-matching filters. For a deeper discussion on structural prompt validation, see our guide on advanced RAG and metadata pre-filtering.


What Most Articles Miss

While most resources discuss BPE's basic merge loop, they miss the systemic mathematical inequality it imposes on global users. Let us analyze this "Multilingual Token Tax."

The Mathematical Inequality of Token Fertility

Token fertility is defined as the ratio of tokens generated to the number of words in the original text:

Fertility = Token Count / Word Count

For a perfectly optimized English tokenizer, the fertility is close to 1.0 (each word is roughly one token). However, for languages that do not use Latin scripts, BPE's frequency-based merging means words are segmented down to character or byte-level representations.

Let us compare the token fertility across different tokenizers and languages for the exact same sentence:

Sentence: "Developing artificial intelligence requires massive computational power." Hindi translation: "कृत्रिम बुद्धिमत्ता विकसित करने के लिए भारी कंप्यूटिंग शक्ति की आवश्यकता होती है।"

Using different tokenizers, we get the following token counts:

LanguageTokenizerWord CountToken CountFertility
Englishcl100k_base (GPT-4)781.14
Englisho200k_base (GPT-4o)771.00
EnglishLlama 3 (128k)771.00
Hindicl100k_base (GPT-4)12484.00
Hindio200k_base (GPT-4o)12221.83
HindiLlama 3 (128k)12262.17

This data highlights a critical issue:

  • In cl100k_base, the Hindi speaker requires 4.00 tokens per word, compared to 1.14 for the English speaker.
  • This represents a 350% markup in cost and a 350% reduction in effective context window capacity for the exact same semantic content.
  • While newer tokenizers like o200k_base (GPT-4o) and Llama 3's 128k tokenizer have improved multilingual fertility (reducing Hindi fertility to 1.83 and 2.17 respectively), a significant "multilingual tax" remains.

The Gibberish Bias and Secret Leakage

Another overlooked side effect of BPE is its interaction with high-entropy text, such as passwords, API keys, and cryptographic hashes.

Because BPE is trained to compress common natural language patterns, it struggles with random character sequences. When a user inputs an API key (e.g., sk-proj-12345...), the tokenizer cannot merge these characters. It breaks the key into a sequence of individual character or byte tokens.

This results in a unique, high-entropy token signature. During model fine-tuning or pretraining on code, these dense sequences of single-character tokens stand out from normal prose. The neural network's attention layers focus heavily on these patterns, making it highly susceptible to memorization. As a result, BPE tokenization indirectly increases the risk of secret leakage, as models easily memorize and subsequently leak high-entropy patterns when prompted.


Best Practices

To build robust, cost-effective, and secure production LLM applications, implement the following best practices:

  1. Leverage Modern, Large-Vocabulary Tokenizers: When choosing models, favor those utilizing expanded vocabularies (e.g., GPT-4o's o200k_base or Llama 3's 128k) for multilingual or code-heavy applications. This can reduce inference latency and API costs by up to 50%.
  2. Implement Input Normalization: Before sending text to safety guardrails and the target LLM, normalize the text using Unicode Normalization Form C (NFC). This resolves variations caused by homoglyphs and combined characters, ensuring consistent tokenization boundaries.
  3. Strip Zero-Width and Hidden Characters: Clean user inputs to remove zero-width spaces (\u200B), zero-width joiners (\u200D), and other control characters that attackers use to split tokens and evade safety filters.
  4. Use Asynchronous Tokenization: Ensure all tokenization and detokenization operations in your application gateways are executed asynchronously or offloaded to multi-threaded Rust processes using libraries like Hugging Face tokenizers or OpenAI tiktoken.
  5. Monitor Character-to-Token Ratios: Implement monitoring for the token-to-character ratio of incoming requests. A sudden spike (e.g., more tokens than characters) can indicate an adversarial attack (like a denial-of-service attempt via high-entropy text) or a pre-tokenization regex failure.

FAQ

1. What is the difference between BPE and WordPiece?

BPE builds its vocabulary by identifying and merging the most frequent adjacent token pairs. WordPiece, used by models like BERT, select merges based on maximum likelihood. It calculates the probability of the merged pair divided by the individual probabilities of the tokens. This prioritizes merging pairs that carry high mutual information rather than just high raw frequency.

2. How does Byte-Level BPE handle non-English characters?

Byte-Level BPE converts the input string into UTF-8 bytes. Since UTF-8 represents non-English characters using 2 to 4 bytes, the tokenizer splits these characters into their byte components. If a character is common in the training corpus, the tokenizer will learn merge rules to combine those bytes back into a single token. If it is rare, it remains split into individual byte tokens.

3. Why does BPE not use an unknown [UNK] token?

Modern BPE tokenizers use Byte-Level BPE. Because the base vocabulary contains all 256 possible byte values, any input string can be converted to bytes and mapped to these base tokens. There are no characters or inputs that cannot be represented, eliminating the need for an unknown token.

4. How does vocabulary size affect LLM performance?

A larger vocabulary allows the tokenizer to compress text into fewer tokens, which speeds up inference and increases the amount of information that fits within the context window. However, a larger vocabulary requires larger token embedding and output prediction matrices, which increases the model's memory footprint (VRAM usage).

5. What is the "multilingual tax" in BPE tokenization?

Because BPE training sets are predominantly English, the learned merge rules are optimized for English text. English words are compressed into single tokens, while words in other languages (such as Hindi, Arabic, or Russian) are split into multiple smaller subwords or bytes. This increases the token count for non-English texts, leading to higher API costs and faster context window saturation.

6. Can BPE tokenization cause mathematical errors in LLMs?

Yes. BPE tokenizes numbers based on statistical frequency in the training corpus, not mathematical value. For example, "100" might be a single token, while "1000" might be split into "10" and "00". Because the model sees numbers as arbitrary token IDs, it struggles to perform character-level math, counting, or alignment tasks without chain-of-thought prompting.

7. What is a "glitch token" and why does it occur?

A glitch token is a token in the vocabulary that was learned during the tokenizer's training phase (e.g., from usernames or web logs) but never occurred in the actual text used to train the neural network. Because the model's weights for these tokens were never updated, they contain random embeddings that confuse the model if triggered.

8. How does the TokenBreak vulnerability work?

TokenBreak is an exploit where an attacker prepends a character (such as a slash or quote) to a word. This shifts the tokenizer's alignment boundaries, splitting a malicious word into multiple benign subwords. This bypasses safety filters that look for specific token sequences, while the target model still understands the prompt.

9. What is Token Fertility?

Token fertility is the average number of tokens required to represent a single word (Fertility = Tokens / Words). A higher fertility score indicates less efficient tokenization, which increases processing costs and uses up more of the model's context window.

10. How can I protect my LLM application from token-based prompt injections?

Implement Unicode normalization (NFC) to resolve homoglyphs, strip zero-width and control characters from user inputs, and ensure your safety guardrails evaluate prompts at the semantic embedding level rather than relying on exact token-matching filters.


Key Takeaways

  • Zero OOV via Bytes: Modern Byte-Level BPE eliminates Out-Of-Vocabulary ([UNK]) tokens by using the 256 possible bytes as its base vocabulary, ensuring any input string can be tokenized.
  • The Multilingual Cost Penalty: BPE tokenizers trained primarily on English over-segment non-Latin scripts, imposing a "multilingual tax" that increases API costs and consumes context windows up to 3x faster for global users.
  • Security Blind Spots: Adversarial techniques like TokenBreak exploit BPE boundary shifts to split malicious keywords into benign subwords, evading safety filters while remaining understandable to the downstream LLM.
  • VRAM Vocabulary Overhead: Large vocabularies (e.g., Gemma 2's 256k) reduce sequence length but require massive embedding matrices, consuming up to 4 GB of GPU memory just for token lookup.
  • Event-Loop Bottlenecks: Tokenization is a CPU-bound operation. Naive, single-threaded implementations can block application event loops, requiring multi-threaded Rust implementations like tiktoken in production.
  • Glitch Token Risks: Statistical anomalies in tokenizer training create "glitch tokens" with uninitialized embeddings, which can trigger hallucinations or infinite loops if entered by users.
  • Best Practice Defenses: Secure and optimize production LLMs by enforcing Unicode normalization (NFC), filtering zero-width characters, monitoring token-to-character ratios, and utilizing modern, large-vocabulary tokenizers.

About & Technical Stack

Shyank Akshar

Shyank Akshar

I'm Shyank, a full-stack software engineer specializing in secure, high-scale systems.

Over 5+ years, I've shipped production applications across govtech, fintech, and consumer platforms — systems that handle national-scale authentication, real-time payments, and millions of users in production. I've built official SDKs live across iOS, Android, and React Native; engineered 2FA and biometric security infrastructure trusted by government and enterprise clients; and designed backend systems processing high-throughput transactions with zero tolerance for failure.

I work primarily in Swift and Golang, with deep experience in distributed systems, Apache Kafka, and applied cryptography. I care about building things that hold up under real load and real security scrutiny — not demos, production.

Technical Stack

Languages, platforms, and architectures I build on.

iOS
Swift
GCP
AWS
Java
backend
Golang
Javascript
Typescript
Mongo DB
MySQL
Redis
Kotlin
Kafka
Kubernetes
Docker
Microservices
System Design
Distributed Systems
More Blogs
Recent Blogs