Skip to main content

afrigov is an open-source project. It is not a government website and is not affiliated with any government.

Previewing neutral core Change

afrigov Accessible government design system

Search and answer engines

People find government services through a search box or by asking an assistant. Both read the same things: the head of the page, its structure, and a little structured data. This is what to put there.

afrigov's components give you the structure for free: one h1, headings in order, real lists and tables, links that say where they go, dates in time. The rest is content you supply per page.

The head of every page

<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Renew a passport – Ministry of Interior</title>
  <meta name="description" content="Renew an adult passport online. It takes about 10 minutes and costs ₦35,000. You need your current passport and a payment card.">
  <link rel="canonical" href="https://interior.gov.ng/passports/renew">

  <!-- How the page looks when it is shared -->
  <meta property="og:title" content="Renew a passport">
  <meta property="og:description" content="Renew an adult passport online in about 10 minutes.">
  <meta property="og:type" content="website">
  <meta property="og:url" content="https://interior.gov.ng/passports/renew">
  <meta property="og:image" content="https://interior.gov.ng/images/share.png">
</head>
  • Title: the page, a dash, the organisation. The same words as the h1. Under 60 characters where you can.
  • Description: one or two sentences that answer "what can I do here and what do I need", under 160 characters. It is what shows under the link in results. Every page gets its own.
  • Canonical: the one address of this page, so copies with tracking parameters or a trailing slash do not compete with it.
  • Language: lang on html, and hreflang links between translations. The language switcher carries the same information for people.
  • Share image: one image for the whole site is enough: the crest and the organisation's name on a plain background, 1200 by 630.

Structured data

A small block of JSON-LD tells search engines and assistants what the page is, in terms they do not have to guess. Four types cover most of a government site.

The organisation, on the home page

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "GovernmentOrganization",
  "name": "Ministry of Interior",
  "url": "https://interior.gov.ng/",
  "logo": "https://interior.gov.ng/images/crest.png",
  "parentOrganization": { "@type": "GovernmentOrganization", "name": "Federal Government of Nigeria" },
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "1 Government Road",
    "addressLocality": "Abuja",
    "addressCountry": "NG"
  },
  "contactPoint": { "@type": "ContactPoint", "telephone": "+234-800-000-0000", "contactType": "customer service", "availableLanguage": ["en", "ha"] },
  "sameAs": ["https://x.com/interiorng", "https://www.facebook.com/interiorng"]
}
</script>

A service, on its start page

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "GovernmentService",
  "name": "Renew a passport",
  "description": "Renew an adult passport online and collect it from the office you choose.",
  "serviceType": "Passport renewal",
  "provider": { "@type": "GovernmentOrganization", "name": "Ministry of Interior" },
  "areaServed": { "@type": "Country", "name": "Nigeria" },
  "availableChannel": { "@type": "ServiceChannel", "serviceUrl": "https://interior.gov.ng/passports/renew" },
  "offers": { "@type": "Offer", "price": "35000", "priceCurrency": "NGN" }
}
</script>

Where the page sits, wherever there is a breadcrumb

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    { "@type": "ListItem", "position": 1, "name": "Home", "item": "https://interior.gov.ng/" },
    { "@type": "ListItem", "position": 2, "name": "Passports", "item": "https://interior.gov.ng/passports" },
    { "@type": "ListItem", "position": 3, "name": "Renew a passport" }
  ]
}
</script>

News, and questions with answers

A news page uses NewsArticle with headline, datePublished, dateModified and the organisation as publisher. A page of questions in an accordion uses FAQPage, with each question and the full text of its answer. The answers must be the ones on the page, word for word.

Writing so you are quoted correctly

An assistant that answers "how do I renew my passport in Nigeria" lifts a sentence or two from a page. Make the right sentence easy to lift.

  • Answer first. Under a heading that is a question, the first sentence is the answer: "It costs ₦35,000 and takes six weeks." Detail follows.
  • Headings people would type. "What you need", "How much it costs", "How long it takes". Not "Overview" or "Introduction".
  • Facts as text, not pictures. Fees, deadlines and addresses in the page itself, never only in an image or a PDF. A table with a caption for anything with rows.
  • Dates you can trust. Every date in a time element, and "Last updated" on any page whose facts change. An answer with a date is an answer people can check.
  • One page per thing. One service, one page, one address. Two pages that both half-answer a question will both be passed over.
  • Hidden text still counts. The accordion and details components keep their content in the page, so it is read by search engines whether open or closed.

The two files at the root

  • robots.txt allows everything public and names the sitemap. Do not block the stylesheet or script folders; search engines render pages to read them.
  • sitemap.xml lists every public page with the date it last changed. Regenerate it when you publish.
User-agent: *
Allow: /

Sitemap: https://interior.gov.ng/sitemap.xml

When to keep a page out

<meta name="robots" content="noindex"> belongs on test and staging sites, on the pages inside a form journey after the start page, and on confirmation pages that carry a reference number. It does not belong on anything the public should find. Check before launch: a forgotten noindex from staging is the commonest reason a new government site cannot be found.

What you get without doing anything

  • A fast first paint: the core stylesheet is 10 KB compressed and there are no web fonts to wait for.
  • No layout shift from the menu, with the two lines in the head shown on Get started.
  • Semantic HTML from every component, which is what crawlers and assistants read.
  • Pages that pass the accessibility checks search engines also score.