Adapted from docs/admin/IndexingSupport.md in the Wikantik repository; current as of release 2.4.56.
This reference is for operators and integrators who feed wiki content to search-engine crawlers, RAG ingestion pipelines, or other non-SPA consumers. It describes the endpoints and filters that expose raw and server-rendered content, and how to call them.
wiki.wikantik.com is a React SPA backed by Apache Tomcat 11. Without server-side rendering or raw-content endpoints, page URLs returned the SPA shell regardless of crawler intent, which blocked:
GET /wiki/{slug}?format={md|json}Implemented by com.wikantik.rest.WikiPageFormatFilter (web.xml-mapped on /wiki/*, declared before SpaRoutingFilter).
format value | Response Content-Type | Response body |
|---|---|---|
md | text/markdown; charset=UTF-8 | Page body as Markdown, H1 at top |
json | application/json; charset=UTF-8 | JSON object (see schema below) |
| (absent or other) | passed through to SpaRoutingFilter | Normal SPA shell (unchanged) |
JSON schema (?format=json):
{
"slug": "LinuxSystemAdministration",
"title": "Linux System Administration",
"content": "# Linux System Administration\n\nFull page body in Markdown...",
"summary": "First paragraph or frontmatter summary, max 300 chars",
"tags": ["linux", "sysadmin"],
"created_at": "2025-11-14T09:23:00Z",
"modified_at": "2026-04-02T14:05:00Z"
}
Markdown output:
wikantik.baseURL.Behaviour that applies to both formats:
404.X-Robots-Tag: noindex and a Link: <.../wiki/{slug}>; rel="canonical" header, so the raw representations do not compete with the HTML page in search results.wikantik.page.views metric.GET /api/changes?since={ISO8601_datetime}Implemented by com.wikantik.rest.ChangesResource (under /api/, same auth and ACL rules as other REST resources).
An invalid since value returns 400. Response (application/json):
{
"since": "2026-04-01T00:00:00Z",
"generated_at": "2026-04-11T12:00:00Z",
"pages": [
{
"slug": "LinuxSystemAdministration",
"modified_at": "2026-04-02T14:05:00Z",
"url": "https://wiki.wikantik.com/wiki/LinuxSystemAdministration"
}
]
}
If since is omitted, the feed lists every page the page manager reports as changed (full-export mode). since is null in that response.
Implemented via com.wikantik.ui.SemanticHeadRenderer and com.wikantik.rest.SpaRoutingFilter. Every /wiki/{slug} request, whatever its Accept header, is served the SPA shell with a server-rendered head and body, so crawlers that send Accept: */* or no header still get content:
<title>, <meta name="description">, <link rel="canonical">og:title, og:description, og:url, og:type)Article, or another type derived from the page type)#rootOther SPA routes (/search, /admin/*, /edit/* and so on) share URL space with JSON APIs, so SpaRoutingFilter forwards them to the shell only when the request's Accept header contains text/html.
Implemented by com.wikantik.ui.SitemapServlet at /sitemap.xml:
<lastmod> reflects actual page modification time (not deploy time)robots.txt (wikantik-war/src/main/webapp/robots.txt)See docs/archive/Sitemap.md and docs/archive/SitemapOptimization.md for tuning details, and SEO and Crawling for the robots.txt, sitemap base-URL and Search Console setup.
The sync script consumes these endpoints as follows:
1. GET /sitemap.xml
→ Parse all <loc> and <lastmod> values
2. Compare lastmod values against previously indexed timestamps
→ Identify new or changed pages
3. For each changed page:
GET /wiki/{slug}?format=json
→ Extract title + content
→ Upsert into OpenWebUI knowledge base
4. Periodically:
GET /api/changes?since={last_run_timestamp}
→ Faster than full sitemap diff
The sync script itself lives in the OpenWebUI host repo; it calls Wikantik's /wiki/{slug}?format=json and /api/changes endpoints and pushes into OpenWebUI's /api/v1/knowledge/ and /api/rag/process/file.
/knowledge-mcp MCP server (hybrid retrieval + knowledge graph) over GET /wiki/{slug}?format=*, which is optimised for bulk ingestion rather than per-query retrieval. The /api/pages/for-agent/{canonical_id} projection (implemented in com.wikantik.rest.PageForAgentResource) serves a token-efficient, agent-grade view of a single page — see AgentGradeContentDesign./api/changes can consume /api/structure/* — implemented in com.wikantik.rest.StructureResource. See StructuralSpineDesign.docs/archive/Sitemap.md. The Atom feed is served by com.wikantik.content.AtomFeedServlet and provides a time-ordered entry stream for feed readers and incremental ingestion pipelines.Cluster Hub: Wikantik Platform Development Hub: Architecture, MCP Protocols, and Agent Briefings (wikantik-development)