Apple: “App Store, 2025’te 2,2 milyar dolardan fazla dolandırıcılık şüphesi taşıyan işlemi engelledi.”

AppleApple, geçtiğimiz yıl App Store özelinde 2,2 milyar ABD dolarından fazla tutarda dolandırıcılık şüphesi taşıyan işlemi engellediklerini duyurdu. Bu konuda detaylı bir açıklama paylaşan şirket, “App Store, iki temel prensibe göre geliştirildi: Kullanıcılara yeni uygulamalar keşfetmeleri için güvenli ve güvenilir bir yer sağlamak ve geliştiricilere işlerini büyütebilecekleri canlı bir pazar yeri sunmak. Bu ilkeleri yerine getirmek ise dikkat ve özveri gerektiriyor. Dijital dünya genişledikçe kötü niyetli kişiler de yöntemlerini geliştirmeye devam ediyor ve genellikle tüketicileri ve meşru işletmeleri hedef alan aldatıcı taktikler kullanıyor. Bu zorlukların üstesinden gelmek için Apple, kötü amaçlı etkinlikleri tespit etmek ve durdurmak üzere uzman incelemesi ve gelişmiş yapay öğrenme teknolojilerinin bir kombinasyonundan yararlanarak çok katmanlı savunma sistemini sürekli olarak geliştiriyor. 2025’te Apple, 2,2 milyar ABD dolarının üzerinde tutarda dolandırıcılık şüphesi taşıyan işlemi engelledi. Böylece son altı yılda toplam 11,2 milyar ABD dolarından fazla tutarda potansiyel dolandırıcılık şüphesi taşıyan işlem engellenmiş oldu. Apple, kötü niyetli kişilerin zararlı […]

Apple: “App Store, 2025’te 2,2 milyar dolardan fazla dolandırıcılık şüphesi taşıyan işlemi engelledi.” yazısı ilk olarak Teknoloji haberleri – LOG üzerinde yayınlandı.

X’s Feed Ranking Algorithm: How Grok Ranks 500M Posts in 200ms

Four cards describing each component: Home Mixer (orchestration, gRPC), Thunder (in-memory post store, Kafka ingestion), Phoenix (retrieval + ranking transformer), Candidate Pipeline (reusable framework).

X’s Feed Ranking Algorithm: How Grok Ranks 500M Posts in 200ms

TL;DR Summary

  • xAI open-sourced the full production code behind X’s For You feed on GitHub — 22.5k stars, Apache 2.0, commercial use allowed
  • The system pulls from 500 million daily posts, narrows to candidates, and ranks them in under 200 milliseconds using a Grok-based transformer
  • Zero hand-engineered features — the Grok transformer predicts 14 engagement types (like, reply, repost, click, dwell, block, report) and combines them into a weighted score
  • Four components: Home Mixer (orchestration), Thunder (in-network, sub-ms lookups), Phoenix (Grok transformer retrieval + ranking), Candidate Pipeline (reusable framework)
  • A pre-trained mini Phoenix model ships with the repo — run inference without training anything

Direct Answer Block

X’s For You feed algorithm is a four-component recommendation system: Home Mixer orchestrates the pipeline, Thunder serves in-network posts from followed accounts at sub-millisecond speed, Phoenix uses a Grok-based transformer to retrieve out-of-network posts and rank all candidates by predicting 14 engagement probabilities, and the Candidate Pipeline provides a reusable, composable framework for the entire system.

Introduction

Open-sourcing a recommendation algorithm that serves hundreds of millions of users isn’t just a transparency gesture — it’s an architecture masterclass. X’s system processes 500 million daily posts, narrows them to roughly 1,500 candidates, and ranks everything in under 200ms. The Grok-based transformer does all the heavy lifting with zero hand-engineered features. Every heuristic eliminated. Every manual weight removed. Here’s how the pipeline actually works, component by component.

How does the X For You feed rank 500 million posts in under 200 milliseconds?

The system achieves this speed through a layered pipeline that progressively narrows the candidate set:

  1. Thunder serves in-network posts instantly — an in-memory post store with sub-millisecond lookups. Posts from accounts you follow are already indexed and retrievable without hitting any external database. Thunder consumes post create/delete events from Kafka and automatically trims posts older than the retention period.

  2. Phoenix Retrieval finds out-of-network candidates — a two-tower model encodes users and posts into embeddings, then retrieves top-K candidates via dot product similarity across the global corpus. This ML-based search discovers content from accounts you don’t follow.

  3. Pre-scoring filters eliminate ineligible candidates — duplicates, old posts, self-posts, blocked/muted accounts, previously seen/served posts, muted keywords, and paywalled content are removed before the expensive transformer inference runs.

  4. Phoenix Ranking scores remaining candidates — the Grok-based transformer predicts 14 engagement probabilities for each post. The Weighted Scorer combines them into a final score.

  5. Selection picks the top K — sorted by final score, with author diversity attenuation to prevent feed monopolization.

“We have eliminated every single hand-engineered feature and most heuristics from the system. The Grok-based transformer does all the heavy lifting.” — xAI, from the repository README

The 200ms target is achieved because the expensive ML inference (transformer ranking) runs only on the already-filtered candidate set — roughly 1,500 posts — not on the 500 million raw corpus.

What are the four components — Home Mixer, Thunder, Phoenix, and Candidate Pipeline — and how do they fit together?

Four cards describing each component: Home Mixer (orchestration, gRPC), Thunder (in-memory post store, Kafka ingestion), Phoenix (retrieval + ranking transformer), Candidate Pipeline (reusable framework).

Home Mixer (Orchestration Layer)

The entry point. Exposes a gRPC endpoint (ScoredPostsService) that returns ranked posts for a given user. It leverages the Candidate Pipeline framework with 8 stages: Query Hydrators → Sources → Hydrators → Filters → Scorers → Selector → Post-Selection Filters → Side Effects.

The May 15th, 2026 update added query hydrators for user context including followed topics, starter packs, impression bloom filters, IP, mutual follow graphs, and served history.

Thunder (In-Network Post Store)

An in-memory post store that tracks recent posts from all users. Written in Rust. It consumes post create/delete events from Kafka, maintains per-user stores for original posts, replies/reposts, and video posts, and serves in-network candidates from accounts the requesting user follows.

The key performance characteristic: sub-millisecond lookups without hitting an external database. Posts are trimmed automatically after the retention period. This design eliminates the database bottleneck that would make 200ms impossible at X’s scale.

Phoenix (Grok Transformer — Retrieval + Ranking)

The ML component with two distinct functions:

Retrieval (Two-Tower Model): The User Tower encodes user features and engagement history into an embedding. The Candidate Tower encodes all posts into embeddings. Similarity search retrieves the top-K posts via dot product.

Ranking (Transformer with Candidate Isolation): Takes user context (engagement history) and candidate posts as input. Uses special attention masking so candidates cannot attend to each other — they can only attend to user context. This ensures a post’s score doesn’t depend on which other posts are in the batch, making scores consistent and cacheable.

Candidate Pipeline (Reusable Framework)

A Rust trait-based framework defining six traits: Source, Hydrator, Filter, Scorer, Selector, and SideEffect. Sources and hydrators run in parallel where possible, with configurable error handling. This makes the pipeline composable — new candidate sources, filters, or scorers can be added without modifying the framework.

How does the Grok-based Phoenix transformer predict 14 different engagement types and combine them into a single score?

Instead of predicting a single “relevance” score, Phoenix predicts probabilities for 14 distinct actions:

Action Type
favorite, reply, repost, quote, click, profile_click, video_view, photo_expand, share, dwell, follow_author Positive
not_interested, block_author, mute_author, report Negative

The Weighted Scorer combines these into:

Final Score = Σ (weight_i × P(action_i))

Positive actions carry positive weights. Negative actions carry negative weights — pushing down content the user would likely dislike. This multi-action approach is more nuanced than a single relevance score because it captures how a user engages, not just whether they engage.

The transformer implementation is ported from the Grok-1 open source release by xAI, adapted for recommendation system use cases. It uses hash-based embeddings for both retrieval and ranking lookups.

“Rather than predicting a single ‘relevance’ score, the model predicts probabilities for many actions.” — xAI, from the repository README

How does Phoenix’s candidate isolation mechanism prevent posts from influencing each other’s rankings?

Candidate isolation is one of the five key design decisions highlighted in the repository. During transformer inference, candidates use special attention masking so they cannot attend to each other — only to the user context.

This achieves two critical properties:

  1. Score consistency — a post’s score doesn’t change based on which other posts happen to be in the same batch. The same post gets the same score whether it’s ranked against 10 candidates or 1,500.

  2. Score cacheability — because scores don’t depend on batch composition, they can be pre-computed and cached. This is essential for the 200ms latency target at X’s scale.

Without candidate isolation, the ranking would exhibit a listwise dependency — a post’s score would shift depending on what else was in the ranking pool, making caching impossible and inference costs unpredictable.

The attention mask achieves this by allowing each candidate to attend to the user context sequence but blocking cross-attention between candidates. The transformer still encodes all candidates in a single forward pass (for efficiency), but the attention pattern is constrained to prevent batch composition effects.

Why did xAI eliminate every hand-engineered feature — and what does the transformer learn instead?

X New Approach: No hand-engineered features

Traditional recommendation systems rely heavily on hand-engineered features: text features, author popularity, recency boosts, content category matching, engagement velocity heuristics. Each feature requires engineering effort, A/B testing, and maintenance as user behavior shifts.

xAI’s approach replaces all of that with a single principle: let the transformer learn relevance from user engagement sequences.

The transformer takes as input:

  • User’s recent engagement history (what they liked, replied to, shared, clicked)
  • Candidate post content and metadata
  • User features (following list, preferences)

From this raw data, it learns to predict the 14 engagement probabilities. No engineer needs to define a “recency weight” or “author popularity multiplier” — the model discovers these patterns from the data.

The benefit, according to the repository: “This significantly reduces the complexity in our data pipelines and serving infrastructure.” Features that previously required dedicated data pipelines, feature stores, and serving infrastructure are now learned implicitly by the transformer.

The Author Diversity Scorer is one of the few post-transformer adjustments — it attenuates scores for repeated authors to prevent the feed from being dominated by a single account. This isn’t a hand-engineered relevance feature; it’s a diversity constraint applied after ML scoring.

What can developers learn from X’s composable pipeline architecture and in-memory post store design?

Three architectural lessons stand out:

1. Trait-based pipeline composition

The Candidate Pipeline framework defines six traits (Source, Hydrator, Filter, Scorer, Selector, SideEffect) that new pipeline stages implement. This separates pipeline execution and monitoring from business logic. New candidate sources, filters, or scorers can be added by implementing the relevant trait — no pipeline code changes needed.

2. In-memory serving for latency-critical paths

Thunder demonstrates that at planet scale, the fastest database query is no database query. By keeping recent posts in memory, consuming from Kafka for updates, and trimming old data automatically, Thunder achieves sub-millisecond lookups without any external storage dependency. This pattern is applicable to any system where the working set fits in memory and freshness matters.

3. Parallel execution where independent

The framework runs sources and hydrators in parallel where possible. This isn’t just about speed — it’s about keeping the GPU pipeline fed during the expensive transformer inference step. If hydration is slow, the GPU sits idle. Parallel execution minimizes idle time.

The repository includes a pre-trained mini Phoenix model (256-dim embeddings, 4 attention heads, 2 transformer layers, ~3 GB) distributed via Git LFS, enabling out-of-the-box inference without training. This makes the system accessible for experimentation and learning — you can study how a production recommendation system works without needing X’s training infrastructure.

Frequently Asked Questions

Q: Can I use X’s ranking algorithm in a commercial product?

Yes. The repository is licensed under Apache 2.0, which permits commercial use, modification, and distribution. The Grok-1 model weights are separate and have their own license.

Q: What languages is the system written in?

The Candidate Pipeline, Thunder, and Home Mixer are written in Rust (57.4% of the repo). Phoenix (the ML component) is written in Python (42.6%). The Grok-based transformer was ported from xAI’s Grok-1 open source release.

Q: Does the repo include training data or only inference code?

The repo includes the inference pipeline and a pre-trained mini Phoenix model. Training data and the full production model weights are not included. This is common for recommendation system open-source releases — you get the architecture and inference code, not user data.

Q: How does this compare to Twitter’s 2023 algorithm release?

Twitter’s 2023 release was the precursor. xAI’s release is a major update: the transformer was ported from Grok-1 (replacing the earlier ML model), all hand-engineered features were eliminated, and the system now includes ads blending, Grox content understanding (spam, classification, policy enforcement), and an end-to-end inference pipeline.

Q: Can I run the mini Phoenix model on my laptop?

Yes. The pre-trained mini model is ~3 GB and distributed via Git LFS. The phoenix/run_pipeline.py script provides a single entry point for retrieval → ranking inference from exported checkpoints.

Q: How often is the codebase updated?

The repository’s README states code updates are “promised roughly every four weeks.” The May 15th, 2026 update was the most recent at time of analysis, adding the end-to-end inference pipeline, pre-trained model artifacts, Grox content understanding, ads blending, and expanded hydrators/sources.

Glossary

  • Home Mixer: The orchestration layer that assembles the For You feed — handles query hydration, candidate sourcing, filtering, scoring, and selection
  • Thunder: An in-memory post store serving in-network content (posts from followed accounts) at sub-millisecond speeds
  • Phoenix: The Grok-based ML component handling out-of-network retrieval (two-tower model) and candidate ranking (transformer with 14 engagement predictions)
  • Candidate Pipeline: A reusable Rust trait-based framework for building recommendation pipelines with Source, Hydrator, Filter, Scorer, Selector, and SideEffect traits
  • Candidate isolation: An attention masking technique ensuring candidates cannot attend to each other during transformer inference — only to user context — making scores consistent and cacheable
  • Multi-action prediction: Predicting 14 engagement probabilities (like, reply, repost, click, block, report, etc.) rather than a single relevance score

Author

Ramsis Hammadi — AI/ML engineer specializing in GenAI, LLM engineering, and automation. Full bio →

Deploy Your Apps with 0 downtime Part 1 (Blue-Green Deployment)

Overview

Have you ever experienced your app can’t be accessed whenever you release a new version of your app?. In this series, we’ll explore how to deploy updates with zero downtime, starting with one of the most reliable strategies — Blue-Green Deployment.

When we deploy an application on Cloud provider like AWS, Azure or GCP, we usually do like this:

  • Shutting down the app
  • compiled new version code
  • Start app again

Looks like there’s no problem with steps above until we noticed that our app is getting down or can’t be accessed during the deployment process. we call this situation as downtime.

In this article we will learn how to prevent that using a one of deployment strategies called Blue-Green Deployment.

What it is Blue-Green Deployment?

Blue-Green Deployment is a strategy which we will switch the traffic from previous version instances(blue) to another identical new release instances(green) which are running on production environment. To achieve this goal, load balancer is playing crucial function to switching traffic

In this tutorial, we will use docker as a container manager and nginx as load balancer. We will deploy nextjs app and simulate it to achieve 0 downtime by using blue green deployment

Before we started, make sure you already install software bellow:

Notes: make sure you are familiar with linux environment

Install Docker and Nginx

open wsl and type bellow to install nginx

sudo apt install nginx

after nginx installed we will install docker,nodejs and git

sudo apt install docker nodejs git

after you installed the tools above, please create directory following image bellow

Setup Docker

We will use docker compose to run the app and nginx inside the container. so on Dockerfile, write this code

FROM node:20-alpine

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

RUN npm run build

EXPOSE 3000

CMD ["npm", "start"]

Before Implement Blue Green Deployment

Before we start to setup the blue green deployment. i will show you the deployment before implement Blue Green deployment. i will write the docker-compose.yml like this.

services:
  app:
    build: ./app
    container_name: app
    ports:
      - "5001:3000"


  nginx:
    image: nginx:latest
    container_name: nginx-bluegreen
    ports:
      - "80:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/active_backend.conf:/etc/nginx/conf.d/active_backend.conf

and for nginx.conf

events {}

http {



    server {
        listen 80;

        location / {
            proxy_pass http://host.docker.internal:5001;

            proxy_http_version 1.1;

            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";

            proxy_set_header Host $host;
        }
    }
}

and then i will write the deployment script on deploy.sh

#!/bin/bash

set -e

echo "================================="
echo "Starting Deployment..."
echo "================================="

echo ""
echo "[1/5] Building container..."

docker compose build app

echo ""
echo "[2/5] Stopping old container..."

docker compose stop app

echo ""
echo "[3/5] Removing old container..."

docker compose rm -f app

echo ""
echo "[4/5] Starting new container..."

docker compose up -d --no-deps app

echo ""
echo "[5/5] Running health check..."

sleep 5

STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost/api/health-check)

if [ "$STATUS" != "200" ]; then
    echo "Deployment failed!"
    exit 1
fi

echo ""
echo "================================="
echo "Deployment Success!"
echo "================================="

the i will running the container using docker compose

docker compose up

and now when i visit http://localhost the page will showing

now i will run ./deploy.sh to simulate the deployment process. when i refresh the page many times, i got the 502 bad gateway we called this as downtime

the downtime occur because i need to stop the container while i building new image version. so, the page will unavailable for some time. to prevent the downtime we need to create 2 app, one for active app and one for standby app. so when new release detected, we will rebuild the standby app, do the healthy check to make sure the app is healthy, then when app is detected as healthy app, we switch the traffic to new release app. here’s the ilustration

Implement Blue Green

To Implement the Blue Green deployment, we will change our deployment mechanism like this:

  • deploy 2 services called app_blue and app_green
  • configure the nginx to route the traffic to app_blue
  • write the current active app to “blue”
  • new deployment detected
  • rebuild app_green
  • do health check the app_green
  • if healthy switch traffic to app_green
  • write the current active app to “green”

Create Healthy Check Route

Inside the nextjs app, we will create a route to indicates that the application is running well and healthy

open app/api/health-check/route.ts and write the code below:

export async function GET() {
  return Response.json({
    ok: true
  })
}

run your app

npm run dev

then test the script by running

curl http://localhost:3000/api/health

it should return

{"ok":true}

after that, we will setup the docker compose to running 2 nextjs app and nginx as load balancer.

services:
  app_blue:
    build: ./app
    container_name: app-blue
    ports:
      - "5001:3000"

  app_green:
    build: ./app
    container_name: app-green
    ports:
      - "5002:3000"

  nginx:
    image: nginx:latest
    container_name: nginx-bluegreen
    ports:
      - "80:80"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/active_backend.conf:/etc/nginx/conf.d/active_backend.conf

on code above, we created 2 services for apps that running on port 5001and 5002. and we created nginx services as a load balancer that will switch the traffic everytime when the new deployment found.

Setup Nginx

open nginx folder on the root folder and create nginx.conf

events {}

http {

    include /etc/nginx/conf.d/active_backend.conf;

    server {
        listen 80;

        location / {
            proxy_pass http://active_backend;

            proxy_http_version 1.1;

            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";

            proxy_set_header Host $host;
        }
    }
}

In nginx.conf, we forward all requests to the active backend defined in active_backend.conf, which is imported from the nginx folder.

on active_backend.conf we will write this configuration file

upstream active_backend {
    server host.docker.internal:5001;
}

on active_backend.conf we created the upstream named active_backend. the active_backend is route all request to localhost:5001 that running under the docker container. so we must define host.docker.internal:5001

Store Current Active App

To store current active app. we will create new file called active_slot which is contain txt content

green

Deployment Script

We will create file deploy.sh to simulate our deployment script including :

  • check the active app
  • rebuild the standby app
  • hit the health check of new release app
  • switching the traffic to new release app
#!/bin/bash

set -e

ACTIVE=$(cat active_slot)

if [ "$ACTIVE" = "blue" ]; then
    TARGET="green"
    TARGET_PORT=5002
    TARGET_SERVICE="app_green"
else
    TARGET="blue"
    TARGET_PORT=5001
    TARGET_SERVICE="app_blue"
fi

echo "============================"
echo "Current Active : $ACTIVE"
echo "Deploy Target  : $TARGET"
echo "============================"

echo ""
echo "[1/5] Rebuilding $TARGET_SERVICE..."

docker compose build $TARGET_SERVICE
docker compose up -d --no-deps $TARGET_SERVICE

echo ""
echo "[2/5] Waiting app startup..."

sleep 10

echo ""
echo "[3/5] Running health check..."

for i in {1..20}
do
    STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:$TARGET_PORT/api/health-check)

    if [ "$STATUS" = "200" ]; then
        echo "Health check success!"
        break
    fi

    echo "Retry $i..."
    sleep 3
done

if [ "$STATUS" != "200" ]; then
    echo "Health check failed!"
    exit 1
fi

echo ""
echo "[4/5] Switching nginx traffic..."

cat > nginx/active_backend.conf <<EOF
upstream active_backend {
    server host.docker.internal:$TARGET_PORT;
}
EOF

docker exec nginx-bluegreen nginx -s reload

echo "$TARGET" > active_slot

echo ""
echo "[5/5] Deployment success!"
echo ""
echo "Active slot now: $TARGET"

look at

docker compose build $TARGET_SERVICE
docker compose up -d --no-deps $TARGET_SERVICE

because we are running 2 services from same image we need to add

--no-deps

options to prevent the docker restart the active app while it rebuild the image. so the active app can still running.

edit page.tsx and run the deploy.sh. now the downtime is gone while we deploy new version in our app

SpaceX ve OpenAI, halka açılmaya hazırlanıyor

SpaceX Polaris Dawn

SpaceX Polaris DawnElon Musk’ın sahibi olduğu özel uzay şirketi SpaceX ve ChatGPT’yi geliştiren OpenAI, resmi olarak halka açılmaya hazırlanıyor. Büyük yapay zeka şirketi OpenAI’ın bu konuda resmi adımı eylül ayında atmak istediği aktarılıyor. SpaceX ise süreci yakın zaman içerisinde tamamlamayı hedefliyor. Elon Musk’ın X’ini (eski adıyla Twitter) satın alarak bünyesine katan yapay zeka şirketi xAI’ın da sahibi olan özel uzay şirketi, Nasdaq borsasında SPCX koduyla işlem görme planını detaylandıran evrakları Menkul Kıymetler ve Borsa Komisyonu’na (SEC) resmi olarak sunmuş durumda.

SpaceX ve OpenAI, halka açılmaya hazırlanıyor yazısı ilk olarak Teknoloji haberleri – LOG üzerinde yayınlandı.

What the Hype Missed: The Pros, Cons, and True Upgrades of Google Antigravity 2.0

Hi DEV Community! 👋

Since the release of Antigravity 2.0, all I’m seeing on social media is AI Gurus or tech influencers glossing over the agent management feature we already had. It was physically ripped from the previous Antigravity, where the agent management feature and the IDE were bundled as one. They are talking about what agent management can do like it is a brand-new thing. But beyond that, there are really cool new features and some drawbacks too. Let’s talk about what Google did, probably why they did it, and the pros and cons.

Split Antigravity and Antigravity IDE

What made Antigravity different from general VS Code? It was the separated agent management environment that it provided, where we could just press Cmd + E and see all the repos we worked on with agents along with the chat history. We could also multitask using agents, even if it was kind of limited. Other than that, it wasn’t any different from late VS Code updates. When Antigravity first released, we didn’t have that many features on VS Code, but it caught up.

So in my opinion, Google just ripped them apart so vibe coders and any other non-coding professionals can use Antigravity 2.0, where they don’t really need to see or edit code or use a terminal. They left Antigravity IDE for the people who stuck with it without going back to VS Code. Slowly, they will discontinue the agent manager on Antigravity IDE and it will just be another VS Code clone. Instead, they’ll double down and develop their agentic AI coding environments on an Antigravity 2.0 type of service.

This is where Google is operating quite differently from the general market like Claude Code, Cursor, and Codex. I personally haven’t used Codex and Cursor much, so there might be a bit of falsehood there. If there is, please don’t mind it—I’m just sharing my opinion after seeing people use them.

Project-Level Scope (Instead of Repos)

This is another thing AI Gurus are glossing over. In 2.0, we can go beyond individual repos and look at or work on a whole project.

Personally, I have already worked on whole projects as a monorepo since I started using AI coding assistants. The reason we didn’t choose monorepos before for our projects was simply because they were too hard to manage, too hard to document, and much more. But after mid-2025, I didn’t have any of those problems in monorepos. I don’t think Antigravity 2.0 will be used in projects large enough to require multiple monorepo-sized repositories to manage. Personally, this wasn’t much of an upgrade for me.

The Real Upgrade

  • Parallel Execution & Backgrounding: 1.0 would block or pause you if an agent was executing a long task. 2.0 lets you kick off multiple agents asynchronously in the background. You can have one agent writing tests while another spins up a separate service.
  • The New CLI and SDK: Google is deprecating the old Gemini CLI and replacing it with a Go-based Antigravity CLI. They also launched an SDK, meaning you can write code to build custom agent hooks using a unified backend.
  • Scheduled Tasks: You can now configure crons directly in JSON. For example:
  {
    "cron": "0 2 * * *",
    "task": "Run this agent every night at 2 AM to check for security vulnerabilities and refactor deprecated code"
  }

What the Future Will Look Like
Google is forcing us developers to dual-wield Antigravity 2.0 and their new CLI rather than use something built directly into VS Code. Since the average person does not want to debug a CLI or maintain a local server terminal just to have an autonomous assistant or to vibe code, Google will most likely develop Antigravity to stand alone and build.

I know practically vibe-coded projects can be a mess, bringing a lot of issues with debugging, deploying, security, or scaling that vibe coders can’t handle right now. Those are the new problems the dev world has today. Since our job is problem-solving, sooner or later there will be solutions.

Let’s wait and see.

(Disclaimer: Any of the articles written by me are not AI-generated. These are my honest thoughts. I don’t see a point in using AI to write articles, but I will use AI tools to just format the text.)

Turn ~800M Free AI Tokens Into a Single OpenAI API with FreeLLMAPI

The Problem Nobody Talks About

Every major AI lab now offers a free tier. Gemini, Groq, Mistral, Cerebras — they all give you a few million tokens a month, a few thousand requests a day.

On paper, that’s generous. In practice, you end up juggling 14 different SDKs, 14 rate limits, and 14 places a request can silently fail.

FreeLLMAPI solves exactly that.

What It Does

It’s a self-hosted proxy that aggregates free tiers from 14 providers behind a single /v1/chat/completions endpoint — fully compatible with the OpenAI SDK.

Supported providers:

Provider Notable Models
Google Gemini 2.5 Pro / Flash
Groq Llama 4, Qwen, Kimi
Cerebras Llama 3.3, Qwen
SambaNova Llama 3.3 70B
NVIDIA NIM Full catalog
Mistral La Plateforme
OpenRouter Free-tier models
GitHub Models GPT-4o, Llama, Phi
Hugging Face Inference Providers
Cloudflare Workers AI
Zhipu GLM-4 series
Moonshot Kimi
MiniMax abab / hailuo

Combined: roughly ~800M tokens/month across all providers.

Zero Code Changes

Point your existing OpenAI SDK at localhost:3001/v1:

from openai import OpenAI

client = OpenAI(
    base_url="http://localhost:3001/v1",
    api_key="freellmapi-your-unified-key",
)

resp = client.chat.completions.create(
    model="auto",  # router picks the best available
    messages=[{"role": "user", "content": "Summarise the fall of Rome in one sentence."}],
)

print(resp.choices[0].message.content)
print("Routed via:", resp.headers.get("x-routed-via"))

That’s it. Every response includes an X-Routed-Via header so you know which provider actually served the request.

Technical Highlights

Automatic failover — On 429 / timeout / 5xx, the router cools down the key and retries the next provider in your chain, up to 20 attempts.

Sticky sessions — Multi-turn conversations stay on the same model for 30 minutes. This matters more than it sounds — switching models mid-conversation causes subtle hallucination spikes.

Per-key rate tracking — RPM, RPD, TPM, and TPD counters per (platform, model, key). The router always picks a key that’s under its caps.

Encrypted key storage — AES-256-GCM before hitting SQLite. Upstream provider keys never leave your machine.

Admin dashboard — React + Vite UI to manage keys, reorder the fallback chain, inspect analytics, and test prompts in a playground.

Lightweight — Runs on a Raspberry Pi 4 at ~40MB RAM idle.

Setup in 3 Lines

git clone https://github.com/tashfeenahmed/freellmapi
cd freellmapi && npm install
cp .env.example .env && npm run dev

Open localhost:5173, add your provider API keys, grab your unified key → done.

The Honest Part

A few things the README says clearly, and you should know upfront:

Intelligence degrades throughout the day. Gemini 2.5 Pro and GPT-4o (via GitHub Models) have the lowest daily caps. Once they’re exhausted, the router falls back to smaller models. Expect effective quality to drop in the late hours — then reset at UTC midnight.

Tool calling and vision are not yet supported. Text-only for now. PRs are welcome.

Latency is unpredictable. Cerebras and Groq are extremely fast. Others are not. You get whichever one is available.

Personal use only. No multi-tenant auth. Don’t expose this to the internet.

Free tiers change without notice. When a provider tightens limits, you’ll see 429s until the catalog is updated.

Who This Is For

✅ Building AI agents or coding assistants and want to prototype without spending money upfront

✅ Researchers and students who hit rate limits on one provider and want seamless fallback

✅ Anyone tired of maintaining multiple SDK integrations

❌ Production workloads — use a paid API with an SLA

Quick ToS Note

The project includes a detailed review of each provider’s terms. Most are fine for single-user personal use. Notable exceptions: Cohere’s trial ToS explicitly forbids personal/household use, and NVIDIA NIM’s free tier is scoped to evaluation only.

Read the full table in the README before adding keys.

FreeLLMAPI is MIT licensed and actively welcoming contributors — especially for adding embeddings, tool calling, and new providers.

→ github.com/tashfeenahmed/freellmapi

Stop making your users scroll: How moving our database parameters to a 0% scroll layout changed our performance metrics

Let’s be honest about the state of programmatic utility sites: most of them are terrible to use.

You search for a quick piece of technical data—a routing transit number, a sort code, or an international bank account layout—and you land on a web page built in the early 2000s that forces you to navigate an absolute maze. You scroll past three generic text blocks, dodge intrusive ads, and wait for heavy client-side scripts to spin up just to find a single string.

When I set out to build SwiftCodeDir.com, a global financial directory tracking over 186,000 banking records and 110 country IBAN structures, I wanted to fix this exact layout friction.

But as we scaled up our programmatic pages, we hit a classic technical SEO wall: high mobile bounce rates, choppy loading states on slower data connections, and automated search engine crawlers taking too long to validate our data fields.

The fix wasn’t a complex backend rewrite or throwing expensive serverless compute at the database. It was a radical design decision: We moved 100% of our high-intent technical parameters to a 0% scroll depth view inside a single dark-blue hero section.

Here is the exact engineering breakdown of why this shift works, how it affects data rendering speed, and why your application might need an above-the-fold overhaul.

The Problem: Layout Latency and Programmatic “Thin Content” Flags
When you are programmatically generating thousands of category pages (like /iban/russia or /iban/saint-lucia), your code architecture faces two strict judges: real human users on mobile phones and automated search engines evaluating your user experience.

In our early iterations, our deep-level directories followed a standard layout sequence:

Global Navigation header.

Conceptual introductory paragraphs explaining the regional banking framework.

The actual data table containing country codes, character lengths, and format maps.

Plaintext
[Old Structure]
+———————————–+
| Header & Navigation Menu |
+———————————–+
| “What is an IBAN?” (Intro text) | <– Users had to scroll past this
| “Why routing errors happen…” | <– Crawlers wasted time reading this
+———————————–+
| DATA BLOCK: Code, Length, Maps | <– The actual value was hidden down here
+———————————–+
For a desktop user on a high-speed fiber connection, this layout was fine. But look at the data split across your infrastructure. Our mobile performance metrics showed a dramatic shift: mobile users had a click-through rate over 11× higher than desktop platforms for identical search rankings, yet their initial session duration was shorter.

Mobile users don’t want to read a textbook; they have an explicit-intent problem. They are copy-pasting code strings inside a payment dashboard, and they need to verify a parameter in under 500 milliseconds. Making them scroll was killing our mobile engagement loop.

Worse, search engine smartphone spiders rendering the page were parsing the generic text blocks first, occasionally delaying the indexation of the actual data payloads.

The Fix: Engineering a Zero-Scroll Viewport
To fix this layout latency, we redesigned our page layout completely. We eliminated all content fluff above the fold.

Now, when a user or a mobile crawler hits any of our 110 country directories, our frontend template renders a striking, high-contrast dark-blue hero viewport that groups every single critical parameter instantly:

The Regional ISO Code (e.g., LC for Saint Lucia)

The Exact String Length (e.g., 32 Characters)

The Full Basic Bank Account Number (BBAN) Format Map


text
[New Zero-Scroll Architecture]
+-----------------------------------------------------------+
|  SWIFTCodeDir Logo                                 (⌘K)   |
+-----------------------------------------------------------+
|                                                           |
|   [HERO VIEWPORT - DARK BLUE]                             |
|   /iban/saint-lucia                                       |
|   -----------------------------------------------------   |
|   COUNTRY CODE: LC   |   TOTAL LENGTH: 32 Characters      |
|   BBAN FORMAT:  Bank ID (4) + BSB (4) + Account (20)      |
|                                                           |
+-----------------------------------------------------------+
|                                                           |
|   [SCROLL LINE - 0%]                                      |
|                                                           |
|   Interactive Validator & 2026 Regulatory Context...       |
+-----------------------------------------------------------+


We completely flipped the content layout on its head. The sought-after data is securely framed before the user even moves a finger on their touchscreen. 

---

## Why This Works: The Technical Advantages

This structural layout adjustment yields three major architectural improvements:

### 1. Instant Viewport DOM Tokenization
By placing our technical parameter strings high up in the HTML layout, the automated smartphone crawlers capture the unique value of the directory node on the very first pass. The crawler doesn't have to guess if the page is a duplicate or a generic template placeholder—it instantly catalogs the distinct financial parameters, accelerating our directory indexation timeline.

### 2. Drastic Reduction in Content Friction
When a user arrives searching for a metric like *"Saint Lucia IBAN structure"* and immediately sees **32 characters** inside a clean hero frame, their intent is validated in milliseconds. This satisfies strict modern core web vitals and interaction metrics, turning brief visits into highly successful, verified user utility sessions.

### 3. Clear Parent-to-Child Authority Silos
We keep our data clean by anchoring these $110$ country layouts directly to our fully indexed core informational pillars. Our main long-form articles guide users through the macro concepts of global clearing shifts, while smoothly linking down to these zero-scroll country tools. This keeps search crawlers looping efficiently inside our data network.

---

## The Takeaway: Design Your Utilities for Speed

If you are currently building or maintaining a programmatic application, database directory, or SaaS dashboard, take a close look at your initial viewport. 

Are you forcing your users to digest menus, filler descriptions, or empty space before delivering the exact data they came for? 

Try moving your core data parameters straight to the top of your layout grid. Group them cleanly, remove the layout friction, and let your interface deliver answers instantly at a $0%$ scroll depth.

Have you tried optimizing your database pages for a zero-scroll experience, or do you still prefer traditional text-heavy layouts for your programmatic sites? Let's talk about frontend data optimization in the comments!

Blazor vs. Angular: Which web framework to choose and why?

Angular and Blazor are often compared because they solve a similar problem: building modern, interactive web applications. This comparison raises basic questions like what to choose and why, or why would someone switch. After all Angular has been here for a while now and has become a staple in the industry.

However as new technologies emerged like Blazor, this topic has gotten another twist.

Up until recently if you were a C# developer and wanted to write code for browsers you had to use JavaScript. Now, you can use C# for both server-side and client-side development giving you the choice of a unified stack across platforms.

This gives you a full access to .NET technologies with which you can develop top rated SPAs (Single Page Applications).

And bonus, you no longer have to depend on JavaScript for high quality web development.

To really give you an idea about what this means in practice, considering the differences between these two architectural philosophies, lets see how they work independently.

Lets start with Angular

Angular, maintained by Google, has established itself as one of the most structured frameworks in the frontend ecosystem.

Unlike lightweight libraries that focus primarily on rendering, Angular offers a complete application framework with built-in solutions for routing, dependency injection, forms, HTTP communication, testing, and reactive state management.

For enterprise teams, that level of structure is often one of its greatest strengths.

Large frontend applications rarely become difficult to maintain because of rendering alone.

More often, problems emerge from inconsistent architecture across teams. Angular helps reduce that risk by enforcing conventions and encouraging a predictable project structure. In organizations with multiple developers, long-term products, and strict delivery requirements, that consistency becomes operationally valuable rather than simply technical preference.

From a practical standpoint, Angular performs especially well in applications that require complex client-side state management, clearly defined architectural boundaries, independently scalable feature modules, and a strong focus on long-term maintainability over minimal setup.

At the same time, Angular introduces a level of complexity that smaller teams or backend-oriented developers may find difficult to justify.

The framework expects familiarity with TypeScript, RxJS, reactive programming patterns, dependency injection, Angular-specific architectural conventions, build tooling, and modern frontend workflows.

For experienced frontend engineers, these concepts are often beneficial and manageable.

For teams without strong frontend specialization, however, Angular can increase onboarding time and development overhead.

Another challenge lies in the pace of the frontend ecosystem itself.
Although Angular is generally more stable than many JavaScript frameworks, teams still operate within a rapidly evolving tooling landscape. Dependency updates, build configuration changes, browser compatibility concerns, and shifting frontend standards remain part of the development process.

Moving on to Blazor

Blazor, developed by Microsoft, approaches web development from an entirely different perspective.

Rather than fully embracing the JavaScript ecosystem, Blazor allows developers to build interactive web interfaces using C# and .NET.
For organizations already invested in ASP.NET, this creates an attractive development model.

One of Blazor’s strongest advantages is stack unification

Teams can share models, validation logic, authentication systems, and business logic across frontend and backend layers while working within the same language and ecosystem.

This reduces context switching between teams and allows organizations to leverage existing .NET expertise more effectively.

In practice, that can significantly improve productivity for backend-heavy teams transitioning into modern web application development.
Blazor also simplifies certain organizational challenges.

Companies with strong .NET engineering teams can build interactive applications without requiring deep specialization in JavaScript frameworks, while existing tooling, CI/CD pipelines, and enterprise integrations often fit naturally into the broader Microsoft ecosystem.

Blazor Server, in particular, works well for internal enterprise applications where real-time UI synchronization is acceptable, network latency is controlled, SEO is not a major priority and tight backend integration matters more than frontend independence.

Blazor WebAssembly extends this model further by allowing .NET to run directly in the browser, reducing reliance on JavaScript for client-side logic.

Still, Blazor introduces its own tradeoffs

Its frontend ecosystem remains smaller than Angular’s, and while the framework has matured significantly, developers may still encounter limitations around advanced UI component ecosystems, third-party browser integrations, JavaScript interoperability requirements, and overall community size compared to mainstream frontend frameworks.

Performance considerations also differ between the two approaches.

Blazor WebAssembly applications have historically faced larger initial payload sizes because of the .NET runtime, although recent .NET releases have improved this considerably.

Angular applications, while sometimes operationally complex, generally align more naturally with established browser-native optimization strategies.

Another important consideration is market alignment

JavaScript and TypeScript continue to dominate frontend engineering.
Developers specializing exclusively in Blazor may have less exposure to the broader frontend ecosystem, particularly when it comes to modern browser APIs, rendering strategies, and evolving frontend architecture patterns.

In real production environments, framework decisions are rarely based on syntax preference alone.

Teams usually optimize for development velocity, maintainability, hiring availability, existing infrastructure, team expertise, and long-term operational cost.

Angular tends to be the stronger choice when frontend engineering is treated as a specialized discipline and when organizations are building large-scale single-page applications with complex UI requirements.

Blazor, on the other hand, is often the better fit when backend and frontend responsibilities overlap heavily, existing investment in .NET is substantial, development efficiency outweighs ecosystem breadth, and internal business applications make up most of the workload.

Neither framework removes complexity entirely

Both Angular and Blazor shift complexity into different areas. Angular places greater emphasis on frontend architecture and reactive client-side development, while Blazor reduces frontend ecosystem fragmentation but increases reliance on the .NET runtime and Microsoft stack conventions.

For Angular developers transitioning into Blazor, the biggest adjustment is usually moving away from heavy JavaScript tooling and adopting a more server-oriented way of thinking.

The benefits often include strongly typed end-to-end development, shared business logic, simplified backend integration, and a more familiar environment for C# developers. The tradeoff is reduced exposure to the broader frontend ecosystem and potentially less flexibility in advanced client-side scenarios.

For Blazor developers moving into Angular, the transition often involves embracing frontend engineering more deeply through reactive programming patterns, browser-native optimization strategies, rich client-side state management, and extensive JavaScript tooling. While this can initially increase complexity, it also expands flexibility and exposure to widely adopted frontend practices.

Final thoughts on Blazor vs Angular debate

Ultimately, Angular and Blazor represent two fundamentally different approaches to modern web application development.

Angular prioritizes frontend architecture, scalability, and ecosystem maturity, making it particularly effective for teams building complex client-side applications with dedicated frontend expertise.

Blazor focuses more on ecosystem unification, developer productivity within .NET and reducing dependence on JavaScript frameworks, which makes it especially attractive for organizations already centered around Microsoft technologies.

For developers evaluating either framework, the most important question is not which technology is more modern or more popular.
The more practical question is which set of tradeoffs aligns best with the applications a team actually builds, maintains, and supports over time.

In real-world software development, that distinction matters far more than framework comparisons in isolation.