User manual
Jithendar.com · Moks CMS · 71 pages and 343 settings. The current version is always the one online.
Getting started
A tour of the admin
How the admin is organised and where to find things.
Moks CMS runs the whole publication from one admin: writing and publishing, search and audience data, AI drafting, comments and enquiries, site design and operations.
The sidebar groups pages by category (Overview, Content, Editorial & AI, Insights, Community, Site settings, Operations, Account). Each category expands and collapses, and the browser remembers your choice. A collapsed category still shows the total of its badges (pending reviews, unread messages, comments to moderate), so nothing that needs attention is hidden.
The Dashboard greets you with the number of items that need attention across the publication.
On a phone, the Menu button at the top shows the current page and opens the same list.
In the admin: /admin
Roles: admin, author, reader and demo
What each kind of account can see and do.
- Admin: every page, every setting.
- Author: writes and publishes their own posts, manages their author profile and API keys, and moderates comments.
- Reader: a public account for commenting; no admin access.
- Demo (read-only): sees every admin page an admin sees, with real data, but cannot save, publish, delete, send or run anything, and cannot download backups. A banner at the top of each page says so.
Admins change roles in Admin → Users. A role change or ban signs the person out straight away.
In the admin: /admin/users
Exploring with a demo account
What you can try while signed in as a read-only demo user.
A demo account shows the CMS exactly as the site owner uses it. Open any page, use filters, date ranges and search, open articles in the editor and read reports.
Anything that would change something (Save, Publish, Delete, Send, Sync, Generate, Approve) is refused with a read-only notice and nothing is stored. AI and paid external calls are never made, so exploring costs nothing.
Good places to start: Dashboard, Posts (open one in the editor), Search performance, Content audit, Review queue, Appearance & settings (look at the previews), System status and this guide's FAQ.
Using this manual
Browse the contents, search, read a guide on its own page and print the manual.
The manual's home lists every guide by category, the FAQ and the settings reference. The contents on the left (under Contents on a phone) list every guide and question; each opens on its own page, which has its own address to bookmark or share.
A guide's page shows where you are (User manual, the category, the guide), who the page is for, an On this page list, the text and its diagram, where the page is in the admin, the settings of that page with their defaults, related guides, and links to the previous and next page in reading order.
Print / Save as PDF on a guide prints that guide without the menus. Printable manual on the home opens the whole manual on one page, with a contents list, for printing or saving as a PDF.
Type in the search box to match titles, summaries, text and common synonyms (for example “publish”, “backup” or “password”); a suggestion opens that guide. Choose an area to narrow the list, or switch between Guides, FAQ and Settings.
Settings lists every setting and option of the CMS with what it does and its default value, from Appearance to the SEO agent, Advanced settings and MCP scopes.
Each article links to the admin page it describes. The address bar keeps your search and filters, so you can bookmark or share a view of the guide.
I'm a demo user. Why can't I save anything?
Demo accounts are read-only by design: you see the admin exactly as the owner does, but every save, publish, delete, send, sync and AI action is refused and nothing is stored.
Ask the site owner for an author or admin account if you need to make changes.
Is the data I see as a demo user real?
Yes. Demo accounts see the live publication's data, as an admin does. Secrets (keys, passwords, tokens) stay masked everywhere.
Why don't I see some pages in the menu?
Authors only see the pages they can use: content, comments, their profile and API keys. Editorial & AI, Insights, Site settings and Operations are for admins (and read-only demo accounts).
Can readers see this guide?
Only if an admin turns on Appearance & settings → General → Public user manual. It then appears at /user-manual for everyone, read-only and without any of your data. It is off by default.
In the admin: /admin/appearance
Content
Writing and publishing posts
Create, review, schedule and publish articles, news and projects.
Posts lists every article, news item and project with its status: draft, review, published or archived. Filter and search the list, then open a post in the editor.
A post needs a title, a slug (its address), a description used for listings and search results, a category and a content type. News and curated posts also need at least one source.
Publish from the editor's own Publish button. Editorial calendar items become published only when their linked post is published this way.
Each published post has an Insights view with its search and visitor data.
In the admin: /admin/posts
The editor
Visual and Markdown editing, blocks, images and keyboard shortcuts.
Markdown is the stored format. The visual editor is a view over it, so switching between Visual and Markdown never loses anything. If a document contains something the visual editor cannot show exactly, it opens in Markdown mode and says why.
Insert blocks with + (searchable) or by typing / in an empty paragraph. Callouts, figures, galleries, buttons, embeds (YouTube and Vimeo), video, audio, details and a table of contents are available as blocks.
- Save: Ctrl/⌘ S
- Undo / redo: Ctrl/⌘ Z / Ctrl/⌘ Shift Z
- Move a block: Alt Shift ↑ / ↓
- Duplicate a block: Ctrl/⌘ Shift D
- Delete a block: Alt Shift Backspace
Images come from the media library or are uploaded by choosing, dropping or pasting. Alt text is required. The featured image can be chosen, uploaded or generated, with a focal point.
In the admin: /admin/posts
Pages
About, contact, policies and other standalone pages.
Pages are standalone pages that are not part of a feed: About, Contact, privacy policy, terms and so on. They use the same editor as posts.
In the admin: /admin/pages
Media library
Upload images, video, audio and PDFs; see where each file is used.
Media keeps every uploaded file. Images are served in modern formats (AVIF/WebP) at the right size for each screen.
Images up to 10 MB upload through the site; video, audio and PDFs up to 200 MB upload directly to storage.
A file shows where it is used, and cannot be deleted while a post still uses it. Removing an image from a post never deletes the file.
Generate image creates a picture with AI (when it is configured in Integrations); you choose whether to keep it.
In the admin: /admin/media
Categories and tags
Organise posts by topic; fix or merge tags in one place.
Categories are the topics that organise posts. Each has its own page and RSS feed.
Tags are free-form labels. Renaming a tag (Admin → Tags) fixes it on every post; renaming it onto an existing tag merges the two.
In the admin: /admin/categories
Python practice
Problems, roles, the code runner and the AI tutor for /python-practice.
Python practice manages the interactive coding exercises on the public site: problems, engineering roles and topics, the daily challenge, the sandboxed code runner, the AI tutor and abuse signals.
A new problem is saved as a draft; quality checks and duplicate detection run on save, and you publish it once it validates. Every save creates a new version, and old submissions keep pointing at the version they were graded against.
In the admin: /admin/practice
The code runner (executor), in simple words
How readers' Python code for /python-practice is run safely, away from the website.
Readers on /python-practice can write Python and press Run. Running a stranger's code is risky, so it never runs inside the website.
- The website checks the reader is signed in and within their limits, then sends the code and only the test inputs (never the expected answers) to the executor.
- The executor puts the job in a queue. A dispatcher starts a brand-new, throw-away sandbox for each job.
- The sandbox has no internet, no passwords and no access to anything else. It uses gVisor, a protective layer between the code and the real server. Time, memory, file size and output are all capped.
- The sandbox prints the results; the dispatcher reads them and deletes the sandbox.
- The website compares the outputs with the expected answers itself, so a cheating program cannot fake a pass. Progress, XP and badges are then given exactly once.
Repeated abuse (for example endless loops) blocks the account for 15 minutes. Admins manage problems, roles, topics, the daily challenge, the AI tutor and abuse signals under Python practice.
In the admin: /admin/practice
How do I publish a post?
Open the post in Admin → Posts, fill in the required fields (title, description, category, content type; sources for news) and press Publish in the editor.
To publish later, schedule it instead. AI-drafted articles are published by approving them in the Review queue.
In the admin: /admin/posts
Can I write in Markdown?
Yes. Markdown is the stored format; switch the editor to Markdown mode at any time and back to Visual without losing anything.
In the admin: /admin/posts
Why can't I delete an image from the media library?
A file that is still used by a post cannot be deleted. The media library shows where it is used; remove it from those posts first.
In the admin: /admin/media
Is it safe to let readers run code on the site?
Their code runs in a separate, throw-away sandbox with no internet and no access to the website, its database or any passwords, and with strict time and memory limits. The website grades the results itself.
In the admin: /admin/practice
Editorial & AI
Editorial calendar
Plan articles from suggestion to publication.
Items move through Suggested → Approved → Drafting → In review → Published.
An item becomes Published only when its linked post is published with the editor's Publish button.
In the admin: /admin/calendar
Review queue
AI-drafted changes waiting for your approval.
Claude drafts improvements and new articles; they wait here for a person. Nothing goes live until you approve an article.
Approving publishes it and submits it to search engines. The sidebar badge shows how many drafts are ready.
In the admin: /admin/review
News desk
Jobs that find, rank and draft source-grounded news for review.
Jobs discover stories from trusted sources, rank them and draft news grounded in those sources. Nothing publishes without your approval.
- Sources: the feeds and official APIs the desk reads (robots.txt honoured, paywalled sites refused).
- Topics & categories: map news topics to the CMS's categories; your corrections train the classifier weekly.
- Profiles & playground: versioned writing and image styles; proposed versions need your approval.
- Run history and News analytics: every run with its cost and errors, and how published news performs.
- Settings: global spending caps on top of each job's own budget.
In the admin: /admin/news
Promotion
Where each article is worth sharing, with drafted posts.
Promotion suggests where each published article is worth sharing, drafts posts for you to edit and post yourself, and suggests new article ideas that already have an audience. Nothing is posted automatically.
In the admin: /admin/promotion
Does AI ever publish on its own?
No. AI-drafted articles and news wait in the review queues until a person approves them. Assistants connected through MCP can never approve or publish.
The one automatic change is internal linking, when its weekly job is switched on, and it works within strict limits.
How is AI spending kept under control?
The news desk has global caps on top of each job's budget, and Automation & AI shows Claude usage. AI and paid calls are always explicit actions, never triggered by just viewing a page.
SEO agent, AI & ML
Automation & AI settings
Data sources, schedules, scoring, drafting, crawler and reports for the SEO agent.
Automation & AI shows the search and analytics connections, Claude usage, ML models and Ask the Blog, then the settings by area. Every saved change is audit-logged.
- Data sources: which Google properties are read, how far back and how long data is kept; DataForSEO for search volume, difficulty, live rankings and backlinks.
- Schedules: when each job runs (UTC; weekday 0 = Sunday).
- Scoring & rules: the weights and thresholds that find and rank recommendations.
- Content & links: keyword opportunities, internal-linking limits and search-engine submission.
- AI & drafts: Claude drafting (always stops at human review), its monthly budget, the optional explanation model and AI visibility.
- Crawler: limits for the technical crawl of your own site. Reports: weekly and monthly report email.
Every field is listed with its default under Settings in this guide.
In the admin: /admin/automation
How the SEO agent works
Flows that sync data, score pages, draft fixes and wait for your approval.
The SEO agent is a separate service that runs CrewAI flows. Sync flows read Google Search Console, GA4 and (optionally) DataForSEO into the database on a schedule.
Rules and ML models turn that data into recommendations, reports and alerts, and pick articles worth improving. Drafting flows (optimize_article_flow, new_article_flow) ask Claude crews for a draft within the monthly budget and the rewrite limit.
Drafts stop at “ready for review”. Only a person approving on the site starts publish_flow, which publishes and submits to search engines. Nothing in the agent, the schedules or MCP can approve.
Start a flow by hand with Run now on the relevant page; queued runs start within about 30 seconds and appear in Data sync.
In the admin: /admin/review
The seo-agent service, in simple words
A helper program that runs next to the website and does the SEO work in the background.
The website and the seo-agent are two separate programs. The website shows pages and the admin. The seo-agent is a Python program that does the slow, background work, so the website stays fast.
- It wakes up on a timetable (for example every morning at 06:10 UTC to fetch Search Console data). Pressing Run now in the admin, or asking through MCP, starts the same job straight away.
- It fetches data from Google and DataForSEO and saves it in the same database the website uses.
- It looks at the numbers, finds pages that can do better and asks Claude to write a suggested fix.
- It saves every suggestion as a draft. It never publishes on its own.
- It also trains the ML models each week, builds reports and keeps the Ask the Blog search index up to date.
Every run is listed in Data sync with its status, what it did and any errors. If the seo-agent is down, the website keeps working; only the background jobs wait.
In the admin: /admin/sync
How CrewAI works here, in simple words
Flows are step-by-step recipes; crews are small teams of AI helpers, each with one job.
CrewAI is the open-source library the seo-agent uses to organise its AI work. Two ideas matter:
- A flow is a recipe: a fixed list of steps, such as “fetch the article → study the numbers → write a fix → check the fix → save the draft”. Most steps are ordinary code, not AI.
- A crew is a small team of AI helpers (agents). Each agent has one job, a short description of who it is, and a few tools. They work one after another, like an assembly line, and each passes its work to the next.
The crews on this site:
- Optimization crew (improving an existing article): an SEO analyst explains what is wrong from the search data, an editor writes the smallest useful change, and a technical reviewer checks every command and fact against official documentation.
- Editorial crew (a new article): a researcher collects sources, a technical writer writes the draft, a technical reviewer checks it, and an SEO editor suggests the title, description and headings.
- Report crew: one writer turns already-calculated numbers into a short summary. Every number it writes is checked against the real figures; one wrong number and the summary is thrown away.
- Promotion crew: a copywriter drafts social posts for an article, and a content strategist suggests new article ideas with evidence.
Safety rails: agents can only read (no publishing, no deleting, no code running), each has a limit on steps, time and tokens, every call counts against the monthly budget, and article text is treated as data, never as instructions. When a crew finishes, the flow checks its output and saves a draft. Only a person approving in the Review queue can publish it.
In the admin: /admin/review
How the ML is built, in simple words
Five small models, trained every Sunday, used only when they prove better than the simple rule.
Every Sunday the seo-agent runs the ML job. For each model it does the same four things: learn from your past data, test itself on data it has not seen, compare its score with the simple rule the site used before, and save the result. The website only reads the saved results; no ML runs while someone loads a page.
- Falling pages (content decay): looks at each page's daily clicks, removes the normal weekly ups and downs (and yearly seasons when there is enough history), and flags a page only when its trend has fallen steadily for three weeks and clearly more than usual. In tests it raised far fewer false alarms than the old 28-day rule.
- Topic groups (query clusters): turns each search query into numbers that capture its meaning (embeddings) and groups queries that mean the same thing. You check a sample of groupings on the Labelling page; the model is used only when it matches your answers better than simple word matching.
- Search intent: learns from intent labels Claude gave earlier (and your corrections) to tell “how to”, “what is”, comparison and other searches apart by itself, so fewer Claude calls are needed. It is used only when it is accurate enough on your spot checks.
- Priority: looks at recommendations you already carried out and how many clicks they gained, and proposes better scoring weights. Proposals are never applied automatically; you decide.
- Related articles: mixes how similar two articles are, which search queries they share and which pages readers actually visit together, and picks the best six for each article. Clicks on the related block (with consent) measure whether it works.
If a model is not better, too new or more than 14 days old, the site quietly uses the rule, and every number says which one made it.
In the admin: /admin/models
ML models
Weekly-trained models that replace a rule only when they beat it.
The SEO agent trains five models each week: content decay (seasonal trend decomposition), query clusters (embeddings and HDBSCAN), a search-intent classifier, learned recommendation priority, and related articles. No ML runs inside a web request; the site reads the stored results.
A new version becomes active only if it beats the current rule on held-out data (and, for some models, after your review). Its output counts as fresh for 14 days.
- Override auto (default): the model when an active version is fresh, otherwise the rule.
- Override rule: always the rule.
- Override model: the model whenever its output is fresh, even if it never beat the rule.
Every number on the site says where it came from: model vN, rule, rule (insufficient history) or rule (stale model output). Labels lets you review training labels; Run now trains outside the schedule.
In the admin: /admin/models
MCP access
Connect Claude or MCP Inspector to the SEO tools, choose scopes and revoke access.
Two MCP servers expose the platform to AI assistants. The admin server needs OAuth 2.1 with PKCE; the public server is read-only and serves published articles only, without sign-in. Each has a kill switch (ADMIN_MCP_ENABLED, PUBLIC_MCP_ENABLED) and the page shows whether it is on.
To connect Claude: in Claude, Settings → Connectors → Add custom connector with the admin server URL shown on the page. Claude registers itself, sends you to a consent page on this site, and then appears under Connected clients.
- seo:read: read SEO metrics, keyword opportunities, the review queue, draft diffs, audit issues, flow runs and LLM usage.
- seo:flows: start drafting, sync, audit and report flows (drafts still wait for your approval on the site).
- seo:review:reject: reject drafts and add review notes.
No scope can approve, publish, roll back or submit to search engines. Connected clients shows each client's scopes, who allowed it and when it was last used; Revoke ends its access at once.
In the admin: /admin/automation/mcp
Which AI models does the CMS use?
Claude drafts and classifies for the SEO agent (the models are set under Automation & AI → AI & drafts; empty uses the deployment's defaults). Gemini generates images when configured in Integrations. AI visibility asks the assistants you switch on.
In the admin: /admin/automation
Can I stop an ML model from being used?
Yes. Set its override to rule on the ML models page; the site then always uses the rule. auto (the default) only uses a model that beat the rule on held-out data and is less than 14 days old.
In the admin: /admin/models
How do I disconnect Claude from the admin?
Admin → MCP access → Revoke on its row. The token stops working at once. To switch the whole admin MCP server off, the operator sets ADMIN_MCP_ENABLED=false.
In the admin: /admin/automation/mcp
How much does the SEO agent spend on AI?
Drafting stops at the monthly budget in Automation & AI → AI & drafts (0 uses the deployment's ceiling, by default $15). DataForSEO and AI visibility have their own monthly caps; a run stops before a call that would cross one.
In the admin: /admin/automation
What is a “crew” and an “agent”?
An agent is one AI helper with one job (for example “editor” or “technical reviewer”). A crew is a small team of agents that work one after another on the same task. A flow is the step-by-step recipe that runs the crew and saves its draft.
Why does a number say “rule” instead of “model”?
The model was not used because it has not yet proven better than the rule, does not have enough history for that page, or its results are more than 14 days old. The rule is the safe default.
In the admin: /admin/models
What happens if the seo-agent stops?
The website keeps working. Background jobs (syncs, drafts, reports, ML) wait until it is back; Data sync and System status show the problem.
In the admin: /admin/system
Insights
Search performance
Google Search Console clicks, impressions, CTR and position.
Search performance shows Google Search Console data for a period, compared with the previous one. Change the date range and search type to explore.
Data arrives through Data sync; if numbers look stale, check the latest run there.
In the admin: /admin/search
Visitor analytics and page insights
Google Analytics 4 traffic, and every page joined with its search data.
Visitor analytics shows Google Analytics 4 data for the chosen period.
Page insights lists every page with Search Console data, joined with its GA4 landing-page sessions and the CMS article, so you can see which articles bring search visitors.
In the admin: /admin/analytics
Keywords and recommendations
Keyword opportunities and evidence-backed suggestions.
Keyword opportunities come from your Search Console data (anonymised queries are not included, so totals are partial). Search volume and keyword difficulty come from DataForSEO when it is configured. Track the keywords you care about.
Recommendations are rule-based, evidence-backed suggestions. Scores are priorities, not forecasts. Approving records your decision; nothing is changed on the site. AI explanations are labelled and should be verified.
In the admin: /admin/keywords
Content audit and technical health
Article quality scores and a weekly crawl of the public site.
Content audit lists every published article, weakest first. Hover, tap or focus a number to see the issues behind it.
Technical health is a weekly polite crawl of the public site: robots.txt, sitemaps, status codes, redirects, canonicals, titles, meta descriptions, headings, alt text, structured data, broken links, orphan pages and more.
In the admin: /admin/content-audit
Internal linking and backlinks
Links between your articles, and other sites linking to you.
Internal linking shows how articles link to each other. A weekly job can add links on its own within strict limits; other link changes are reviewed as drafts.
Backlinks lists sites linking to this one, from DataForSEO's weekly snapshot. It is DataForSEO's crawl, not Google's, so counts differ from Search Console.
In the admin: /admin/links
AI visibility
Whether AI assistants cite or mention the site, week by week.
Each week a set of prompts is asked to the enabled AI assistants with web search on. A prompt counts as cited when an answer links to the site, and mentioned when it names it.
These are API answers; the consumer apps can differ, so read them as a trend. Open a prompt to see the stored answers.
In the admin: /admin/ai-visibility
Reports
Weekly and monthly reports with CSV and printable versions.
Weekly (last full Monday–Sunday) and monthly (last full month) reports, compared with the previous period. Export as CSV, open a printable page, or download a designed PDF when one has been generated.
In the admin: /admin/reports
The search or analytics numbers look out of date. Why?
Search Console data is usually two to three days behind. Check Admin → Data sync for the latest run and its errors; queued runs start within about 30 seconds.
In the admin: /admin/sync
Why do backlink counts differ from Google Search Console?
Backlinks come from DataForSEO's own crawl, not Google's, so their counts differ. Read both as trends.
In the admin: /admin/backlinks
Community
Messages, bookings and payments
Contact-form messages, booked calls and paid sessions.
- Messages: contact-form messages and Hire me enquiries. The badge counts unread ones.
- Bookings: meetings booked through Cal.com from the Hire me page. Reschedule or cancel them in Cal.com.
- Payments: paid calls from the Hire me page (Razorpay). Refunds and settlements are handled in the Razorpay dashboard.
The Hire me page itself is configured under Appearance & settings.
In the admin: /admin/messages
Site settings
Appearance & settings
Customise the public site with drafts, previews, history and rollback.
Change the public site without code: general details, branding (logos, favicon, share image), header, navigation menus, footer, typography and colours (with live contrast ratios), the homepage sections, blog listings and the Hire me page.
Changes go into a private draft that you preview on the real pages, then publish explicitly. History lets you roll back, and settings can be exported and imported.
General settings also turn comments, reader sign-up, the contact form, the public user guide and maintenance mode on or off.
In the admin: /admin/appearance
Integrations
Social sign-in, IndexNow instant indexing and AI image generation.
Integrations connects the site to outside services. Secrets are encrypted at rest and never shown again; leave a secret field empty to keep the stored value.
- Social sign-in (Google, GitHub): register the callback URL shown on the page exactly as given with the provider, then paste the client ID and client secret. Each provider can be switched on or off.
- IndexNow: tells Bing and other IndexNow search engines about new and changed pages straight away. The key file is served by the site so search engines can confirm it belongs to you.
- Image generation (Google Gemini): the API key, the Fast image model used by default in the editor, an optional Pro model (better, slower, dearer), the default image size and the largest size authors may pick (caps cost).
Analytics, ads and search-engine verification tokens are under Advanced settings; Search Console, GA4 and DataForSEO connections are under Automation & AI.
In the admin: /admin/integrations
Storage & email
Media storage (Cloudflare R2) and outgoing email (Amazon SES).
Keys are encrypted at rest and never shown again; leave a secret field empty to keep the stored value.
- Media storage (Cloudflare R2): account ID, bucket, an access key ID and secret scoped to that bucket, an optional public media URL (a custom domain for large files) and an optional API endpoint for EU/FedRAMP buckets. A one-time tool moves existing media from S3 to R2.
- Email: choose one provider (SMTP, Mailgun or Amazon SES; there is no automatic failover), the sender name and address and an optional reply-to. SMTP needs host, port (587 STARTTLS, 465 TLS), encryption and credentials; Mailgun a sending domain, region and API key; SES a region and either the server's AWS credentials or access keys stored here. Send a test before relying on it.
Email is needed for sign-up verification, password resets and demo invitations.
In the admin: /admin/storage
Managing users
Invite demo users, add accounts with a password, change roles, ban or delete.
- Invite demo users: enter an email; the person gets a link to choose a password (valid 72 hours, Resend invite sends a new one). Needs email set up.
- Add a user with a password: create an account of any role with a password you choose. No email is sent; share the password yourself.
- Change a role in the table and press Save; the person is signed out so the new role applies at once.
- Ban signs a user out and blocks sign-in; Delete removes the account (not possible while they still own posts).
In the admin: /admin/users
Advanced settings
Lower-level options for operators.
Advanced settings holds lower-level site options. Change these only when you know what a setting does; each page section explains its options.
In the admin: /admin/advanced
How do I add a user?
Admin → Users. Either invite a demo user by email (they choose their own password), or use “Add a user with a password” to create an account of any role with a password you set and share yourself.
In the admin: /admin/users
A demo invitation link expired. What now?
Press Resend invite on that user's row in Admin → Users for a new 72-hour link, or the person can use Forgot password on the sign-in page.
In the admin: /admin/users
How do I remove someone's access?
Ban the account, delete it, or change its role in Admin → Users. Each of these signs the person out immediately.
In the admin: /admin/users
Why are emails (invitations, password resets) not arriving?
Check Admin → Storage & email: outgoing email must be configured. Then check System status for a failing email check, and ask the person to look in their spam folder.
In the admin: /admin/storage
I published an appearance change by mistake. Can I undo it?
Yes. Appearance & settings keeps a history; roll back to the previous version.
In the admin: /admin/appearance
Operations
System status and data sync
Live dependency checks, and every data import run.
System status runs live checks of every service the site depends on; reload the page to run them again.
Data sync lists every scheduled, manual and backfill run: window, status, rows written, Google API requests, retries and errors. Queued runs start within about 30 seconds.
ML models shows the models trained weekly; a model is only used when it beats its rule on held-out data.
In the admin: /admin/system
Backups
Zip backups of content and configuration.
Create zip backups of content and configuration, encrypted if you choose. Backups exclude password hashes, sessions, API-key hashes and stored credentials.
Restore replaces posts, pages, categories, comments, media records, redirects and Appearance settings with a stored backup, after saving the current state as a new backup. A post or category that is also in the backup is updated in place, so its SEO drafts, audits and news topics stay. An account the site no longer has is recreated as a reader without a password, whatever role it had in the backup: give staff their roles back in Users.
Demo accounts cannot download backups.
In the admin: /admin/backups
Database browser
Connection, table sizes, maintenance and a read-only browser.
See the database connection, table sizes and maintenance tasks, and browse tables read-only. Passwords, tokens and secret settings are always redacted.
In the admin: /admin/database
Audit log
Every change and every sign-in attempt.
Every change made from the admin or the API, and every sign-in (successful, failed, rate-limited or blocked by the bot check), with the client IP and browser. Filter it to find who changed what and when.
In the admin: /admin/audit
How do I find out who changed something?
Admin → Audit log records every change made from the admin or the API, and every sign-in, with the person, time, IP and browser.
In the admin: /admin/audit
Are passwords included in backups?
No. Backups exclude password hashes, sessions, API-key hashes and stored credentials. Choose encryption when you create one if it will leave your machine.
In the admin: /admin/backups
Something on the site is broken. Where do I look first?
Admin → System status runs live checks of every dependency. Then check Data sync for failed runs and the Audit log for recent changes.
In the admin: /admin/system
Account
Author profile
The public profile shown on your posts.
Your author profile is the public page shown on your posts (at /authors/your-slug). Create it if you do not have one, and keep the bio and links up to date.
In the admin: /admin/profile
API keys
Manage posts from scripts and automations.
Create API keys to manage posts from scripts and automations. A key acts with its owner's permissions; revoke one you no longer need. Demo accounts cannot create keys.
In the admin: /admin/api-keys
Can I manage posts from a script?
Yes. Create an API key in Admin → API keys; it acts with your permissions.
In the admin: /admin/api-keys
Settings reference
Every setting and option, what it does and its default. Defaults only: the manual never shows the values saved on a site.
General
Appearance & settings
Every Appearance change is saved as a private draft, previewed on the real pages and published explicitly; Revision history keeps every version for rollback.
| Setting | What it does | Default |
|---|---|---|
| Site name | — | — |
| Publication name | Used in news sitemaps and structured data. | — |
| Tagline | Shown on the generated share card. | — |
| Description | The default meta description and footer text (50–200 characters). | — |
| Editorial time zone | Time zone for dates across the site. | the site's time zone |
| Date format | 29 Oct 2026, Oct 29, 2026, 29 October 2026 or 2026-10-29. | 29 Oct 2026 |
| Public contact email | Shown on the contact page and, if enabled, in the footer. | — |
| Location | Shown next to the contact email. | — |
| GitHub / LinkedIn / X / YouTube / Mastodon | Social profile links (https only) used by the header, footer and author pages. | — |
| Comments | Signed-in readers can comment and reply under posts. Each post can also lock or close its discussion. | on |
| New reader comments need approval | Readers' comments appear after a moderator approves them. Authors' and admins' comments never wait. | on |
| Readers can edit their comments for | 0 means no time limit. Comments can always be deleted by their author. | 1440 min |
| Reader sign-up | New accounts by email or Google/GitHub. Existing users can always sign in. | on |
| Contact form | Shown on /contact; messages arrive in Admin → Messages. | on |
| Public user manual | Publishes this guide at /user-manual for everyone (documentation and defaults only, no site data). | off |
| Enable maintenance mode | Readers see a maintenance page instead of the site; staff can still sign in. | off |
| Message for readers | Shown on the maintenance page (up to 300 characters). | — |
| Ask crawlers to retry after | Sent to search engines as Retry-After (5–1440 minutes). | 30 min |
Branding
Appearance & settings
| Setting | What it does | Default |
|---|---|---|
| Show the site name next to the logo | — | on |
| Logo (light theme) | From the media library. | — |
| Logo (dark theme, optional) | Used when the dark theme is on; empty uses the light logo. | — |
| Logo on phones (optional) | A compact mark for narrow screens. | — |
| Favicon | — | — |
| Apple touch icon | The icon used when someone adds the site to an iPhone home screen. | — |
| Share image | Default image for links shared on social networks. | — |
Header
Appearance & settings
| Setting | What it does | Default |
|---|---|---|
| Preset | 4 starting layouts. | standard |
| Width | Page width or full width. | page width |
| Height | Compact, regular or tall. | regular |
| Navigation position | After logo, centred or right. | — |
| Logo size | Small, medium or large. | — |
| Keep the header visible while scrolling | — | on |
| Background | Page, tinted, accent or an image (with mobile crop and overlay). | — |
| Search | Show the search button. | — |
| Light/dark switch | Also controls the theme selector in the footer and mobile menu. | — |
| Account avatar and menu | When hidden, readers can still sign in at /login; consider a menu link to it. | — |
| Social profile icons | On wide screens only; profiles come from General. | — |
| Call-to-action button | A highlighted button in the header. | — |
| Button text | Up to 24 characters. | — |
| Button link | A site path like /hire-me or an https link. | — |
| Show the announcement | A bar above the header. | — |
| Text | The announcement text (up to 200 characters). | — |
| Link (optional) | Where the announcement leads. | — |
| Style | Neutral, accent or warning. | — |
| Readers can dismiss it | Remembered in their browser until the text changes. | — |
Navigation
Appearance & settings
| Setting | What it does | Default |
|---|---|---|
| Menus | Up to 8 menus; choose which one is the header menu (1–8 top-level items). | — |
| Menu items | Link to pages, topics, sections, authors or https URLs; one level of sub-items; reorder with arrow buttons or drag-and-drop; indent/outdent; open in a new tab. | — |
| Previews | Desktop and phone previews of the header menu. | — |
Footer
Appearance & settings
| Setting | What it does | Default |
|---|---|---|
| Preset | Columns, simple or centred. | — |
| Alignment | Left or centre. | — |
| Spacing | Compact, regular or spacious. | — |
| Background | Tinted, page, inverted or an image. | — |
| Heading / Links from / Menu | Up to 4 columns, each with a heading and links from a menu or the topic list. | — |
| Logo and site name | — | — |
| Description | Empty uses the site description from General. | — |
| Social profile links | — | — |
| RSS feed link | — | — |
| Contact email and location | From General → Contact. | — |
| Copyright line | {year} becomes the current year and {site} the site name. Policy links and Privacy choices are always present. | — |
Typography & colours
Appearance & settings
| Setting | What it does | Default |
|---|---|---|
| Preset | Default, Editorial, Midnight or High contrast. | — |
| Body font / Heading font | Inter, IBM Plex Sans, Source Sans 3 or Source Serif 4. | — |
| Code font | JetBrains Mono or IBM Plex Mono. | — |
| Heading weight | Semibold, bold or extra bold. | — |
| Text size | Default, larger or largest. Scales all text; form inputs never go below 16 px. | — |
| Article line height | 1.5–1.9. | — |
| Light and dark palettes | Page, cards, text, secondary, meta, borders, accent and links, with live contrast ratios. | — |
| Page width | 64–88 rem. | — |
| Article reading width | 36–50 rem; about 70 characters per line at 43 rem. | — |
| Spacing between sections | Compact, comfortable or spacious. | — |
| Corner radius | None, small, medium or large. | — |
| Buttons and inputs | Rounded, pill or square. | — |
| Default theme for new visitors | Follow device, light or dark. Readers can still switch if the switch is shown. | follow device |
Homepage
Appearance & settings
| Setting | What it does | Default |
|---|---|---|
| Sections | Introduction, latest articles, hand-picked articles, topics, projects, editorial standards, author bio, call to action and a plain-text block: add, remove, reorder, hide or duplicate. | — |
| Section content | Headings, text, links, images, layout, spacing and background; searchable pickers for articles and topics. | — |
| Author | Which author the author-bio section shows. | — |
Blog & articles
Appearance & settings
| Setting | What it does | Default |
|---|---|---|
| Layout | Grid or list. | — |
| Cards per row (wide screens) | 2 or 3. | — |
| Articles per page | 6–24. | — |
| Excerpt lines (0 hides it) | 0–4. | — |
| Cover image shape | 16:9, 3:2, 4:3, square or no cover. | — |
| Topic / Article type (News, Tutorial…) / Date / Reading time | What each listing card shows. | — |
| Reading width | Narrow, default or wide. | — |
| Body text size (desktop) | 16–19 px. | — |
| Breadcrumbs / Author in the byline / “Updated” date | What an article page shows. | — |
| Author card after the article | — | — |
| Show a table of contents | — | — |
| Only for articles with at least | 2–8 headings. | — |
| On wide screens | Table of contents in the right margin or above the article. | — |
| Related reading | Related articles under each post. | — |
| How many | 1–6 related articles. | — |
| Share links | Plain links to each network's share page: no third-party scripts. | — |
Media
Appearance & settings
| Setting | What it does | Default |
|---|---|---|
| Image corners | Square, small or medium. | — |
| Captions | Centred or left. | — |
| Gallery columns | 2, 3 or 4. | — |
| Cloudflare R2 storage | Status: uploads need storage configured (Storage & email). | — |
SEO & integrations
Appearance & settings
| Setting | What it does | Default |
|---|---|---|
| Homepage title | Up to 70 characters. | — |
| Title separator | |, ·, — or -. | — |
| Search result preview | How the homepage may look in Google. | — |
| Google Search Console verification | Status; tokens are set in Advanced settings. | — |
| Bing Webmaster Tools verification | Status; tokens are set in Advanced settings. | — |
| Google Analytics 4 | Status; loads in production only, with Consent Mode. | — |
| Google AdSense | Status and number of ad slots. | — |
| ads.txt | Whether /ads.txt is served. | — |
| Consent default | Denied everywhere until consent, or only in the EEA, UK and Switzerland. | — |
| IndexNow | Status; turned on in Integrations. | — |
| Cloudflare Turnstile | Status; without it email sign-in and forms are unavailable. | — |
| Status; without it password resets are not sent. | — | |
| Social sign-in | Which providers are enabled. | — |
| Gemini image generation | Status; configured in Integrations. | — |
Hire me
Appearance & settings
| Setting | What it does | Default |
|---|---|---|
| Show the Hire me page | Off: /hire-me is not found and every call to action is hidden. Add the page to a menu in Navigation. | — |
| Availability | Available, limited, or not taking new work (keeps the page but hides booking buttons and the article call to action). | — |
| Availability note | A short line under the availability. | — |
| Headline | — | — |
| Introduction | — | — |
| Reply time (shown under the form) | — | — |
| Currency | — | — |
| Intro call booking link | Your Cal.com (or other https) booking page. Used by “Book an intro call” and by offers without their own link. | — |
| Open Cal.com links in a pop-up on the page | Cal.com's scheduler loads only when a visitor clicks Book. | — |
| Self-hosted Cal.com address (optional) | Only if you run Cal.com yourself. Bookings reach Admin → Bookings through a webhook (Advanced settings → Cal.com bookings). | — |
| Offer paid calls | Shown only while the page is on, you are taking work, both rates are set and the Razorpay keys are saved. | — |
| Title / Summary | For the paid call and each offer. | — |
| Price per minute in India (INR) | e.g. 50 → a 30-minute call costs ₹1,500. | — |
| Price per minute elsewhere (USD) | e.g. 1.5 → a 30-minute call costs $45. | — |
| Shortest call / Longest call | 5–480 minutes. | — |
| Lengths offered in steps of | 5–120 minutes. | — |
| Booking link after payment (optional) | Empty: the intro call link. | — |
| Offer this | Show an offer (consulting, freelance, speaking, mentoring). | — |
| Price from (0 = on request) / Per | The offer's starting price and unit. | — |
| Booking link for this offer (optional) | — | — |
| Show it | The call to action under articles, with its Text. | — |
Advanced (custom CSS)
Appearance & settings
| Setting | What it does | Default |
|---|---|---|
| Apply custom CSS | Restricted CSS applied to the public site. | off |
| CSS | Validated, up to 10,000 characters. | — |
Social sign-in (Google, GitHub)
Integrations
| Setting | What it does | Default |
|---|---|---|
| Allow sign-in with Google / GitHub | Show this provider on the sign-in page. | — |
| Authorized redirect / callback URL | Read-only: register exactly this URL with the provider. | — |
| Client ID / Client secret | From the provider's developer console. The secret is stored encrypted; leave it empty to keep it. | — |
| Use environment instead | Drops the saved values and falls back to the deployment's environment variables. | — |
IndexNow
Integrations
| Setting | What it does | Default |
|---|---|---|
| Turn on IndexNow / Turn off | Submits new and changed URLs to IndexNow search engines (Bing and others) in production. | off |
| Key file / New key | Served by the site so search engines can confirm the key belongs to it; New key replaces it. | — |
| Submit all pages now | Sends every public URL once, for example after turning it on. | — |
Image generation (Google Gemini)
Integrations
| Setting | What it does | Default |
|---|---|---|
| API key | Starts with AIza…; stored encrypted. | — |
| Image model (Fast) | Model code from ai.google.dev; the default in the editor. | — |
| Pro model (optional) | Higher quality, slower and dearer. Empty offers only Fast. | — |
| Default image size | Preselected in the editor. Larger sizes cost more and take longer. | — |
| Largest size authors may pick | Caps cost. Default: the larger of the default size and 2K. | — |
Media storage (Cloudflare R2)
Storage & email
| Setting | What it does | Default |
|---|---|---|
| Account ID | Cloudflare dashboard → R2 → Account details (32 characters). | — |
| Bucket / Access key ID / Secret access key | An R2 API token scoped to this bucket (Object Read & Write). Leave the secret empty to keep it. | — |
| Public media URL (optional) | A custom domain connected to the bucket; empty serves everything through the site. | — |
| API endpoint override (optional) | Only for an EU/FedRAMP jurisdiction bucket. | — |
Storage & email
| Setting | What it does | Default |
|---|---|---|
| Email provider | SMTP, Mailgun or Amazon SES. Only the selected provider sends; the others' settings are kept; no automatic failover. | — |
| Sender name / Sender email / Reply-to address | — | — |
| SMTP: Host / Port / Encryption / Username / Password | 587 with STARTTLS or 465 with TLS from the start. | — |
| Mailgun: Sending domain / API region / API key | The verified domain (e.g. mg.example.com), US or EU region, and a sending key for that domain. | — |
| Amazon SES: AWS region / Authentication | Where the identity is verified; the server's AWS credentials (role / environment) or access keys stored here (limited to ses:SendEmail). | — |
| Access key ID / Secret access key / Session token | Only with stored access keys; the session token only for temporary credentials. | — |
| Send the test to | Sends a test message with the saved settings to this address. | — |
Data sources: Google properties
Automation & AI
Which Google properties are read, how far back, and how long data is kept; DataForSEO for volume, difficulty, live rankings and backlinks.
| Setting | What it does | Default |
|---|---|---|
| Gsc Propertygoogle.gscProperty | sc-domain:example.com for a domain property, or the URL-prefix form with a trailing slash. Empty = SEO_GSC_PROPERTY. | empty |
| Ga4 Property Idgoogle.ga4PropertyId | Numeric GA4 property id (Admin → Property details). Empty = SEO_GA4_PROPERTY_ID. | empty |
| Search Typesgoogle.searchTypes | — | web |
| Url Inspection › Enabledgoogle.urlInspection.enabled | — | off |
| Url Inspection › Daily Limitgoogle.urlInspection.dailyLimit | Google allows 2,000 inspections per property per day; keep well below. | 200 |
| Page Speed › Enabledgoogle.pageSpeed.enabled | Needs PAGESPEED_API_KEY in the site's Secret for field (CrUX) data at a useful quota. | off |
Data sources: Sync and retention
Automation & AI
Which Google properties are read, how far back, and how long data is kept; DataForSEO for volume, difficulty, live rankings and backlinks.
| Setting | What it does | Default |
|---|---|---|
| Trailing Dayssync.trailingDays | Recent days re-fetched on every sync: Search Console revises its last ~3 days. | 4 |
| Retention Monthssync.retentionMonths | Daily rows older than this are deleted. Year-over-year decay checks need at least 13. | 16 |
| Stale After Hourssync.staleAfterHours | After this long without a good sync, pages show “stale” and SeoDataStale fires. | 48 |
| Max Requests Per Runsync.maxRequestsPerRun | Hard cap on Google API calls per sync run. | 400 |
| Row Limitsync.rowLimit | — | 25000 |
Data sources: DataForSEO (pay as you go; credentials DATAFORSEO_LOGIN / DATAFORSEO_PASSWORD in the site's Secret)
Automation & AI
Which Google properties are read, how far back, and how long data is kept; DataForSEO for volume, difficulty, live rankings and backlinks.
| Setting | What it does | Default |
|---|---|---|
| Enableddataforseo.enabled | Master switch. Nothing is bought while off or while the credentials are missing. | off |
| Location Codedataforseo.locationCode | Market for volume and rankings: 2840 United States, 2356 India, 2826 United Kingdom, 2276 Germany. | 2840 |
| Language Codedataforseo.languageCode | — | en |
| Monthly Budget Usddataforseo.monthlyBudgetUsd | Hard cap per calendar month (UTC), counted from the cost DataForSEO returns. 0 = buy nothing. | 5 |
| Keyword Metrics › Enableddataforseo.keywordMetrics.enabled | — | on |
| Keyword Metrics › Max Keywordsdataforseo.keywordMetrics.maxKeywords | Top Search Console queries by impressions (tracked keywords always included) that get volume and difficulty. | 1000 |
| Keyword Metrics › Refresh Daysdataforseo.keywordMetrics.refreshDays | A query's metrics are bought again only after this many days. | 30 |
| Rank Tracking › Enableddataforseo.rankTracking.enabled | — | on |
| Rank Tracking › Weekdaydataforseo.rankTracking.weekday | — | 3 |
| Rank Tracking › Hour Utcdataforseo.rankTracking.hourUtc | — | 5 |
| Rank Tracking › Depthdataforseo.rankTracking.depth | Results checked per tracked keyword; billed per 10. A keyword below this depth shows as not ranking. | 30 |
| Backlinks › Enableddataforseo.backlinks.enabled | The Backlinks API has its own DataForSEO subscription; switch on only once it is active. | off |
| Backlinks › Weekdaydataforseo.backlinks.weekday | — | 0 |
| Backlinks › Hour Utcdataforseo.backlinks.hourUtc | — | 5 |
Schedules: Schedules (UTC; weekday 0 = Sunday)
Automation & AI
When the web worker runs each job (UTC). With SEO_ORCHESTRATOR=crewai the agent's CronJobs own the flow jobs instead.
| Setting | What it does | Default |
|---|---|---|
| Gsc Daily › Enabledschedules.gscDaily.enabled | — | on |
| Gsc Daily › Hour Utcschedules.gscDaily.hourUtc | — | 6 |
| Ga4 Daily › Enabledschedules.ga4Daily.enabled | — | on |
| Ga4 Daily › Hour Utcschedules.ga4Daily.hourUtc | — | 6 |
| Technical Weekly › Enabledschedules.technicalWeekly.enabled | — | on |
| Technical Weekly › Weekdayschedules.technicalWeekly.weekday | — | 1 |
| Technical Weekly › Hour Utcschedules.technicalWeekly.hourUtc | — | 3 |
| Recommendations Weekly › Enabledschedules.recommendationsWeekly.enabled | — | on |
| Recommendations Weekly › Weekdayschedules.recommendationsWeekly.weekday | — | 1 |
| Recommendations Weekly › Hour Utcschedules.recommendationsWeekly.hourUtc | — | 7 |
| Reports Weekly › Enabledschedules.reportsWeekly.enabled | — | on |
| Reports Weekly › Weekdayschedules.reportsWeekly.weekday | — | 1 |
| Reports Weekly › Hour Utcschedules.reportsWeekly.hourUtc | — | 8 |
| Reports Monthly › Enabledschedules.reportsMonthly.enabled | — | on |
| Reports Monthly › Day Of Monthschedules.reportsMonthly.dayOfMonth | — | 2 |
| Reports Monthly › Hour Utcschedules.reportsMonthly.hourUtc | — | 8 |
Scoring & rules: Scoring weights (relative; renormalised when an input is missing)
Automation & AI
How recommendations are found and ranked (docs/seo/SCORING.md).
| Setting | What it does | Default |
|---|---|---|
| Search Opportunityweights.searchOpportunity | Demand involved (impressions, log-scaled). | 30 |
| Ranking Opportunityweights.rankingOpportunity | How close the page is to a better result. | 20 |
| Relevanceweights.relevance | How directly the site's own content is concerned. | 20 |
| Quality Gapweights.qualityGap | How far the current state is from good. | 15 |
| Trendweights.trend | Size of a decline (decay). | 10 |
| Effortweights.effort | Ease of the fix: cheap fixes score higher. | 5 |
Scoring & rules: Rule thresholds
Automation & AI
How recommendations are found and ranked (docs/seo/SCORING.md).
| Setting | What it does | Default |
|---|---|---|
| Low Ctr Min Impressionsthresholds.lowCtrMinImpressions | A query needs at least this many impressions (28 days) before a low CTR counts. | 200 |
| Low Ctr Ratiothresholds.lowCtrRatio | Flag when CTR < expected CTR for the position × this ratio. | 0.6 |
| Striking Min Impressionsthresholds.strikingMinImpressions | — | 100 |
| Striking Position Minthresholds.strikingPositionMin | Striking-distance band: lowest average position. | 5 |
| Striking Position Maxthresholds.strikingPositionMax | Striking-distance band: highest average position. | 20 |
| Decay Min Clicksthresholds.decayMinClicks | Pages need at least this many clicks in the earlier window to be checked for decay. | 20 |
| Decay Drop Ratiothresholds.decayDropRatio | A click drop of this share (0.3 = 30 %) counts as decay. | 0.3 |
| Gap Min Impressionsthresholds.gapMinImpressions | Minimum demand for a content-gap recommendation. | 50 |
| Max Links Per Pagethresholds.maxLinksPerPage | Internal-link suggestions per article. | 5 |
| Band Highthresholds.bandHigh | Score at or above this is “high”. | 0.66 |
| Band Mediumthresholds.bandMedium | Score at or above this is “medium”. | 0.4 |
| Brand Termsthresholds.brandTerms | Queries containing these are excluded from low-CTR and gap rules. | jithendar |
Content & links: Internal linking limits (conservative by default)
Automation & AI
Keyword opportunities, internal-linking limits and search-engine submission.
| Setting | What it does | Default |
|---|---|---|
| Enabledlinks.enabled | — | on |
| Max New Per Draftlinks.maxNewPerDraft | — | 3 |
| Words Per Linklinks.wordsPerLink | — | 250 |
| Min Words Betweenlinks.minWordsBetween | — | 100 |
| Max Inbound Per Target Per Runlinks.maxInboundPerTargetPerRun | — | 5 |
| Min Relevancelinks.minRelevance | — | 0.12 |
| Anchor Min Wordslinks.anchorMinWords | — | 2 |
| Anchor Max Wordslinks.anchorMaxWords | — | 6 |
| Auto › Enabledlinks.auto.enabled | — | on |
| Auto › Weekdaylinks.auto.weekday | — | 2 |
| Auto › Hour Utclinks.auto.hourUtc | — | 9 |
| Auto › Max Articles Per Runlinks.auto.maxArticlesPerRun | — | 5 |
| Auto › Max External Per Articlelinks.auto.maxExternalPerArticle | — | 2 |
| Auto › Cooldown Dayslinks.auto.cooldownDays | — | 30 |
| Check › Enabledlinks.check.enabled | — | on |
| Check › Weekdaylinks.check.weekday | — | 3 |
| Check › Hour Utclinks.check.hourUtc | — | 4 |
| Check › Max External Per Runlinks.check.maxExternalPerRun | — | 400 |
| Check › Recheck Dayslinks.check.recheckDays | — | 7 |
Content & links: Search-engine submission (kill switch: SEO_SUBMISSION_ENABLED)
Automation & AI
Keyword opportunities, internal-linking limits and search-engine submission.
| Setting | What it does | Default |
|---|---|---|
| Index Nowsubmission.indexNow | — | on |
| Google Sitemapsubmission.googleSitemap | — | on |
| Url Inspectionsubmission.urlInspection | — | on |
| Inspection Delay Hourssubmission.inspectionDelayHours | — | 60 |
Content & links: Keyword opportunities
Automation & AI
Keyword opportunities, internal-linking limits and search-engine submission.
| Setting | What it does | Default |
|---|---|---|
| Brand Regexkeywords.brandRegex | — | jithendar |
| Rising Min Growthkeywords.risingMinGrowth | — | 0.5 |
| Declining Positionskeywords.decliningPositions | — | 3 |
| Tracked Alert Positionskeywords.trackedAlertPositions | — | 3 |
| Classify With Llmkeywords.classifyWithLlm | — | on |
| Cluster Similaritykeywords.clusterSimilarity | — | 0.5 |
AI & drafts: LLM enrichment (optional; off by default)
Automation & AI
Claude drafting (always stops at human review), the optional explanation model, and AI visibility (are AI assistants citing the site?).
| Setting | What it does | Default |
|---|---|---|
| Enabledllm.enabled | — | off |
| Providerllm.provider | — | openai |
| Modelllm.model | — | empty |
| Base Urlllm.baseUrl | Only for OpenAI-compatible endpoints (e.g. Ollama in the cluster). | empty |
| Regionllm.region | — | us-east-1 |
| Timeout Msllm.timeoutMs | — | 30000 |
| Max Output Tokensllm.maxOutputTokens | — | 900 |
| Daily Request Limitllm.dailyRequestLimit | Requests per day for the optional explanation model; 0 = none. | 100 |
AI & drafts: Claude drafts (automation stops at “ready for review”; empty models/budget = environment defaults)
Automation & AI
Claude drafting (always stops at human review), the optional explanation model, and AI visibility (are AI assistants citing the site?).
| Setting | What it does | Default |
|---|---|---|
| Enableddrafts.enabled | — | on |
| Draft Modeldrafts.draftModel | — | empty |
| Classify Modeldrafts.classifyModel | — | empty |
| Monthly Budget Usddrafts.monthlyBudgetUsd | 0 = SEO_LLM_MONTHLY_BUDGET_USD (default $15). The environment value is a ceiling this cannot raise. | 0 |
| Effortdrafts.effort | — | medium |
| Max Output Tokensdrafts.maxOutputTokens | — | 16000 |
| Max Rewrite Ratiodrafts.maxRewriteRatio | A draft may change at most this share of the article's text. | 0.25 |
| Auto Eligible › Title metadrafts.autoEligible.title_meta | — | on |
| Auto Eligible › Striking expansiondrafts.autoEligible.striking_expansion | — | on |
| Auto Eligible › Freshnessdrafts.autoEligible.freshness | — | on |
| Auto Eligible › Internal linksdrafts.autoEligible.internal_links | — | on |
| Auto Eligible › Alt textdrafts.autoEligible.alt_text | — | on |
| Auto Eligible › Faq headingsdrafts.autoEligible.faq_headings | — | on |
| Auto Eligible › New articledrafts.autoEligible.new_article | — | off |
| News › Enableddrafts.news.enabled | — | on |
| News › Categoriesdrafts.news.categories | — | title_meta, alt_text, internal_links |
| Weekly › Enableddrafts.weekly.enabled | — | on |
| Weekly › Weekdaydrafts.weekly.weekday | — | 2 |
| Weekly › Hour Utcdrafts.weekly.hourUtc | — | 4 |
| Weekly › Max Articlesdrafts.weekly.maxArticles | — | 20 |
| Digest › Enableddrafts.digest.enabled | — | on |
| Digest › Weekdaydrafts.digest.weekday | — | 6 |
| Digest › Hour Utcdrafts.digest.hourUtc | — | 5 |
| Digest › Recipientsdrafts.digest.recipients | — | none |
AI & drafts: AI visibility (weekly prompts to AI assistants with web search; API keys only in the site's Secret)
Automation & AI
Claude drafting (always stops at human review), the optional explanation model, and AI visibility (are AI assistants citing the site?).
| Setting | What it does | Default |
|---|---|---|
| EnabledaiVisibility.enabled | Master switch for the weekly run. Each assistant also needs its switch below and its API key. | off |
| WeekdayaiVisibility.weekday | — | 4 |
| Hour UtcaiVisibility.hourUtc | — | 6 |
| Max PromptsaiVisibility.maxPrompts | — | 25 |
| Monthly Budget UsdaiVisibility.monthlyBudgetUsd | Hard cap per calendar month (UTC) across all assistants; the run stops before a call that would cross it. | 10 |
| Cost Per Answer UsdaiVisibility.costPerAnswerUsd | ChatGPT, Perplexity and Gemini do not return a price: each answer is counted at this estimate. Set it from their pricing. | 0.03 |
| Brand NamesaiVisibility.brandNames | Names that count as a mention besides the site name and host, e.g. the author's name. | none |
| Providers › ClaudeaiVisibility.providers.claude | — | on |
| Providers › ChatgptaiVisibility.providers.chatgpt | — | off |
| Providers › PerplexityaiVisibility.providers.perplexity | — | off |
| Providers › GeminiaiVisibility.providers.gemini | — | off |
| Providers › Google ai overviewaiVisibility.providers.google_ai_overview | The AI Overview on Google's results page, read through DataForSEO (needs its credentials; billed by DataForSEO, counted here). | off |
| Models › ClaudeaiVisibility.models.claude | Anthropic model id (web search needs a current model). | claude-opus-5-5 |
| Models › ChatgptaiVisibility.models.chatgpt | OpenAI model id with web search support; required to switch ChatGPT on. | empty |
| Models › PerplexityaiVisibility.models.perplexity | Perplexity Sonar model id (sonar, sonar-pro). | sonar |
| Models › GeminiaiVisibility.models.gemini | Gemini model id with Google Search grounding; required to switch Gemini on. | empty |
Crawler: Technical crawler
Automation & AI
Limits for the technical SEO crawl of this site.
| Setting | What it does | Default |
|---|---|---|
| Requests Per Secondcrawler.requestsPerSecond | Politeness limit against your own site. | 1 |
| Max Pagescrawler.maxPages | — | 500 |
| Timeout Mscrawler.timeoutMs | — | 10000 |
| Max Bytescrawler.maxBytes | — | 2000000 |
| Max Redirectscrawler.maxRedirects | — | 5 |
Reports: Reports (email only after recipients are set and email is enabled)
Automation & AI
Weekly and monthly report e-mail.
| Setting | What it does | Default |
|---|---|---|
| Email Enabledreports.emailEnabled | — | off |
| Recipientsreports.recipients | — | none |
MCP servers and scopes
MCP access
No scope can approve, publish, roll back or submit to search engines.
| Setting | What it does | Default |
|---|---|---|
| Admin server | OAuth 2.1 with PKCE; switch ADMIN_MCP_ENABLED. | off |
| Public server | Read-only, published articles only, no sign-in; switch PUBLIC_MCP_ENABLED. | off |
| Scope seo:readseo:read | Read SEO metrics, keyword opportunities, the review queue, draft diffs, audit issues, flow runs and LLM usage | — |
| Scope seo:flowsseo:flows | Start drafting, sync, audit and report flows (drafts still wait for your approval on the site) | — |
| Scope seo:review:rejectseo:review:reject | Reject drafts and add review notes | — |
| Connected clients | Each client with its scopes, who allowed it, when it was last used and its status; Revoke ends its access at once. | — |
Search engine verification
Advanced settings
Proves ownership of jithendar.com in Google Search Console and Bing Webmaster Tools (rendered as <meta> tags). Several tokens: separate with commas. An empty field uses the deployment's environment variable of the same name.
| Setting | What it does | Default |
|---|---|---|
| Google Search Console tokenGOOGLE_SITE_VERIFICATION | — | from the environment |
| Bing Webmaster tokenBING_SITE_VERIFICATION | — | from the environment |
Analytics, ads and consent
Advanced settings
Google Analytics 4 and AdSense load only in production, only on public pages, and only after consent where the law requires it. An empty field uses the deployment's environment variable of the same name.
| Setting | What it does | Default |
|---|---|---|
| GA4 measurement IDGA4_MEASUREMENT_ID | — | from the environment |
| AdSense publisher IDADSENSE_CLIENT_ID | Empty: ca-pub-2479369059565142 (jithendar.com's account). "off" disables ads. | from the environment |
| Ad slot: end of articleADSENSE_SLOT_ARTICLE_END | — | from the environment |
| Ad slot: listingsADSENSE_SLOT_LISTING | — | from the environment |
| Show Google test ads outside productionADSENSE_TEST_MODE | — | off |
| Consent defaultCONSENT_DEFAULT | Options: Regional: ask in EEA, UK and Switzerland; allowed elsewhere, Strict: ask everyone before analytics or ads. | from the environment |
| ads.txtADS_TXT | Exactly the line(s) your AdSense account gives you; served at /ads.txt. Empty: /ads.txt returns 404. | from the environment |
Human verification (Cloudflare Turnstile)
Advanced settings
Protects sign-in, sign-up, comments and the contact form. Cloudflare dashboard → Turnstile → your widget. Wrong keys block sign-in: test in a private window after saving. An empty field uses the deployment's environment variable of the same name.
| Setting | What it does | Default |
|---|---|---|
| Site keyTURNSTILE_SITE_KEY | — | from the environment |
| Secret keyTURNSTILE_SECRET_KEY | Secret: encrypted, never shown again. | from the environment |
Cal.com bookings
Advanced settings
Bookings, reschedules and cancellations from Cal.com appear in Admin → Bookings. In Cal.com: Settings → Developer → Webhooks → New: subscriber URL https://jithendar.com/api/cal/webhook, events Booking created, rescheduled, cancelled, requested and rejected, and a secret. Paste the same secret here; requests without a valid signature are refused. An empty field uses the deployment's environment variable of the same name.
| Setting | What it does | Default |
|---|---|---|
| Webhook secretCAL_WEBHOOK_SECRET | At least 16 characters; any printable characters without spaces. Secret: encrypted, never shown again. | from the environment |
Razorpay payments (paid calls)
Advanced settings
Paid calls on /hire-me (Admin → Appearance → Hire me → Paid calls). Razorpay Dashboard → Account & Settings → API keys: Key ID and Key secret (use rzp_test_ keys first). Then Webhooks → Add: URL https://jithendar.com/api/razorpay/webhook, events payment.captured, payment.failed and order.paid, and a secret; paste the same secret here. Payments in USD need International payments enabled on the Razorpay account. An empty field uses the deployment's environment variable of the same name.
| Setting | What it does | Default |
|---|---|---|
| Key IDRAZORPAY_KEY_ID | Public: sent to the visitor's browser to open Checkout. | from the environment |
| Key secretRAZORPAY_KEY_SECRET | Secret: encrypted, never shown again. | from the environment |
| Webhook secretRAZORPAY_WEBHOOK_SECRET | At least 12 printable characters, no spaces. Secret: encrypted, never shown again. | from the environment |
Image generation limits
Advanced settings
Caps on Gemini usage (each image costs money). The key and model are in Integrations. An empty field uses the deployment's environment variable of the same name.
| Setting | What it does | Default |
|---|---|---|
| Images per author per hourGEMINI_IMAGE_USER_HOURLY_LIMIT | — | from the environment |
| Images per day (whole site)GEMINI_IMAGE_DAILY_LIMIT | — | from the environment |
| Parallel generations per authorGEMINI_IMAGE_USER_CONCURRENCY | — | from the environment |
| Timeout (milliseconds)GEMINI_IMAGE_TIMEOUT_MS | — | from the environment |
Video generation
Advanced settings
Short AI clips for articles (editor → Generate → Video), made with a Veo model through the Gemini API using the Gemini key from Integrations. Off until a model is set. Each clip costs far more than an image, so the limits are low. An empty field uses the deployment's environment variable of the same name.
| Setting | What it does | Default |
|---|---|---|
| Video modelGEMINI_VIDEO_MODEL | The model code from ai.google.dev (Veo). Empty turns video generation off. | from the environment |
| Resolution (optional)GEMINI_VIDEO_RESOLUTION | Sent only when set; not every model accepts every value. | from the environment |
| Clip length in seconds (optional)GEMINI_VIDEO_SECONDS | — | from the environment |
| Videos per author per hourGEMINI_VIDEO_USER_HOURLY_LIMIT | — | from the environment |
| Videos per day (whole site)GEMINI_VIDEO_DAILY_LIMIT | — | from the environment |
| Give up after (milliseconds)GEMINI_VIDEO_TIMEOUT_MS | — | from the environment |
Members-only articles
Advanced settings
A post marked “Members only” in the editor shows signed-out readers the first part of the article and a prompt to sign in or create an account. This is how much they see by default; a single post can set its own percentage in the editor. An empty field uses the deployment's environment variable of the same name.
| Setting | What it does | Default |
|---|---|---|
| Public preview (% of the article)MEMBERS_PREVIEW_PERCENT | The cut is made between paragraphs, so the real share is the nearest whole block at or above this. | from the environment |
Video destinations
Advanced settings
Where a generated video can go when an author inserts it. The editor offers only destinations that are switched on here and fully filled in. This site's own media library (R2) plays the file directly; Cloudflare Stream, Mux and Bunny Stream encode it for adaptive streaming and the article embeds their player (the video then lives in that service's account, not in Admin → Media). An empty field uses the deployment's environment variable of the same name.
| Setting | What it does | Default |
|---|---|---|
| Turn OFF this site's own media library (R2) as a destinationVIDEO_DEST_R2_DISABLED | It is on unless this is ticked. | off |
| Cloudflare StreamCF_STREAM_ENABLED | — | off |
| Cloudflare account IDCF_STREAM_ACCOUNT_ID | — | from the environment |
| Cloudflare API tokenCF_STREAM_API_TOKEN | A token with the Stream: Edit permission only. Secret: encrypted, never shown again. | from the environment |
| Stream customer codeCF_STREAM_CUSTOMER_CODE | Shown in any Stream embed code in the Cloudflare dashboard. | from the environment |
| MuxMUX_ENABLED | — | off |
| Mux token IDMUX_TOKEN_ID | — | from the environment |
| Mux token secretMUX_TOKEN_SECRET | An access token with Mux Video read and write. Secret: encrypted, never shown again. | from the environment |
| Bunny StreamBUNNY_STREAM_ENABLED | — | off |
| Bunny video library IDBUNNY_STREAM_LIBRARY_ID | — | from the environment |
| Bunny library API keyBUNNY_STREAM_API_KEY | The Stream library's own key (Stream → library → API), not the account key. Secret: encrypted, never shown again. | from the environment |
Profile pictures
Advanced settings
Limits for pictures readers upload on their account page (always re-encoded to 512 px WebP). An empty field uses the deployment's environment variable of the same name.
| Setting | What it does | Default |
|---|---|---|
| Largest upload (bytes)AVATAR_MAX_BYTES | 2097152 = 2 MB | from the environment |
| Largest side (px)AVATAR_MAX_DIMENSION | — | from the environment |
| Smallest side (px)AVATAR_MIN_DIMENSION | — | from the environment |
Moderating comments
Review new and reported comments; open, lock or close discussions.
Comments shows new and reported comments for review, and lets you open, lock or close the discussion on each post. The sidebar badge counts what is waiting.
Every decision is recorded in the audit log. Comment text is shown as plain text, so nothing in a comment runs in the admin.
In the admin: /admin/comments