User manual
How the Moks CMS behind this site works: guides with diagrams, frequently asked questions and every setting explained.
ContentsShow or hide
42 guides, 29 questions, 343 settings
Guides
Getting started
- A tour of the adminHow the admin is organised and where to find things.Read the guide →
- Roles: admin, author, reader and demoWhat each kind of account can see and do.Read the guide →
- Exploring with a demo accountWhat you can try while signed in as a read-only demo user.Read the guide →
- Using this manualBrowse the contents, search, read a guide on its own page and print the manual.Read the guide →
Content
- Writing and publishing postsCreate, review, schedule and publish articles, news and projects.Read the guide →
- The editorVisual and Markdown editing, blocks, images and keyboard shortcuts.Read the guide →
- PagesAbout, contact, policies and other standalone pages.Read the guide →
- Media libraryUpload images, video, audio and PDFs; see where each file is used.Read the guide →
- Categories and tagsOrganise posts by topic; fix or merge tags in one place.Read the guide →
- Python practiceProblems, roles, the code runner and the AI tutor for /python-practice.Read the guide →
- The code runner (executor), in simple wordsHow readers' Python code for /python-practice is run safely, away from the website.Read the guide →
Editorial & AI
- Editorial calendarPlan articles from suggestion to publication.Read the guide →
- Review queueAI-drafted changes waiting for your approval.Read the guide →
- News deskJobs that find, rank and draft source-grounded news for review.Read the guide →
- PromotionWhere each article is worth sharing, with drafted posts.Read the guide →
SEO agent, AI & ML
- Automation & AI settingsData sources, schedules, scoring, drafting, crawler and reports for the SEO agent.Read the guide →
- How the SEO agent worksFlows that sync data, score pages, draft fixes and wait for your approval.Read the guide →
- The seo-agent service, in simple wordsA helper program that runs next to the website and does the SEO work in the background.Read the guide →
- How CrewAI works here, in simple wordsFlows are step-by-step recipes; crews are small teams of AI helpers, each with one job.Read the guide →
- How the ML is built, in simple wordsFive small models, trained every Sunday, used only when they prove better than the simple rule.Read the guide →
- ML modelsWeekly-trained models that replace a rule only when they beat it.Read the guide →
- MCP accessConnect Claude or MCP Inspector to the SEO tools, choose scopes and revoke access.Read the guide →
Insights
- Search performanceGoogle Search Console clicks, impressions, CTR and position.Read the guide →
- Visitor analytics and page insightsGoogle Analytics 4 traffic, and every page joined with its search data.Read the guide →
- Keywords and recommendationsKeyword opportunities and evidence-backed suggestions.Read the guide →
- Content audit and technical healthArticle quality scores and a weekly crawl of the public site.Read the guide →
- Internal linking and backlinksLinks between your articles, and other sites linking to you.Read the guide →
- AI visibilityWhether AI assistants cite or mention the site, week by week.Read the guide →
- ReportsWeekly and monthly reports with CSV and printable versions.Read the guide →
Community
Site settings
- Appearance & settingsCustomise the public site with drafts, previews, history and rollback.Read the guide →
- IntegrationsSocial sign-in, IndexNow instant indexing and AI image generation.Read the guide →
- Storage & emailMedia storage (Cloudflare R2) and outgoing email (Amazon SES).Read the guide →
- Managing usersInvite demo users, add accounts with a password, change roles, ban or delete.Read the guide →
- Advanced settingsLower-level options for operators.Read the guide →
Operations
- System status and data syncLive dependency checks, and every data import run.Read the guide →
- BackupsZip backups of content and configuration.Read the guide →
- Database browserConnection, table sizes, maintenance and a read-only browser.Read the guide →
- Audit logEvery change and every sign-in attempt.Read the guide →
Frequently asked questions
I'm a demo user. Why can't I save anything?Getting started
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?Getting started
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?Getting started
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).
How do I publish a post?Content
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?Content
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?Content
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
Does AI ever publish on its own?Editorial & AI
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?Editorial & AI
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.
The search or analytics numbers look out of date. Why?Insights
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?Insights
Backlinks come from DataForSEO's own crawl, not Google's, so their counts differ. Read both as trends.
In the admin: /admin/backlinks
How do I add a user?Site settings
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?Site settings
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?Site settings
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?Site settings
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?Site settings
Yes. Appearance & settings keeps a history; roll back to the previous version.
In the admin: /admin/appearance
How do I find out who changed something?Operations
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?Operations
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?Operations
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
Can readers see this guide?Getting started
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
Which AI models does the CMS use?SEO agent, AI & ML
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?SEO agent, AI & ML
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?SEO agent, AI & ML
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?SEO agent, AI & ML
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
Is it safe to let readers run code on the site?Content
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
What is a “crew” and an “agent”?SEO agent, AI & ML
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”?SEO agent, AI & ML
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?SEO agent, AI & ML
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
Can I manage posts from a script?Account
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: this reference never shows the values saved on this site.
GeneralAppearance & settings · 18
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 |
In the admin: /admin/appearance?section=general
BrandingAppearance & settings · 7
| 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. | — |
In the admin: /admin/appearance?section=branding
HeaderAppearance & settings · 19
| 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. | — |
In the admin: /admin/appearance?section=header
Typography & coloursAppearance & settings · 13
| 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 |
In the admin: /admin/appearance?section=theme
HomepageAppearance & settings · 3
| 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. | — |
In the admin: /admin/appearance?section=homepage
Blog & articlesAppearance & settings · 16
| 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. | — |
In the admin: /admin/appearance?section=blog
MediaAppearance & settings · 4
| 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). | — |
In the admin: /admin/appearance?section=media
SEO & integrationsAppearance & settings · 14
| 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. | — |
In the admin: /admin/appearance?section=seo
Hire meAppearance & settings · 21
| 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. | — |
In the admin: /admin/appearance?section=hireMe
Advanced (custom CSS)Appearance & settings · 2
| Setting | What it does | Default |
|---|---|---|
| Apply custom CSS | Restricted CSS applied to the public site. | off |
| CSS | Validated, up to 10,000 characters. | — |
In the admin: /admin/appearance?section=advanced
IndexNowIntegrations · 3
| 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. | — |
In the admin: /admin/integrations
Image generation (Google Gemini)Integrations · 5
| 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. | — |
In the admin: /admin/integrations
Media storage (Cloudflare R2)Storage & email · 4
| 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. | — |
In the admin: /admin/storage
EmailStorage & email · 7
| 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. | — |
In the admin: /admin/storage
Data sources: Google propertiesAutomation & AI · 6
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 |
In the admin: /admin/automation
Data sources: Sync and retentionAutomation & AI · 5
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 |
In the admin: /admin/automation
Data sources: DataForSEO (pay as you go; credentials DATAFORSEO_LOGIN / DATAFORSEO_PASSWORD in the site's Secret)Automation & AI · 14
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 |
In the admin: /admin/automation
Schedules: Schedules (UTC; weekday 0 = Sunday)Automation & AI · 16
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 |
In the admin: /admin/automation
Scoring & rules: Scoring weights (relative; renormalised when an input is missing)Automation & AI · 6
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 |
In the admin: /admin/automation
Scoring & rules: Rule thresholdsAutomation & AI · 12
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 |
In the admin: /admin/automation
Content & links: Internal linking limits (conservative by default)Automation & AI · 19
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 |
In the admin: /admin/automation
Content & links: Search-engine submission (kill switch: SEO_SUBMISSION_ENABLED)Automation & AI · 4
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 |
In the admin: /admin/automation
Content & links: Keyword opportunitiesAutomation & AI · 6
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 |
In the admin: /admin/automation
AI & drafts: LLM enrichment (optional; off by default)Automation & AI · 8
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 |
In the admin: /admin/automation
AI & drafts: Claude drafts (automation stops at “ready for review”; empty models/budget = environment defaults)Automation & AI · 24
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 |
In the admin: /admin/automation
AI & drafts: AI visibility (weekly prompts to AI assistants with web search; API keys only in the site's Secret)Automation & AI · 16
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 |
In the admin: /admin/automation
Crawler: Technical crawlerAutomation & AI · 5
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 |
In the admin: /admin/automation
Reports: Reports (email only after recipients are set and email is enabled)Automation & AI · 2
Weekly and monthly report e-mail.
| Setting | What it does | Default |
|---|---|---|
| Email Enabledreports.emailEnabled | — | off |
| Recipientsreports.recipients | — | none |
In the admin: /admin/automation
MCP servers and scopesMCP access · 6
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. | — |
In the admin: /admin/automation/mcp
Search engine verificationAdvanced settings · 2
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 |
In the admin: /admin/advanced
Analytics, ads and consentAdvanced settings · 7
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 |
In the admin: /admin/advanced
Human verification (Cloudflare Turnstile)Advanced settings · 2
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 |
In the admin: /admin/advanced
Cal.com bookingsAdvanced settings · 1
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 |
In the admin: /admin/advanced
Razorpay payments (paid calls)Advanced settings · 3
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 |
In the admin: /admin/advanced
Image generation limitsAdvanced settings · 4
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 |
In the admin: /admin/advanced
Video generationAdvanced settings · 6
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 |
In the admin: /admin/advanced
Members-only articlesAdvanced settings · 1
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 |
In the admin: /admin/advanced
Video destinationsAdvanced settings · 11
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 |
In the admin: /admin/advanced
Profile picturesAdvanced settings · 3
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 |
In the admin: /admin/advanced