# Bygg interna verktyg med AI: lager, ärenden och en översikt

> Snabbaste vinsten när du pratar fram en app: lager, ärendeformulär och en enkel översikt i NorthernGo. Därför är inloggning inte valfri, plus ärliga gränser.

Source: https://northerngo.com/sv/guider/bygga-interna-verktyg-med-ai/
Language: sv
Updated: 2026-08-15

---
**Interna verktyg är den ärligaste snabba vinsten med en AI-appbyggare: en lagerlista, ett ärendeformulär, en översikt som läser samma kollektioner. I NorthernGo beskriver du jobbet med text, röst eller en skiss; Arkitekt, Byggare och Kritiker skriver vanilla JavaScript och Tailwind mot en Supabase-databas i PostgreSQL i EU. Sätt inloggning framför varje intern vy. Ett verktyg utan inloggning är ett publikt kalkylark över lagret.**

### Det här är jobbet byggaren faktiskt är bra på

En publik produkt måste se färdig ut. Ett internt verktyg måste användas på tisdag. Den skillnaden är skälet till att lagerlistor, ärendeformulär och små översikter är den snabbaste vinsten när du beskriver en app i vanligt språk och låter en [AI-appbyggare](/sv/ordlista/ai-app-builder/) skriva den.

Du kan fälten redan. Verkstaden vet vilka reservdelar som tar slut. Kontoret vet vilket papper folk fyller i och sedan tappar bort. Ingen behöver ett designsystem. De behöver en skärm som sparar, en skärm som listar, och en siffra som inte är en vecka gammal.

NorthernGo är byggt för det. Varje app har redan en Supabase-databas i PostgreSQL i EU, inloggning med e-post och lösenord, och ett PWA så skalet fortfarande laddar i en telefon på gården. Du skriver, pratar eller ritar. Arkitekten planerar, Byggaren skriver en HTML-fil i vanilla JavaScript och Tailwind, Kritikern granskar på Premium och Pro. Koden är din. ZIP-export finns på Premium och Pro.

Vad det inte är: ett affärssystem, ett analyspaket, eller en ersättare för programmet redovisningen redan lever i. Pro kan prata med Fortnox över webhooks om du senare behöver det röret. Första versionen ska inte vänta på det.

### Varningen som hör hemma ovanför prompten

Intern data är fortfarande personuppgifter, och den är fortfarande intern. En lagerlista med leverantörsnamn, ett ärende med vem som bad om vad, en översikt över timmar — inget av det ska nås av den som råkar få tag i adressen.

Utan inloggning läser och skriver varje besökare samma kollektioner. Det är standard. Det är bekvämt i editorn och förödande i samma stund du publicerar. Den publicerade adressen är en URL. URL:er hamnar i gruppchattar.

Alltså är regeln tvär. Är verktyget internt är första raden i prompten inloggning. Lås varje lista, varje sparning och varje ruta på översikten bakom `window.NorthernGoDB.getToken()`. Lägg till en synlig knapp Radera mitt konto som anropar `deleteAccount()` efter bekräftelse — [varje app med inloggning måste](/sv/guider/gdpr-compliant-app-building-eu/), även en som bara personalen använder. Personal har samma rätt enligt artikel 17 som kunder.

Be inte modellen om "bara folk i firman ska se det här" och stanna där. Det finns inget företagsregister, ingen spärr på e-postdomän, ingen enkel inloggning mot ett annat system. E-post och lösenord. Du skapar kontona. Du avgör vem som får länken.

### Steg 1: Välj ett jobb, inte en plattform

Den misslyckade prompten är "bygg oss en driftcentral". Den som fungerar namnger ett tisdagsproblem.

Tre jobb som ryms:

- **Lager.** En lista med namn, artikelnummer, plats, antal, minstaAntal. Ett formulär för att lägga till eller justera. Ett filter för rader på eller under minimum.
- **Ärendeformulär.** Någon lämnar in ett ärende (delar, ledighet, en bil). En andra vy visar öppna ärenden. Status går från öppen till beställd till klar.
- **En översikt.** Inte diagram för diagrammens skull. Tre tal ur samma kollektioner: artiklar under minimum, ärenden som väntar, tid för senaste ändring.

Bygg ett av dem först. En översikt utan kollektioner bakom sig är en affisch. Ett formulär som inte skriver till databasen är ett papper.

En prompt som fungerar:

> Internt verktyg för en liten verkstad. Inloggning krävs på varje vy. Tre vyer bakom inloggningen: Lager, Ärenden, Översikt. Lagerartiklar: id, namn, sku, plats, antal, minstaAntal. Att spara en artikel med befintligt sku uppdaterar antal i stället för att lägga in en dubblett. Ärenden: id, titel, begardAv, status, skapad. Status är open, ordered, done. Översikten visar antal artiklar där antal <= minstaAntal, antal öppna ärenden, och nyaste lastTouchedAt. Knapp Radera mitt konto som anropar window.NorthernGoDB.deleteAccount() efter bekräftelse.

Det räcker för Arkitekten. Det räcker också för att du ska kunna såga den första generationen när den hittar på en fjärde vy som heter Analys.

### Steg 2: Lager som en lista du kan räkna

Antal är ett tal. Modellen lagrar det som sträng om du låter den, och då blir "12" + 1 till "121". Säg "antal är ett tal" i prompten, och tvinga det i koden.

```javascript
async function saveItem(item) {
  const all = (await window.NorthernGoDB.get('items')) || [];
  const sku = String(item.sku || '').trim().toUpperCase();
  const existing = all.find(row => String(row.sku || '').trim().toUpperCase() === sku);

  const record = {
    id: existing ? existing.id : crypto.randomUUID(),
    name: item.name,
    sku,
    location: item.location || '',
    quantity: Number(item.quantity) || 0,
    minQuantity: Number(item.minQuantity) || 0,
    lastTouchedAt: new Date().toISOString()
  };

  await window.NorthernGoDB.save('items', record);
  return record;
}

function lowStock(items) {
  return items.filter(row => Number(row.quantity) <= Number(row.minQuantity));
}
```

[Databas-API:t finns redan](/sv/guider/connect-supabase/): `save`, `get`, `delete`, plus inloggning. Ingen tabell att skapa. `|| []` på varje `get`, annars visar första morgonen med tomt lager en blank sida och någon tar fram papperslistan igen.

Dubbletter är lika skadliga här som i ett kundregister. Två rader för samma artikelnummer betyder två antal. Matcha på artikelnummer, uppdatera, lägg inte in. Modellen räknar inte ut det ur ordet "lager".

### Steg 3: Ärendeformulär som faktiskt tar vägen någonstans

Ett formulär som bara lever i webbläsaren är en lapp. Spara det.

```javascript
async function submitRequest(title, requestedBy) {
  await window.NorthernGoDB.save('requests', {
    id: crypto.randomUUID(),
    title: String(title || '').trim(),
    requestedBy: String(requestedBy || '').trim(),
    status: 'open',
    createdAt: new Date().toISOString()
  });
}

async function setRequestStatus(id, status) {
  const allowed = ['open', 'ordered', 'done'];
  if (!allowed.includes(status)) return;
  const all = (await window.NorthernGoDB.get('requests')) || [];
  const row = all.find(item => item.id === id);
  if (!row) return;
  row.status = status;
  await window.NorthernGoDB.save('requests', row);
}
```

Stängda statuslistor igen. Får modellen hitta på "väntar på godkännande" får du fyra namn för väntan och en översikt som räknar för lågt.

E-post är valfritt och lätt att överanvända. `window.NorthernGo.sendEmail(to, subject, html)` kan säga till någon att ett ärende kommit in. Det är inte ett ärendesystem, det trådar inte svar, och mottagaren måste ändå öppna appen för att byta status. Använd det som en knackning, inte som databasen.

Vem är "begärd av"? Det ärliga svaret är den inloggades e-post, inte ett fritextfält med namn som modellen lägger till för att det ser vänligt ut. Ett namnfält är så du får "Micke" och "Mikael" som två personer.

### Steg 4: En översikt som läser samma kollektioner

Lagra inte totaler. Räkna dem när översikten ritas.

```javascript
async function loadOverview() {
  const items = (await window.NorthernGoDB.get('items')) || [];
  const requests = (await window.NorthernGoDB.get('requests')) || [];

  const low = items.filter(row => Number(row.quantity) <= Number(row.minQuantity)).length;
  const open = requests.filter(row => row.status === 'open').length;
  const newest = items
    .map(row => row.lastTouchedAt)
    .filter(Boolean)
    .sort()
    .at(-1) || '—';

  renderOverview({ low, open, newest, lowItems: items.filter(row => Number(row.quantity) <= Number(row.minQuantity)) });
}
```

Tre tal och de faktiska raderna under minimum under. Det är en översikt en verkstad tittar på. Ett diagram utan ny information är det modellen lägger till när du säger "gör den insiktsfull". Stryk den meningen ur prompten.

Uppdatera vid laddning och efter varje sparning. En översikt som cachar i en variabel och aldrig läser om är så kontoret och gården är oense.

### Steg 5: Inloggning är inte valfri på intern data

Det här steget hoppar folk över för att "det är bara vi".

```javascript
window.addEventListener('DOMContentLoaded', async () => {
  if (!window.NorthernGoDB.getToken()) {
    showLogin();
    return;
  }
  await loadOverview();
});

async function handleLogin(email, password) {
  try {
    await window.NorthernGoDB.login(email, password);
    location.reload();
  } catch (err) {
    showMessage(err.message);
  }
}
```

Skapa personalkonton med `register` själv, och sluta visa registreringsformuläret i den publicerade appen om du kan. En öppen registreringsknapp på ett internt verktyg är ett sätt för en främling att skapa ett tomt konto. Hen ser inte era rader — posterna hör till den inloggade — men hen tror sig ha tillträde, och du tror att verktyget är trasigt när telefonen ringer.

Delad data mellan personal har samma begränsning som ett kundregister. Två inloggningar ser inte ett lager. En verkstad som behöver en lista använder en delad inloggning, eller accepterar att det här är en personlig checklista. Det finns inga roller. En "Admin"-brytare modellen ritar skyddar inte en radera-knapp.

Logga ut hör hemma intill titeln, inte undanstoppat. `window.NorthernGoDB.logout()` och sedan ladda om. Delade telefoner i fikarummet är skälet.

Radera-konto är kvar, även här:

```javascript
if (confirm('Detta raderar kontot och all din data för alltid. Fortsätta?')) {
  await window.NorthernGoDB.deleteAccount();
  location.reload();
}
```

Du är personuppgiftsansvarig för det verktyget lagrar. NorthernGo är personuppgiftsbiträde för standarddatabasen i EU. Personal som vill bli borttagen är inte en udda begäran; det är lagen. Se [GDPR i praktiken](/sv/ordlista/gdpr/) om du behöver den kortare definitionen.

### Steg 6: Publicera det som en intern adress, inte som en produkt

Publicera från Mina projekt. Gratis hamnar alltid på reservadressen. Premium och Pro får en subdomän på `northerngo.com`; Pro kan koppla en egen domän. För ett verkstadsverktyg räcker subdomänen. Egen domän är för när adressen måste se ut som ni, inte som byggaren.

Behandla länken som en hemlighet som inte är en hemlighet. Den som har den möter fortfarande inloggningen om du låste rätt. Låste du inte är den som har den inne i lagerlistan. Testa från ett privat fönster innan du klistrar in URL:en i en chatt.

ZIP-export på Premium och Pro är utgången om verktyget blir viktigt. Vanilla JS och Tailwind, en fil, inget bygge. Hosting du styr senare. Det är det praktiska svaret på inlåsning för intern programvara: du kan gå med skärmarna och, via `get()`, med en JSON-dump av kollektionerna.

### Vad det här inte blir

- **Inte ett affärssystem eller ett analysverktyg.** Ett antalsfält, en platssträng, tre räkningar från `get()`. Inga inköpsorder, ingen livekoppling mot lager.
- **Inte en behörighetsmatris.** E-post och lösenord, kollektioner per användare. Delat lager betyder delad inloggning.
- **Inte en konfliktlösare mellan enheter.** Offlineräkning köas och senast kända siffror visas; två enheter kan fortfarande divergera tills båda är online.
- **Inte en ersättare för Fortnox.** Pro har webhooks och Fortnox för ett senare rör. Första versionen ska stänga ett pappersformulär.

### Vad det kostar

Gratis: 0 SEK, fem molngenereringar i månaden, obegränsat lokalt. Ingen ZIP. Premium: 179 SEK / $19, 25 moln, ZIP. Pro: 299 SEK / $29, 50 moln, egna domäner, Shopify, SEO-granskningar, webhooks och Fortnox. Köp Pro för domänen eller en webhook, inte för att ett ärendeformulär behöver en butik.

### Felsökning

**Översikten är alltid noll.** `get()` misslyckades eller returnerade något annat än en array. Använd `|| []` och tvinga med `Number`. Två rader för samma artikelnummer betyder ingen matchning före insättning.

**En i personalen ser tomma hyllor.** Lagring per användare. Dela en inloggning.

**Någon öppnade URL:en och såg förra veckans lager.** Listorna ritades före token-kollen. Lås överst i `DOMContentLoaded`. Göm registrera på det publicerade verktyget.

## Vanliga frågor

### Är en AI-appbyggare faktiskt snabbare för interna verktyg än att köpa en tjänst?

För en lagerlista, ett ärendeformulär och en översikt med tre tal: ja — du kan beskriva fälten i vanligt språk och ha en fungerande skärm samma dag. För inköp, behörigheter och redovisning: nej. Byggaren vinner när jobbet är litet och konkret. Den förlorar när du behöver produkten någon annan redan underhåller.

### Behöver interna verktyg byggda med AI fortfarande inloggning?

Ja. Utan session läser och skriver den som har den publicerade URL:en samma kollektioner. Internt betyder inte dolt. Sätt window.NorthernGoDB.login framför varje lista och sparning, och behåll en radera-konto-knapp för personalen har fortfarande rätt enligt GDPR artikel 17.

### Kan två personer i en verkstad dela en lagerlista?

Inte som två separata konton. Posterna hör till den inloggade och det finns inget API för roller eller inbjudningar. Använd en delad inloggning, eller behandla listan som personlig. En administratörsbricka modellen ritar är inte åtkomstkontroll.

### Räcker gratisplanen för att bygga en intern översikt?

Tillräckligt för att se om de tre vyerna dyker upp: fem molngenereringar i månaden plus obegränsat lokalt via WebGPU eller Ollama. Inte tillräckligt om du behöver ZIP-export. Premium för 179 SEK / $19 ger 25 molngenereringar och ZIP:en. Databas och inloggning ingår på Gratis.

### Fungerar översikten i ett lager med dålig täckning?

PWA-skalet laddar utan nät. get() visar senast synkade siffror plus köade sparningar; save/delete spelas upp när appen är online igen. Inloggning och AI i appen kräver fortfarande uppkoppling. Två enheter kan divergera tills båda synkat.

---

## Related

- [Så tar du betalt i en AI-byggd app med dina egna Stripe-nycklar](https://northerngo.com/sv/guider/ta-betalt-med-stripe/)
- [Bygga GDPR-säkra appar: en praktisk checklista för EU-grundare](https://northerngo.com/sv/guider/bygga-gdpr-saker-app/)
- [Så undviker du inlåsning när du bygger med en AI-appbyggare](https://northerngo.com/sv/guider/undvik-inlasning-ai-verktyg/)

---

NorthernGo är en AI-driven plattform för att bygga produktionsklara webbappar utan kod. Lokal AI-generering via WebGPU är obegränsad och gratis, och du äger all genererad källkod. https://northerngo.com/
