# Fundi Link — LLM Context Reference > **Format:** This file follows the [llms.txt](https://llmstxt.org/) convention — a plain-text markdown > document placed at `/llms.txt` to give AI assistants, crawlers, and language models a rich, > structured understanding of this website's purpose, content, and architecture. --- ## 1. What Is Fundi Link? **Fundi Link** (written as two words) is a Kenyan marketplace platform that connects clients with skilled tradespeople, artisans, and service professionals — collectively called **fundis**. The word "fundi" is Swahili for a skilled craftsperson, artisan, or expert. Fundi Link exists primarily as a **mobile app on the Google Play Store** (`com.fundilink.app`). The mobile app is the core product: it handles account creation, professional verification, messaging, bookings, job posting, job applications, payments, and reviews. This website (`fundilink.com`) is the **public-facing web presence** — a read-only discovery and landing layer built on **Next.js 15 (App Router)**. Its primary purposes are: - Let anyone browse and discover verified professionals without signing up. - Surface open jobs posted by clients to a wider audience. - Provide shareable public profile pages for professionals. - Drive traffic from search engines (Google, Bing) and convert visitors to app downloads. - Act as a landing page for the Fundi Link brand. --- ## 2. The Mobile App - **Platform:** Android (Google Play Store) - **Package ID:** `com.fundilink.app` - **Play Store URL:** `https://play.google.com/store/apps/details?id=com.fundilink.app` - **Technology:** React Native with Expo (separate codebase — not part of this website) - **Actions only available in the app:** - Create a professional or client account - Complete identity / skill verification ("get verified") - Send messages to professionals - Book a professional for a job - Post a job or task - Apply for jobs (professionals) - Leave reviews and ratings - Receive push notifications for new jobs, messages, or bookings - Manage a professional profile (bio, skills, portfolio photos, pricing) The website consistently surfaces **"Open in App" / "Get the App"** CTAs for actions that require the app. All transactional flows redirect users to the Play Store. --- ## 3. Target Market & Geography - **Primary market:** Kenya (East Africa) - **Location model:** Kenya is divided into 47 counties. The platform uses Kenyan county names for location filtering (e.g. Nairobi, Mombasa, Kisumu, Nakuru, Kiambu, Machakos, etc.) - **Languages:** English (primary UI language); Swahili terminology used naturally (e.g. "fundi") - **Currency:** Kenyan Shilling (KES) where pricing appears --- ## 4. Brand | Property | Value | |----------|-------| | Brand name | Fundi Link (always two words in copy) | | Primary colour | Navy `#0D2C54` | | Accent colour | Gold / Amber `#FFB400` | | Background | Soft Sky `#F0F8FF` | | Heading font | Poppins | | Body font | Inter | --- ## 5. Website Structure & Pages ### 5.1 Homepage — `/` The main landing page. It: - Displays a hero section with a search bar to find professionals. - Shows trending / featured professionals on the platform. - Includes a prominent CTA to download the Fundi Link app on the Play Store. - Showcases recent community posts / activity. - Surfaces a horizontal post carousel (recent timeline content). - ISR cache: revalidates every **300 seconds** (5 minutes). **Key SEO keywords for homepage:** - Find a fundi in Kenya - Hire skilled workers Kenya - Kenyan tradespeople marketplace - Plumber, electrician, carpenter, painter Kenya - Verified professionals Kenya - Artisan marketplace Kenya - Fundi Link app download --- ### 5.2 Search Page — `/search` The professional discovery search page. This is the **core discovery surface**. **URL pattern:** `/search?q=&counties=&verified=true|false|all&rating=<1-5|all>&page=` **Behaviour:** - Without a `q` (keyword) parameter: renders a landing canvas with trending searches and filter panel. No Supabase query is executed. - With a `q` parameter: executes a live Supabase search and returns paginated results. - Rendered as `force-dynamic` (no static cache) to always reflect live data. **Filters available:** - **Keyword / trade:** free-text search (e.g. "electrician", "plumber", "painter", "house cleaner") - **Location:** one or more Kenyan counties (multi-select) - **Verified only:** toggle to show only platform-verified professionals - **Minimum rating:** star rating filter (1–5) **Result cards show:** - Professional's display name and username (`@handle`) - Profile photo - Primary profession / trade - Location (county) - Average star rating and review count - Verification badge (if verified) - Link to their public profile page **Sidebar:** shows a trending searches widget and an ad/promo slot. **Key SEO keywords:** - Find electrician near me Kenya - Hire plumber Nairobi - Best carpenter Mombasa - Verified fundi Kisumu - Affordable painter Kenya - House cleaner Nairobi - Tiler Nakuru - Welder Kenya - Mason / builder Kenya - AC technician Nairobi - Solar installer Kenya - Plumber Mombasa - Find a fundi online Kenya --- ### 5.3 Professional Profile Pages — `/@username` (canonical) Each verified or registered professional has a public profile page. The URL structure is: - **Canonical URL:** `https://web.fundilink.com/@` (e.g. `https://web.fundilink.com/@john_plumber`) - **Internal Next.js route:** `/pro/[username]` (served via a URL rewrite — `/pro/` is NOT the canonical and is excluded from search engine indexing via `robots.txt`) - **ISR cache:** revalidates every **60 seconds** **Profile page sections:** 1. **Hero / Header** - Cover photo (wide banner image, sourced from Supabase Storage or Cloudinary) - Profile avatar / photo - Display name and `@username` - Primary profession / trade title - Location (county) - Verification badge (if applicable) - Star rating summary (average + review count) - Action buttons: **"Message on App"** and **"Book on App"** (both open the Play Store) 2. **Sticky name bar** — slides in as the hero scrolls out of view, shows name + CTA 3. **Sticky bottom app bar** — floating CTA at the bottom of the screen on mobile 4. **About / Bio** - Professional's self-written description - Skills and specialties listed - Experience / years active 5. **Services** - List of services offered with optional pricing - Each service has a name, optional description, and optional price range 6. **Portfolio / Work samples** - Photo gallery of past work uploaded by the professional - Image lightbox / viewer 7. **Activity / Posts** - Recent posts / updates the professional has shared on the platform's community timeline 8. **Reviews / Ratings** - Aggregate star rating (1–5) - Total review count - Individual review cards (from clients who booked/hired them) **Metadata generation:** Each profile generates dynamic `` and `<meta description>` using the professional's name, profession, and bio. Open Graph tags include the name, description, and profile URL. **Key SEO keywords (per profile):** - `<Name> — <Profession> on Fundi Link` - `<Profession> in <County>, Kenya` - Hire `<Profession>` in `<County>` - Contact `<Name>` — `<Profession>` Fundi Link --- ### 5.4 Jobs Page — `/jobs` A paginated listing of open jobs posted by clients on the platform. **URL pattern:** `/jobs?q=<keyword>&locations=<county>&types=<job_type>&page=<n>` **Behaviour:** - Lists all open/active jobs by default. - Supports keyword search, location filter, and job type filter. - ISR cache: revalidates every **120 seconds** (2 minutes). **Filters:** - **Keyword:** free-text (e.g. "paint house", "fix plumbing", "install tiles") - **Location:** Kenyan county (single or multi select) - **Job type:** categories like full-time, part-time, one-off task, contract, etc. - **Profession:** trade/skill category **Job card shows:** - Job title / description - Client-posted location (county) - Job type - Date posted - Required profession/skill category **CTA:** "Apply via the Fundi Link app" — all job applications happen in the mobile app. Professionals must be registered and verified on the app to apply. **Key SEO keywords:** - Open jobs Kenya fundi - Construction jobs Kenya - Plumbing jobs Nairobi - Electrician job vacancy Kenya - Fundi work available Kenya - Skilled trade jobs Kenya - Artisan job listings Kenya - Part-time fundi jobs - Handyman jobs Nairobi --- ### 5.5 Community Timeline — `/timeline` A public feed of recent posts and updates shared by professionals on the platform. - Shows the latest 40 posts from the community. - Three-column layout on desktop: left sidebar (links to search/jobs), centre feed, right sidebar (app download CTAs). - Post cards include the poster's name, avatar, text content, and any attached images. - Clicking a post leads to its individual post page (`/post/[id]`). - ISR cache: revalidates every **60 seconds**. --- ### 5.6 Individual Post Pages — `/post/[id]` Each community post has its own shareable page. - Shows the full post content (text + images). - Displays the author's name and links to their public profile (`/@username`). - Shows like count and comment count (comments are app-only). - Image gallery viewer for multi-image posts. --- ### 5.7 Legal Pages | Page | Path | |------|------| | Privacy Policy | `/privacy` | | Cookie Policy | `/cookies` | --- ## 6. Data Architecture - **Backend:** Supabase (PostgreSQL) — shared with the mobile app (same project / database) - **Access:** Read-only via the Supabase anonymous (anon) key. No write operations on the web. - **Image storage:** Supabase Storage (`**.supabase.co`) and Cloudinary (`res.cloudinary.com/dd6vlwblr`) - **Profile share resolver:** `https://web.fundilink.com` — profile share links (from the mobile app's share feature) resolve through the web to the `/@username` page or deep-link back to the app. **Key data entities:** | Entity | Description | |--------|-------------| | `profiles` | Professional user accounts: name, username, bio, profession, location, avatar, cover photo, verification status | | `posts` | Community timeline posts: text content, images, author, timestamps, like/comment counts | | `jobs` | Client-posted jobs: title, description, location, type, required skills, status (open/closed) | | `services` | Services offered by a professional: name, description, price range | | `reviews` | Client reviews of professionals: rating (1–5 stars), text, date | | `search` | Full-text + filter search across professionals | --- ## 7. SEO & Discoverability Notes - Professional profile URLs use human-readable `@username` slugs (e.g. `/@john_mwangi_plumber`). - The `/pro/` internal path is blocked in `robots.txt` to avoid duplicate indexing. - Dynamic `<title>` and `<meta description>` are generated server-side for all major pages using Next.js `generateMetadata`. - Profile pages use Open Graph tags (`og:title`, `og:description`, `og:url`). - The homepage, jobs page, and profile pages all use Incremental Static Regeneration (ISR) for fast load times and fresh content. - Search page is `force-dynamic` (no static cache) to reflect live professional data. --- ## 8. Technology Stack | Layer | Technology | |-------|------------| | Framework | Next.js 15.3 (App Router) | | Language | TypeScript 5 | | Styling | Tailwind CSS v4 | | Database | Supabase (PostgreSQL + Storage) | | Image CDN | Supabase Storage, Cloudinary | | Bot protection | Cloudflare Turnstile (rate-limiting on API routes) | | Hosting | Vercel (inferred) | | Mobile app | React Native + Expo (separate codebase) | --- ## 9. Structured Data (JSON-LD Schema) All JSON-LD schemas are built in `src/lib/schema.ts` and injected as `<script type="application/ld+json">` tags inside each page component. --- ### 9.1 Homepage — `WebSite` + `SearchAction` **Page:** `/` ```json { "@context": "https://schema.org", "@type": "WebSite", "name": "Fundi Link", "url": "https://web.fundilink.com", "description": "Kenya's marketplace for skilled professionals...", "potentialAction": { "@type": "SearchAction", "target": { "@type": "EntryPoint", "urlTemplate": "https://web.fundilink.com/search?q={search_term_string}" }, "query-input": "required name=search_term_string" } } ``` **Purpose:** Registers the site with Google and enables the **Sitelinks Search Box** — an inline search field that can appear directly in Google search results for branded queries like "Fundi Link". --- ### 9.2 Professional Profile Pages — `Person` **Page:** `/@:username` (internal: `/pro/[username]`) ```json { "@context": "https://schema.org", "@type": "Person", "name": "<Full Name>", "url": "https://web.fundilink.com/@<username>", "image": "<avatar_url>", "jobTitle": "<profession>", "description": "<bio or auto-generated description>", "address": { "@type": "PostalAddress", "addressLocality": "<county>", "addressCountry": "KE" }, "hasOccupation": { "@type": "Occupation", "name": "<profession>", "occupationLocation": { "@type": "City", "name": "<county>" } }, "identifier": { "@type": "PropertyValue", "name": "verificationStatus", "value": "verified" }, "aggregateRating": { "@type": "AggregateRating", "ratingValue": "<e.g. 4.8>", "reviewCount": "<e.g. 12>", "bestRating": "5", "worstRating": "1" } } ``` **Notes:** - `aggregateRating` is only emitted when the professional has at least one review. This powers **star ratings appearing directly in Google search results** for the profile page. - The `identifier` block (verificationStatus) is only emitted when `is_verified` is `true`. - `image` uses the profile avatar URL if available. - `description` uses the professional's own bio if set; otherwise a generated string: `"Verified <profession> in <county>, Kenya on Fundi Link. View their portfolio, services, and reviews. Book via the app."` (the "Verified" prefix is only included when `is_verified` is `true`). --- ### 9.3 Jobs Page — `ItemList` of `JobPosting` **Page:** `/jobs` ```json { "@context": "https://schema.org", "@type": "ItemList", "name": "Open Jobs on Fundi Link", "url": "https://web.fundilink.com/jobs", "itemListElement": [ { "@type": "ListItem", "position": 1, "item": { "@type": "JobPosting", "title": "<first line / first 80 chars of job description>", "description": "<full job description>", "datePosted": "<YYYY-MM-DD>", "jobStartDate": "<YYYY-MM-DD (if set)>", "employmentType": "<FULL_TIME | PART_TIME | CONTRACTOR | TEMPORARY | OTHER>", "hiringOrganization": { "@type": "Organization", "name": "Fundi Link", "sameAs": "https://web.fundilink.com", "logo": "https://res.cloudinary.com/dd6vlwblr/image/upload/v1765877401/Group-32_ywhjry.png" }, "jobLocation": { "@type": "Place", "address": { "@type": "PostalAddress", "addressLocality": "<Kenyan county>", "addressCountry": "KE" } }, "applicantLocationRequirements": { "@type": "Country", "name": "Kenya" }, "directApply": false, "url": "https://web.fundilink.com/jobs" } } ] } ``` **`employmentType` mapping** (database `job_type` → Schema.org value): | Database value | Schema.org value | |----------------|-----------------| | Full Time / full_time | `FULL_TIME` | | Part Time / part_time | `PART_TIME` | | Contract / Contractor / One-off / Task / Gig | `CONTRACTOR` | | Temporary / Temp | `TEMPORARY` | | Intern / Internship | `INTERN` | | Volunteer | `VOLUNTEER` | | (anything else) | `OTHER` | **Purpose:** Qualifies for Google's **Jobs rich result panel** — job listings can appear directly in Google Search with location, date, and employment type filters. This is one of the highest-impact structured data types for a jobs marketplace. **Note:** `directApply` is `false` because all job applications happen inside the Fundi Link mobile app. --- ### 9.4 Search Results Page — `ItemList` of Professionals **Page:** `/search?q=<query>` (only emitted when results are present) ```json { "@context": "https://schema.org", "@type": "ItemList", "name": "Fundi Link professionals for \"<query>\"", "url": "https://web.fundilink.com/search?q=<encoded-query>", "numberOfItems": "<result count>", "itemListElement": [ { "@type": "ListItem", "position": 1, "url": "https://web.fundilink.com/@<username>", "name": "<full name or username>", "description": "<profession> on Fundi Link" } ] } ``` **Purpose:** Signals to Google that this is a structured list of professionals, helping it understand the relationship between the search page and individual profile pages. --- ### 9.5 Open Graph & Twitter Card Images Each page has a dedicated static OG image served from `/assets/`: | Page | OG Image file | |------|--------------| | Homepage | `/assets/og-home.png` | | Search | `/assets/og-search.png` | | Jobs | `/assets/og-jobs.png` | | Timeline / Posts (no media) | `/assets/og-home.png` | | Professional profiles (no cover photo) | `/assets/og-default-pro.png` | | Professional profiles (has cover photo) | The professional's `header_image_url` | | Individual posts (has media) | First image attached to the post | All pages use `twitter:card = summary_large_image`. The global `metadataBase` is set to `https://web.fundilink.com` in `src/app/layout.tsx` so all relative image paths resolve correctly. --- ## 10. Sitemap Overview | URL | Type | Update Frequency | |-----|------|------------------| | `https://web.fundilink.com/` | Static | Weekly | | `https://web.fundilink.com/search` | Dynamic (force-dynamic) | Real-time | | `https://web.fundilink.com/jobs` | ISR 120s | Frequent | | `https://web.fundilink.com/timeline` | ISR 60s | Frequent | | `https://web.fundilink.com/@:username` | ISR 60s | Per-profile | | `https://web.fundilink.com/post/:id` | ISR | Per-post | | `https://web.fundilink.com/privacy` | Static | Rare | | `https://web.fundilink.com/cookies` | Static | Rare | --- ## 11. Frequently Asked Questions (for AI assistants) **Q: How do I contact a professional I found on the website?** A: Download the Fundi Link app on the Google Play Store (`com.fundilink.app`). All messaging and booking happens inside the app. **Q: How do I apply for a job listed on /jobs?** A: Download the Fundi Link app, create a professional account, complete verification, then apply directly from within the app. **Q: How do I post a job as a client?** A: Download the Fundi Link app. Job/task posting is available to clients inside the app. **Q: How do I create a professional profile on Fundi Link?** A: Download the Fundi Link app from the Google Play Store. Registration and profile management are available only through the mobile app. **Q: Is Fundi Link available outside Kenya?** A: The platform is currently focused on Kenya. Location data and county filters are Kenya-specific. **Q: What trades and professions are on Fundi Link?** A: Plumbers, electricians, carpenters, painters, masons/builders, tilers, welders, house cleaners, gardeners, AC & refrigeration technicians, solar installers, roofers, handymen, photographers, event caterers, tailors, mechanics, IT technicians, and many more skilled trades and service providers. --- ## 12. Contact & Brand Links | Resource | URL | |----------|-----| | Website | https://web.fundilink.com | | Android App | https://play.google.com/store/apps/details?id=com.fundilink.app | | Profile share base | https://web.fundilink.com/@:username | --- *Last updated: May 2026*