Hono is a ultrafast web framework that runs on every JavaScript runtime — Cloudflare Workers, Deno, Bun, Node.js, AWS Lambda, and more. But its real power is in the APIs most developers never explore.
Hono's Middleware API: Composable by Design
import { Hono } from "hono";
import { cors } from "hono/cors";
import { logger } from "hono/logger";
import { prettyJSON } from "hono/pretty-json";
import { secureHeaders } from "hono/secure-headers";
import { timing } from "hono/timing";
const app = new Hono();
app.use("*", cors());
app.use("*", logger());
app.use("*", prettyJSON());
app.use("*", secureHeaders());
app.use("*", timing());
Every middleware is a standalone function you can compose, test, and share.
The Validator API
Hono has built-in validation with Zod integration:
import { zValidator } from "@hono/zod-validator";
import { z } from "zod";
const schema = z.object({
title: z.string().min(1).max(100),
url: z.string().url(),
tags: z.array(z.string()).max(5),
});
app.post("/articles", zValidator("json", schema), (c) => {
const data = c.req.valid("json"); // Fully typed!
return c.json({ success: true, data });
});
Validation works for JSON body, query params, headers, and form data.
RPC Mode: Type-Safe Client-Server
Hono's killer feature — automatic type-safe API client:
// Server
const routes = app
.get("/users/:id", (c) => {
return c.json({ id: c.req.param("id"), name: "John" });
})
.post("/users", zValidator("json", createUserSchema), (c) => {
const user = c.req.valid("json");
return c.json(user, 201);
});
export type AppType = typeof routes;
// Client — FULLY TYPED, zero codegen!
import { hc } from "hono/client";
import type { AppType } from "./server";
const client = hc<AppType>("http://localhost:3000");
const res = await client.users[":id"].$get({ param: { id: "1" } });
const user = await res.json(); // { id: string, name: string }
No codegen. No GraphQL. Full type safety across the wire.
JSX Streaming API
import { Hono } from "hono";
import { streamSSE } from "hono/streaming";
app.get("/stream", (c) => {
return streamSSE(c, async (stream) => {
for (let i = 0; i < 100; i++) {
await stream.writeSSE({ data: JSON.stringify({ count: i }) });
await stream.sleep(100);
}
});
});
Real-World: Scraping API on Cloudflare Workers
I deployed a Hono-based scraping API on Cloudflare Workers. The RPC client lets my frontend call scraping endpoints with full type safety. The streaming API sends results as they're scraped.
Need production scraping tools? Check out my Apify actors — get structured data from any website in minutes.
Custom scraping solution? Email spinov001@gmail.com
Top comments (0)