learnagenticpatterns.com
No paid content found
Categories: Artificial Intelligence Design & Creativity Development
Free curriculum: 21 agentic AI design patterns for developers and 15 modules for product managers. Code, architecture, decisions and hands-on games. Zero hype.
Related questions
More questions →What Is MCP and How Does It Connect AI Agents to Tools?
MCP (Model Context Protocol) is an open protocol that gives AI models a standard way to connect to external tools, data sources, and services. Instead of building a custom integration for every tool an agent needs, MCP defines one shared interface so any MCP-capable client can talk to any MCP server. You need MCP when you want an AI agent to reach beyond its training data — reading files, querying databases, calling APIs, or operating third-party apps — without writing bespoke glue code for each connection.
The core idea: one protocol instead of many integrations
Without a standard, connecting an AI agent to five tools means five separate integrations, each with its own authentication, data format, and error handling. MCP replaces that with a client-server model where the protocol itself handles the contract. The model doesn't need to know how a specific tool works internally; it only needs to speak MCP.
How the architecture fits together
MCP uses three roles:
| Role | What it does | Example |
|---|---|---|
| Host | The application the user interacts with; it decides what the model can access | An AI agent app or IDE assistant |
| Client | The connector inside the host that maintains a session with a server | One client per server connection |
| Server | Exposes tools, data, or prompts through the MCP interface | A file-system server, a database server, an API wrapper |
The flow works like this:
- The host starts and creates a client for each server it wants to use.
- The client connects to the server and they negotiate capabilities.
- The server advertises what it offers — callable tools, readable resources, or reusable prompts.
- When the model needs something, the host routes the request through the client to the server.
- The server performs the action and returns a result the model can use.
This separation matters because the model never talks to the outside world directly. The host stays in control of which servers are connected and what the model is allowed to do.
What you can actually do with MCP
MCP servers typically expose three kinds of capability:
- Tools — functions the model can call, such as running a search, creating a file, or sending a message.
- Resources — data the model can read, such as documents, database rows, or configuration files.
- Prompts — reusable templates that guide how the model handles a task.
Practical examples include giving an agent access to a local file system so it can read and edit project files, connecting it to a database so it can answer questions with live data, or wrapping a third-party API so the agent can act on external services. For instance, a coding agent could use an MCP server to inspect a repository, run tests, and apply changes — all through the same protocol it would use to query a database.
Why a standard protocol beats ad-hoc plugins
Ad-hoc integrations and plugins work, but they tend to be:
- Tool-specific — each one is built for a single service and can't be reused elsewhere.
- Host-specific — a plugin written for one assistant usually won't run in another.
- Hard to audit — permissions and data flow are buried in custom code.
MCP addresses these by making the interface uniform. A server written once can be used by any MCP-capable host, permissions are declared at the protocol level, and the boundary between the model and external systems stays explicit. The trade-off is that MCP adds a layer of abstraction, so very simple one-off integrations may still be faster to write directly.
What you need to start
To use MCP you need two things:
- An MCP-capable client or host — an AI agent application or development tool that supports the protocol.
- At least one MCP server — either an existing server for the tool you want to connect, or one you build yourself.
Once both are in place, you configure the host to connect to the server, review what capabilities the server exposes, and let the agent use them. The main things to check before connecting are what data the server can access and what actions it can take, since those define the agent's reach.
What Can You Actually Do With a Free Hosted REST API Like ReqRes?
A free hosted REST API like ReqRes gives you a real HTTP endpoint you can call immediately—no signup, no local server, no database setup. You get predictable JSON responses for users, resources, login, and registration, which makes it useful for front-end demos, integration tests, learning HTTP clients, and prototyping. What it is not is a production backend for your app: the data is shared, resets periodically, and you don't control the schema. If you need persistent, private data with auth and logs, that's where an account-based backend or a commercial licence comes in.
What "free REST API for testing and prototyping" actually means
The phrase sounds vague, so it helps to separate two things people often conflate:
- A mock/sample API — a public, hosted service with fixed or semi-fixed endpoints that return realistic-looking JSON. You don't own the data. It exists so you can point code at a URL and get a response.
- A real backend you configure — a service where you define collections, schemas, authentication, and logging, and where your data persists and belongs to you.
ReqRes's landing page describes both: a free REST API for testing and prototyping with real responses and no signup, plus an option to build your own backend with collections, auth, and logs at app.reqres.in. Those are different products with different trade-offs. The free public endpoints are the "point and go" part; the account-based backend is the "own your data" part.
What you can do with the no-signup public endpoints
1. Front-end demos without a backend
If you're building a UI and need data to render, you can fetch from a public endpoint instead of hardcoding arrays. This keeps your demo code closer to real fetch logic:
async function loadUsers(page = 1) {
const res = await fetch(`https://reqres.in/api/users?page=${page}`);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const { data, total, page: current } = await res.json();
return { users: data, total, page: current };
}
You get pagination fields, a data array, and support metadata—enough to build list views, loading states, and empty states.
2. Integration and contract tests
You can assert that your HTTP layer handles status codes, headers, and JSON shapes correctly. Typical checks:
GET /api/users/2returns200with adataobject.GET /api/users/23returns404(a non-existent user).POST /api/loginwith valid credentials returns a token; with missing fields returns400.
This is useful for testing your client wrapper, retry logic, error handling, and serialization—without spinning up your own server.
3. Learning HTTP clients and tooling
If you're new to fetch, Axios, curl, Postman, or HTTPie, a hosted API is a low-friction target. You can practice:
- Sending query parameters (
?page=2,?delay=3). - Setting headers and reading response headers.
- Handling
POST,PUT,PATCH,DELETE. - Observing status codes for success and failure.
4. Deliberate failure and latency testing
Endpoints that return 404 on purpose, or that accept a delay parameter, let you test how your app behaves when things go wrong or slow down. That's hard to do reliably against a happy-path local mock.
What the public endpoints are not good for
| Use case | Public sample endpoints | Account-based backend |
|---|---|---|
| Persistent, private data | No — shared and reset | Yes |
| Custom schema/collections | No | Yes |
| Authentication you control | Limited (demo login) | Yes |
| Request logs and debugging | No | Yes |
| Production traffic | Not intended | Depends on plan/licence |
| Team collaboration | No | Yes |
The key limitation: you don't own the data, and other people are hitting the same endpoints. Treat responses as illustrative, not authoritative.
When you'd move to an account-based backend
Consider app.reqres.in (collections, auth, logs) when any of these are true:
- You need your own collections and fields, not the fixed demo schema.
- You need data to persist between sessions and belong only to you.
- You need real authentication flows you can rely on in a demo or internal tool.
- You need request logs to debug what your client actually sent.
- You're working with a team and need shared, stable endpoints.
The trade-off is setup and, eventually, cost. The public endpoints require none; the backend requires an account and configuration.
Where pricing and licensing become relevant
The site signals a commercial licence and an upgrade path (with Stripe as the payment platform), but specific prices, plan tiers, and limits aren't stated here—so don't assume numbers. What you can reason about:
- Prototyping and learning → free public endpoints are usually enough.
- Internal tools, demos for clients, or anything you don't want reset → an account-based backend is the natural next step.
- Production or commercial use → check the licence terms and any paid plan, because "free for testing" and "free for commercial production" are not the same thing.
Before committing, read the current terms on the site rather than relying on secondhand summaries, since pricing and licence scope change.
A quick decision checklist
- Do you need data that persists and is private? If yes → account-based backend.
- Do you need a custom schema? If yes → account-based backend.
- Are you only testing HTTP behavior, UI rendering, or learning a client? If yes → free public endpoints.
- Will this touch real users or revenue? If yes → review the licence and any paid plan first.
- Do you need logs and team access? If yes → account-based backend.
If you answer "no" to 1, 2, 4, and 5, the free hosted API is likely all you need. If you answer "yes" to any of them, plan for the account-based path.
What Is RAG and How Do You Build a Free RAG Stack for Document Q&A?
RAG (Retrieval-Augmented Generation) is a pattern where you retrieve relevant chunks of your own documents and pass them to an LLM as context, so the model answers from your data instead of its training memory. You can build a working document Q&A stack entirely from free-tier tools: a free LLM API for generation, an open embedding model, and a local or free-tier vector store. This guide covers the mechanism, the components, and a minimal build path — plus where these pipelines usually break.
The core mechanism in one pass
A plain LLM call sends your question and nothing else. A RAG call does two things first:
- Retrieve — search your document collection for the passages most semantically similar to the question.
- Augment — insert those passages into the prompt as context.
The model then generates an answer grounded in the retrieved text. This is why RAG is often described as "giving the model an open-book exam" rather than testing what it memorized.
RAG vs. fine-tuning vs. plain prompting
| Approach | What changes | Best when | Main cost |
|---|---|---|---|
| Plain prompting | Nothing — model uses training knowledge | General questions, no private data | Can't answer about your documents; hallucinates |
| RAG | Adds retrieved context at query time | Your data changes often; you need citations; data is too large for a prompt | Retrieval quality becomes the bottleneck |
| Fine-tuning | Adjusts model weights on your examples | You need a consistent style, format, or domain behavior | Expensive, slow to update, doesn't add fresh facts reliably |
For document Q&A over a knowledge base that changes, RAG is usually the right first move. Fine-tuning teaches how to respond; RAG supplies what to respond with.
The components of a minimal RAG pipeline
Every RAG stack, free or paid, has the same six stages. The free-tool directory at freeaitoolslist.vercel.app organizes its RAG Stack category (12 tools) around exactly these pieces.
1. Document loading
Pull raw text out of your sources — PDFs, Markdown, HTML, Notion exports, database rows. This is usually a small script, not a service.
2. Chunking
Split documents into passages small enough to embed and retrieve precisely. Typical starting point: 300–800 tokens per chunk with some overlap (e.g., 10–20%) so sentences aren't cut mid-thought.
3. Embedding
Convert each chunk into a vector using an embedding model. Open-weight embedding models can run locally for free; hosted embedding endpoints are also common.
4. Vector store
Store the vectors plus their source text and metadata. Options range from an in-process library (no server) to a hosted free-tier vector database. The directory lists vector database as a tracked category.
5. Retrieval
At query time, embed the question the same way and find the top-k nearest chunks. This is the step that most determines answer quality.
6. Generation
Send the retrieved chunks plus the question to an LLM. Free-tier LLM APIs from the directory's LLM APIs category (20 tools) fit here — for example:
- OpenRouter — unified API across 29 free models, 20 RPM and 50 requests/day (1,000/day with $10+ credits), no credit card required.
- Groq — 1,000–14,400 requests/day depending on model, no credit card required.
- Google AI Studio — free Gemini API, roughly 250 requests/day on Tier 1 for most models, up to 1,500 RPD for Gemini 3 Flash.
- Cerebras — 1.5M tokens/day, 30 req/min, 8,192 context.
Check each provider's current limits before committing, since free tiers change.
A minimal build path
Here's the shortest route from a folder of documents to a working Q&A loop. The exact libraries are your choice; the sequence is what matters.
- Load your documents into plain text and keep a
sourcefield on each one. - Chunk each document into ~500-token passages with overlap. Store
{text, source, chunk_id}. - Embed every chunk with an embedding model and write the vectors into your vector store alongside the metadata.
- Query: embed the user's question, retrieve the top 3–5 chunks by similarity.
- Prompt: build a message like "Answer using only the context below. If the answer isn't present, say so. Context: … Question: …"
- Generate with a free-tier LLM API and return the answer plus the source chunks so the user can verify.
Verify it works: ask a question whose answer exists verbatim in one document, and a second question whose answer does not exist anywhere. A correct build answers the first with the right source and declines the second instead of inventing one.
Where free RAG stacks break
- Chunking too coarse or too fine. Big chunks dilute the signal and blow your context budget; tiny chunks lose the surrounding meaning. Tune this first when answers feel vague.
- Poor retrieval recall. If the right passage never appears in the top-k, no LLM can fix it. Try more chunks, a better embedding model, or hybrid keyword + vector search.
- Context overflow. Free tiers have hard context caps — Cerebras lists 8,192 context, for instance. Stuffing too many chunks will truncate or error.
- Hallucination despite context. The model answers from memory when retrieval is weak. An explicit "answer only from context" instruction plus returning sources reduces this.
- Stale index. If documents change, re-embed the changed chunks. A RAG system is only as current as its vector store.
Choosing your free components
Match tools to your constraints rather than chasing the biggest name:
- Data must stay local → local embedding model + in-process vector store + a locally run open-weight model.
- Fastest to prototype → hosted free-tier embedding + a free-tier vector database + a free LLM API like Groq or Google AI Studio.
- Highest request volume → compare daily request and token caps across providers (Groq's 1,000–14,400 req/day and Cerebras's 1.5M tokens/day are the generous end of the directory's listings).
The directory's Recommended Stacks section groups these into ready-made combinations if you'd rather not assemble each piece yourself.
What Are AI Agents and How Do You Connect Them to Real-World Tools?
An AI agent is a system that uses a language model to decide what to do next — calling tools, fetching data, and chaining steps — rather than just answering a single prompt. To act on the real world, an agent needs external tools, because its training data is frozen and it can't browse, scrape, or write to your apps on its own. The practical way to give it those capabilities is to connect it to ready-to-run tools through APIs or marketplace integrations. Apify, for example, describes itself as "a marketplace of ready-to-run tools for AI" with "73,229 tools for your AI," which is the kind of catalog you'd plug an agent into.
Agent vs. chatbot vs. single prompt
| Single prompt | Chatbot | AI agent | |
|---|---|---|---|
| Input | One question | Ongoing conversation | A goal |
| Decides next step? | No | No | Yes |
| Uses external tools? | No | Sometimes | Yes, by design |
| Example | "Summarize this text" | "Answer my follow-ups" | "Find competitor prices and update my sheet" |
The distinguishing feature is autonomy over steps. A chatbot waits for you to drive; an agent plans and executes, then reports back.
Why agents need external tools
A model's knowledge stops at its training cutoff and contains no live data about your niche, your competitors, or your own systems. Tools close that gap:
- Fresh data — current prices, posts, reviews, listings
- Actions — writing to a database, sending a message, triggering a workflow
- Structure — turning messy web pages into clean fields an agent can reason over
Without tools, an agent can only talk. With them, it can do.
How agents connect to tools
Three common patterns, from simplest to most integrated:
- Direct API calls — the agent (or your code around it) hits an endpoint and gets JSON back. You handle auth and parsing.
- Marketplace integrations — you pick a ready-made tool from a catalog and connect it to your agent. Apify's page lists this as "Easily connect with your AI agents," alongside "Ready-to-run or build your own."
- MCP / framework adapters — the tool exposes itself in a format your agent framework understands. Apify's Website Content Crawler, for instance, "integrates well with 🦜🔗 LangChain, LlamaIndex, and the wider LLM ecosystem."
The right choice depends on how much glue code you want to own. Marketplaces and adapters trade flexibility for speed.
Concrete example: crawling a site to feed an agent or RAG pipeline
Say you want an agent that answers questions about a documentation site.
- Input: the site's URL(s).
- Action: run a crawler. Apify's Website Content Crawler will "crawl websites and extract text content to feed AI models, LLM applications, vector databases, or RAG pipelines." It "supports rich formatting using Markdown, cleans the HTML, downloads files."
- Expected result: clean Markdown chunks you embed into a vector store.
- Then: your agent retrieves relevant chunks at query time and answers with citations.
The crawler does the messy part (HTML cleanup, formatting); the agent does the reasoning. This split is the whole point of connecting tools.
Criteria for choosing agent tools
Judge each candidate on the same dimensions:
- Data source — does it cover the site/platform you actually need? (TikTok, Google Maps, Instagram, e-commerce, Facebook are all separate tools in Apify's catalog.)
- Output format — JSON for structured logic, Markdown for LLM/RAG input.
- Scheduling & monitoring — can it run on a schedule, or only on demand?
- Integration — native support for your framework (LangChain, LlamaIndex) vs. raw API.
- Cost — check the provider's pricing page; don't assume free.
- Reliability signals — usage counts and ratings. Apify shows these per tool (e.g., Google Maps Scraper: 616K runs, 4.7 from 1,817 reviews; TikTok Scraper: 291K runs, 4.8 from 371).
Common failure points
- Auth — API keys and tokens expire or lack scope; the agent fails silently.
- Rate limits — high-volume agent loops hit caps fast; add backoff.
- Stale data — a cached result looks valid but isn't; timestamp everything.
- Unstructured output — raw HTML breaks parsing; prefer tools that clean and format.
- Silent errors — an agent may treat a failed call as an empty result. Validate responses explicitly.
Bottom line
An AI agent is a goal-driven system that plans and calls tools; a chatbot just responds. To make an agent useful, connect it to tools that supply live data and actions — via direct APIs, a marketplace like Apify, or framework adapters. Pick tools by data source, output format, scheduling, integration, and cost, and guard against auth, rate-limit, and staleness failures before you ship.
What is Structurizr and how does it use the C4 model for software architecture diagrams?
Structurizr is a "models as code" tool for visualising, documenting, and exploring software architecture. You write Structurizr DSL to define a single model of your system, and from that one model it generates multiple software architecture diagrams following the C4 model. It was created by Simon Brown, the author of the C4 model, and remains the reference implementation — which makes it the strongest choice if C4 compliance and compatibility matter to you.
How the models-as-code approach works
Instead of drawing diagrams by hand, you describe your architecture as text. The model holds the elements (people, software systems, containers, components) and the relationships between them. Views then select what to show. Because every diagram is derived from the same model, the diagrams stay consistent with each other.
The Structurizr DSL example from the site shows this directly:
workspace {
!identifiers hierarchical
model {
u = person "User"
ss = softwareSystem "Software System" {
wa = container "Web Application"
db = container "Database Schema" {
tags "Database"
}
}
u -> ss "Uses"
u -> ss.wa "Uses"
ss.wa -> ss.db "Reads from and writes to"
}
views {
systemContext ss "Diagram1" {
include *
}
container ss "Diagram2" {
include *
}
// styling...
}
}
This single set of elements and relationships produces two diagrams. Add more views and you get more diagrams without redefining the underlying architecture.
The C4 diagram types Structurizr supports
Structurizr is specifically designed to support the C4 model for visualising software architecture. The diagram types listed on the site are:
- System Landscape diagram
- System Context diagram
- Container diagram
- Component diagram
- Dynamic diagram
- Deployment diagram
Diagrams are interactive (for example, zoom in and out), animatable, embeddable, and include an automatically generated diagram key/legend.
Why model-based consistency matters
When diagrams are drawn separately, they drift apart — a box renamed in one diagram keeps its old name in another. Structurizr avoids this by enforcing the C4 model rules against a single model. Every view is a projection of the same elements and relationships, so a change in the model propagates to all diagrams that include it.
This consistency is also what makes the tool AI-friendly. AI agents and LLMs excel at generating text, and Structurizr's model-based consistency and enforcement of C4 rules make it a good fit for teams generating C4 diagrams with AI. The text-based format is easy for agents to parse, enabling use cases such as AI summaries, queries, and detecting architectural drift. The Structurizr MCP server provides DSL validation, parsing, and inspection tools to assist with creating models.
Documenting and exploring beyond the standard diagrams
- Cloud architecture themes: prebuilt themes exist for Amazon Web Services, Microsoft Azure, Google Cloud Platform, Oracle Cloud Infrastructure, and Kubernetes, so you can document cloud architecture with recognisable icons.
- Alternative visualisations: tree views and interactive force-directed graphs let you explore the architecture from other angles.
- Supplementary documentation: you can publish documentation such as a "software guidebook" alongside the diagrams.
Where to start
- Read the Structurizr DSL tutorial to learn the syntax.
- Try it to write a small model and see the generated diagrams.
- Define your own workspace: model your people, software systems, containers, and components, then add views for the diagram types you need.
If you want a single source of truth that produces consistent, interactive C4 diagrams — and you're comfortable describing architecture as code — Structurizr is built for exactly that. If your team prefers drawing tools over text, the models-as-code workflow will be the main adjustment.
Website Overview
Page metadata, canonical configuration and social previews work together to provide more consistent search and sharing presentation.
Domain and Registration
The domain was registered less than a year ago and has limited historical evidence to assess. Transfer-protection status is present, helping reduce the risk of unauthorized domain transfers. The registrar is NameCheap, Inc., a widely used domain service provider. The domain uses the common .com extension, which is not an independent safety signal.
DNS and Email
The lowest TTL is 60 seconds, supporting rapid record changes at the cost of more frequent lookups. Nameservers are provided by Namecheap, indicating managed DNS hosting. MX records point to the spacemail.com email service. SPF and DMARC are configured. DKIM status is unknown. TXT records include verification markers for Google. Such markers may also remain after a service stops being used.
TLS and Certificates
The certificate uses an RSA 2048-bit public key, offering broad client compatibility. The server supplied a complete certificate chain. No organization name is present in the certificate; the available fields are consistent with domain validation. The certificate was issued by Let's Encrypt, commonly associated with automated certificate services. The certificate's total validity is about 89 days, consistent with a short renewal cycle.
HTTP and Browser Security
X-Powered-By exposes backend information: Next.js. All six checked browser-security headers are present. Their effectiveness still depends on the policy values and application behavior. No obvious internal addresses or debug information were found in the headers. The Server header contains the custom value railway-hikari. No explicit CDN or WAF marker was found in the response headers.
Technology Stack Analysis
The public page identifies Next.js without precise versions, leaving fewer clues for version-specific scanning.
Search and Social Sharing
Twitter Card metadata is configured. JSON-LD includes Organization data, helping describe the organization as an entity. The title has 56 characters, within a common display range. A meta description is present, with 159 characters. The observed directives allow indexing and link following.
Hosting and Email
Pages, Search and Sharing
| Meta description | Free curriculum: 21 agentic AI design patterns for developers and 15 modules for product managers. Code, architecture, decisions and hands-on games. Zero hype. |
|---|---|
| Canonical URL | https://learnagenticpatterns.com |
| Language | English (default) |
| Twitter Card | summary_large_image |
Social Sharing Preview
15 fieldsrobots.txt (opens in a new tab)
40 rulesAll bots 1 allowed · 4 disallowed
//api//login/forgot-password/reset-password
gptbot 1 allowed · 4 disallowed
//api//login/forgot-password/reset-password
chatgpt-user 1 allowed · 4 disallowed
//api//login/forgot-password/reset-password
claudebot 1 allowed · 4 disallowed
//api//login/forgot-password/reset-password
perplexitybot 1 allowed · 4 disallowed
//api//login/forgot-password/reset-password
google-extended 1 allowed · 4 disallowed
//api//login/forgot-password/reset-password
applebot-extended 1 allowed · 4 disallowed
//api//login/forgot-password/reset-password
cohere-ai 1 allowed · 4 disallowed
//api//login/forgot-password/reset-password
No matching rules.
Sitemaps
1
Registration details RDAP / WHOIS
| Registrar | NameCheap, Inc. |
|---|---|
| Registered | 2026-03-02 |
| Expires | 2027-03-02 |
| Domain status | client transfer prohibited |
| Nameservers | dns1.registrar-servers.com、dns2.registrar-servers.com |
| DNSSEC | unsigned |
DNS records
| Type | Name | Value | TTL | Priority |
|---|---|---|---|---|
| A | 5ymbq46h.up.railway.app | 69.46.46.122 | 60 | — |
| MX | learnagenticpatterns.com | mx1.spacemail.com | 300 | 0 |
| MX | learnagenticpatterns.com | mx2.spacemail.com | 300 | 0 |
| NS | learnagenticpatterns.com | dns1.registrar-servers.com | 1800 | — |
| NS | learnagenticpatterns.com | dns2.registrar-servers.com | 1800 | — |
| TXT | learnagenticpatterns.com | d1eed10f-6a6a-4f0a-ba07-c5af1e10fc96 | 60 | — |
| TXT | learnagenticpatterns.com | google-site-verification=4lEQH17HaumPZdHFr3x3pS1siwGeb6sDxyAdZHDYurU | 60 | — |
| TXT | learnagenticpatterns.com | v=spf1 include:spf.spacemail.com include:amazonses.com ~all | 60 | — |
| CNAME | learnagenticpatterns.com | 5ymbq46h.up.railway.app | 60 | — |
| DMARC | _dmarc.learnagenticpatterns.com | v=DMARC1; p=none; rua=mailto:[email protected] | 300 | — |
TLS and certificates
| Assessment | Normal configuration |
|---|---|
| Supported protocols | TLSv1.2、TLSv1.3 |
| Negotiated protocol | TLSv1.3 |
| Certificate subject | learnagenticpatterns.com |
| Issuer | Let's Encrypt |
| Valid until | 2026-11-29T00:30 · Remaining when checked: 54 days |
| Verification details | Certificate trust: Passed · Hostname match: Passed |
HTTP response headers
| Header | Value |
|---|---|
| content-type | text/html; charset=utf-8 |
| cache-control | s-maxage=31536000, stale-while-revalidate |
| server | railway-hikari |
| strict-transport-security | max-age=63072000; includeSubDomains; preload |
| content-security-policy | default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.i.posthog.com https://*.posthog.com https://*.sentry.io https://accounts.google.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://accounts.google.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data: blob: https:; connect-src 'self' https://*.i.posthog.com https://*.posthog.com https://*.sentry.io https://api.resend.com https://accounts.google.com; frame-src 'self' https://accounts.google.com; frame-ancestors 'none' |
| x-frame-options | DENY |
| x-content-type-options | nosniff |
| referrer-policy | strict-origin-when-cross-origin |
| permissions-policy | camera=(), microphone=(), geolocation=() |
User reviews (0)