Internal guide · Naijm platform

Everything you need to start
with Rafiq — in one page.

Naijm is the company. Rafiq is its Agentic Assistant — a helpful AI agent in Slack — backed by a web console that manages accounts and deployments, and an internal GitLab where your code lives. This page gets you access to all three, usually in under an hour.

Rafiq in Slack console.naijm.com gitlab.naijm.com Powered by Hermes Agent

Naijm, in three pieces

Naijm is the company; these are the three pieces of it you’ll actually touch day to day. Each one is simple on its own.

Rafiq — the Naijm Agentic Assistant

The company’s AI agent, waiting in your Slack DMs. Rafiq (Arabic for “companion”) builds and deploys apps, researches topics, writes documents, monitors things on a schedule, and answers questions about how the platform works.

You interact with it by mentioning it in a DM or a channel where it is invited.

The Naijm console

A web app at console.naijm.com that manages your account, your GitLab connection, service registration, publication of deployed apps, and the agent instructions everyone shares.

Reachable only from the private tailnet — see step 1 below.

Hermes, the engine

The assistant runs on Hermes Agent (by Nous Research). It acts as you — with your account, your permissions and your credentials — and nothing is shared between teammates.

Get access in 5 steps

Follow them in order. Steps 1–2 need a human admin; the rest you can do yourself or with the assistant's help.

  1. 1

    Join the tailnet needs admin

    Everything internal — the console, deployed apps, GitLab — lives on our private Tailscale network (the "tailnet"). Nothing is exposed to the public internet.

    • Ask the platform admin (Samuel Cardillo) to invite you to the tailnet.
    • Install the Tailscale app on your laptop (and phone, if you want mobile access) and sign in with the account from the invite.
    • Sanity check: open https://gitlab.naijm.com — if the GitLab sign-in page loads, you are on the tailnet.
  2. 2

    Get your console account needs admin

    The console is at https://console.naijm.com. An admin creates your account and tells you your username.

    • Sign in from a tailnet-connected device.
    • Your console role (member or admin) decides what you can change for others — your own apps and profile are always yours to manage.
  3. 3

    Link your Slack account 5-min link

    Now connect Slack to the console — this is how Rafiq knows who you are:

    • Open a direct message with Rafiq in Slack.
    • Send the single word: link
    • Rafiq replies with a personal URL that is valid for 5 minutes — click it promptly.
    • That page connects your Slack account to your Naijm console account. Link expired? Just send link again for a fresh one.
  4. 4

    Connect your GitLab account

    Our code lives on an internal GitLab server (https://gitlab.naijm.com). You get a personal namespace there — for example samuelcardillo or arthur-maquet. To let Rafiq push code, create repositories and deploy with your identity, connect a legacy personal access token:

    1. In GitLab, click your avatar → Edit profile → Access tokens (direct path: /-/user_settings/personal_access_tokens), then Add new token.
    2. Name it (e.g. naijm-console), pick an expiry you are comfortable renewing, and select the legacy scopes api, read_repository and write_repository — the same set the platform itself runs on.
    3. Create the token and copy it immediately — it is shown only once (glpat-…).
    4. In the Naijm console, open your profile and paste the token into the GitLab token field, then save.
    5. Sanity check: DM Rafiq "what can you see in my GitLab?" — it should answer with your repositories.

    Paste the token only into the console — never into Slack or chat. Rafiq never asks for tokens in a conversation.

  5. 5

    Try a real task you're live

    Your Slack and console accounts are linked — Rafiq can now act for you. Give it something real:

    • "Summarise this document I'm attaching"
    • "What services are currently deployed?"
    • "Build me a small dashboard app and deploy it privately"

    That's it — you're onboarded. The rest of this page explains each area in more depth.

Working with Rafiq in Slack

Rafiq is a teammate, not a search box. The clearer the request, the better the result.

Good requests look like

  • Specific and self-contained: "Deploy the static site in my-team/landing on port 18100 and publish it to the tailnet."
  • Verified by default: the assistant reports real tool output — URLs are verified, not guessed. Ask it to "verify" anything that matters.
  • Iterative: you can correct course mid-task; it adjusts and continues.

Handy things to know

  • Start fresh when switching topics: sending /new in the chat begins a new conversation with a clean context.
  • Scheduled work: the assistant can run recurring jobs (daily digests, price watches, health reports) and deliver results to your chat.
  • Attachments: you can send files (documents, spreadsheets, images) through the message composer.
  • Re-linking: send link to Rafiq any time you need to (re)connect your Slack and console accounts — each URL it returns is valid for 5 minutes.
  • Stop requests: say "stop" and it stops immediately. Nothing runs against your will.
Security by design: the assistant uses your credentials and permissions — never shared token maps or someone else's account. It will not accept a password, card number or 2FA code in chat; logins happen through secure, saved-vault flows instead.

The Naijm console

The control room for accounts, connections and deployments. You'll rarely need it day-to-day — the assistant does most console actions for you — but it helps to know what lives there.

Console URL (tailnet only) https://console.naijm.com

Accounts & roles

Your profile, username and console role. Admins manage accounts for the whole team.

GitLab connections

Link your GitLab identity once; every assistant action afterwards runs with your access.

Services

Registered apps, their deployment pipelines, publication routes and live status.

Redeploy grants

Owners can grant teammates permission to redeploy a specific app without owning it.

Agent instructions

The shared "how the assistant behaves" policy, plus your personal additions.

Publication

Apps publish to the private tailnet by default; public exposure is an explicit, deliberate request.

Working with GitLab

Our internal GitLab hosts all project code. You can use it like any Git forge — and the assistant can do the tedious parts for you.

Internal GitLab (tailnet only) https://gitlab.naijm.com

Everyday Git

  • Each teammate has a personal namespace (e.g. samuelcardillo/…). Your projects are private by default.
  • Clone, branch, commit and push as usual — the assistant can also do this for you from your connected identity.
  • Keep secrets out of repos: .env, tokens, keys and credentials never belong in source. Every publish is secret-scanned.

From repo to running app

Deployments on Naijm follow one tracked path — you never deploy by "just pushing":

  1. Register the project as a service (name + GitLab path + port).
  2. Deploy — one tracked CI pipeline with a stable request ID, health-checked.
  3. Publish — a managed URL on the tailnet, verified before anyone is told it's live.

Pushing new source code never triggers a deployment by itself. Ask the assistant: "redeploy my app" — it handles the rest.

The golden rule: a green CI pipeline only proves the pipeline and health check ran. An app is truly live when its registered process is running and its published URL has been verified. The assistant knows the difference — trust "endpoint verified", not just "pipeline green".

Ship your first app

A realistic first-week task: get something you built running on the tailnet. Total effort: one Slack conversation.

  1. 1

    Prepare a clean repository

    Put your app in your GitLab namespace. Review what you commit: no .env files, no tokens, no database dumps. A README.md and a .gitignore are good hygiene — the secret scanner is not optional.

  2. 2

    Ask Rafiq to register it

    "Register my project firstname/dashboard as a Naijm service called dashboard on port 18100." Registration validates repo access and port conflicts — nothing is deployed yet.

  3. 3

    Deploy once

    "Deploy dashboard." Rafiq runs one deployment request with a stable identifier, waits for the CI pipeline, and checks its health evidence. Retries reuse the same request — never a blind second trigger.

  4. 4

    Publish privately & verify

    "Publish dashboard to the tailnet." You get the managed HTTPS URL back — and Rafiq verifies the actual page renders before reporting success. Public (internet-wide) access always needs an explicit request from you.

  5. 5

    Iterate

    Push source updates freely — then ask for a redeploy when you want them live. Need to stop it? "Undeploy" stops the app and removes its routes but keeps code and data. "Delete" is owner-only and always previews exactly what will be removed first.

Quick reference

Bookmark this section — it's the whole page in five lines.

Rafiq in Slack Rafiq start a DM, or @-mention it in an invited channel
Naijm console https://console.naijm.com accounts · GitLab connections · services · publication
Internal GitLab https://gitlab.naijm.com personal namespaces · private repos · CI pipelines
LLM API https://llm.naijm.com/v1 OpenAI-compatible API — request your key from an admin
Slack ↔ console link send "link" to Rafiq returns a connect URL — valid 5 minutes
Platform admin Samuel Cardillo tailnet invites · console accounts · anything access-related
Default exposure Private (tailnet) public access only via explicit request

FAQ

The things people actually ask in week one.

I can't open the console or GitLab — why?

You're almost certainly not on the tailnet (or Tailscale is signed out). Install/launch Tailscale and sign in; if you were never invited, ask Samuel. console.naijm.com, gitlab.naijm.com and llm.naijm.com look like normal names but resolve only inside the tailnet — private by design.

My "link" URL expired before I clicked it — now what?

Nothing lost — send link to Rafiq again. Every URL Rafiq returns is valid for 5 minutes, so click it promptly.

My GitLab token expired or was rotated — what now?

Create a fresh legacy personal access token with the same scopes (api, read_repository, write_repository) and paste it into the GitLab token field on your console profile — same flow as onboarding. Rafiq picks up the new identity immediately.

Can my scripts and tools use the platform's LLM?

Yes — the API base is https://llm.naijm.com/v1 (OpenAI-compatible). Ask an admin for an API key, keep it out of your repositories, and you're set.

Can the assistant access my stuff without asking?

No. It uses the credentials connected to your profile, acts within your permissions, and asks before destructive or public changes. Stop requests are honoured immediately.

I pushed new code — why isn't the app updated?

Source pushes never deploy by themselves. Ask the assistant to redeploy the service; it runs one tracked pipeline and verifies the result. Avoid triggering a second deployment if the first one's outcome is unclear — retries reuse the same request.

What's the difference between undeploy and delete?

Undeploy stops the app and removes its sharing routes, keeping all source and data. Delete removes the registration (and, if you ask for "entirely", the data directory and the GitLab repository too) — and only the app's owner can do it, even admins can't delete someone else's app.

My app shows a port but no URL — is it live?

Not verified yet. A running process with no published, verified URL is not "live". Ask the assistant to publish it and confirm the URL verification result.

Can I make my app public on the internet?

Yes, but only through an explicit request — private tailnet publication is the default for everything. Say "publish publicly" and Rafiq will treat that as deliberate authorization.

Rafiq asked a weird "confirm token" question — what's that?

For destructive actions (like deletion) the tools require a preview-then-execute sequence with a confirmation token. It's a safety rail, not bureaucracy: you see exactly what will be removed before anything happens.