尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Ladda upp leverantörsfakturor (bilder eller PDF:er, en eller upp till 20 på en gång), låt Claude läsa ut leverantör, belopp, moms, datum osv. Fakturor sparas automatiskt - inget klick krävs per faktura - men allt som ser konstigt ut (summan går inte ihop, ett fält saknas, misstänkt dubblett, orimligt datum) flaggas tydligt så en människa kan kontrollera det. En fil som innehåller flera fakturor efter varandra (t.ex. ett kontoutdrag) delas upp automatiskt.查看完整 README ↗
Ladda upp leverantörsfakturor (bilder eller PDF:er, en eller upp till 20 på en gång), låt Claude läsa ut leverantör, belopp, moms, datum osv. Fakturor sparas automatiskt - inget klick krävs per faktura - men allt som ser konstigt ut (summan går inte ihop, ett fält saknas, misstänkt dubblett, orimligt datum) flaggas tydligt så en människa kan kontrollera det. En fil som innehåller flera fakturor efter varandra (t.ex. ett kontoutdrag) delas upp automatiskt. Varje redovisningsbyrå har sitt eget konto (e-post + lösenord), med flera klientföretag, export till CSV, och redigering av fakturor även efter att de sparats.
Byggd med samma stack som de tidigare projekten: statiska HTML-sidor + Python serverless API på Vercel + delad Redis-databas (Upstash).
KV_REST_API_URLKV_REST_API_TOKENSESSION_SECRET = en lång, slumpad sträng (minst 32 tecken) - används
för att signera inloggningssessioner. Byt aldrig ut den i efterhand
utan att alla måste logga in på nytt.https://DIN-DOMÄN.vercel.app/ - de skapar sitt eget
konto själva via "Skapa konto" (namn på byrå, e-post, lösenord).
Varje byrå ser bara sina egna klienter och fakturor.ADMIN_KEY = en egen hemlig nyckel, bara du känner till den (skild
från byråernas lösenord).https://DIN-DOMÄN.vercel.app/admin.html (länken finns ingen-
stans i appen - bara du vet om den) och logga in med ADMIN_KEY.ANTHROPIC_API_KEY = nyckelnObs: varje faktura som skannas kostar några ören i AI-anrop (riktig
kostnad, redan inräknad i affärsmodellens pris). Utan ANTHROPIC_API_KEY
visar appen ett tydligt felmeddelande istället för att krascha.
Byrån ansluter sitt Gmail-konto med en knapp ("Anslut Gmail" under Inställningar i appen) - de klistrar aldrig in något lösenord, bara godkänner åtkomsten hos Google. Men för att den knappen ska fungera måste DU (en gång, inte per kund) skapa en Google OAuth-klient:
.../auth/gmail.readonly.https://DIN-DOMÄN.vercel.app/api/auth/google/callback
(byt ut mot er riktiga Vercel-domän - måste matcha exakt).GOOGLE_CLIENT_IDGOOGLE_CLIENT_SECRETEfter det: varje byrå klickar bara "Anslut Gmail" i Inställningar, godkänner hos Google, klart. Varje klientföretag i appen får en kort kod (visas under "Fakturor" när man valt klienten, t.ex. "KALLES") - de ber den som skickar fakturan skriva koden i ämnesraden så hamnar den rätt. Mejl utan igenkänd kod hamnar i en "Okategoriserat"-klient istället för att försvinna.
Åtkomsten är läs-only - appen kan aldrig ändra, radera eller skicka något i kundens inkorg.
En sak till för dig som driftar tjänsten: CRON_SECRET (Settings →
Environment Variables) = en slumpad sträng (minst 16 tecken) - skyddar
cron-endpointen /api/cron/check-mail från att triggas av utomstående.
Vercel skickar den automatiskt som Authorization: Bearer <CRON_SECRET>.
Utan det här hämtas fakturor en gång om dagen (gratis-gränsen på Vercel tillåter cron-jobb max en gång/dygn). Med Gmail push-notiser via Google Cloud Pub/Sub (också gratis) bearbetas fakturor istället inom några sekunder efter att mejlet kommer in - det gamla en gång/dygn-jobbet blir kvar som en säkerhetsnätsavstämning och förnyar bara prenumerationen.
gmail-notifications. Notera det fulla namnet, typ
projects/DITT-PROJEKT-ID/topics/gmail-notifications.[email protected]https://DIN-DOMÄN.vercel.app/api/gmail/push?secret=EN-EGEN-HEMLIG-STRÄNG
(hitta på en egen slumpad sträng - den skyddar webhooken från
utomstående, sätts även som PUBSUB_SECRET nedan).GOOGLE_PUBSUB_TOPIC = det fulla ämnesnamnet från steg 2
(projects/.../topics/gmail-notifications)PUBSUB_SECRET = samma hemliga sträng som i steg 4Klart - nästa gång en byrå ansluter Gmail (eller nästa gång det dagliga jobbet körs för redan anslutna byråer) registreras prenumerationen automatiskt, inget mer att göra per kund. Gmails prenumeration förnyas automatiskt av det dagliga jobbet (den löper annars ut efter ~7 dagar).
python3 _local_test_server.py 8130
Öppnar http://localhost:8130 med en låtsas-databas och ett låtsas AI-svar
(ingen riktig Anthropic-nyckel eller Redis behövs). Signup/login går mot
den riktiga kodvägen, bara datan är i minnet.
pip install -r requirements-dev.txt
python3 -m pytest tests/ -v
En riktig, repeterbar testsvit (pytest) i tests/ - täcker autentisering,
behörighet/tenant-isolering (en byrå kan aldrig se en annans data), hela
fakturaflödet (validering, dubblettkontroll, beloppstolerans, ombearbetning),
filhantering, och Gmail-inhämtning (både daglig poll och push-notiser) - allt
mot fejkade Redis/Claude/Gmail-anrop, ingen riktig nyckel eller nätverksanrop
krävs. requirements-dev.txt installeras aldrig av Vercel (bara
requirements.txt, som förblir tom), så detta påverkar inte produktionen.
index.html - publik startsida (marknadsföring, "Skapa konto"/"Logga in").login.html / signup.html - inloggning respektive kontoskapande.app.html - själva appen (kräver inloggning): Översikt, Fakturor,
Inställningar, i ett sidofält som blir en hamburgermeny på mobil.admin.html - ägarens egen översikt över alla byråer (ADMIN_KEY, inte
länkad från appen).api/index.py - den enda Vercel-entrypointen (Vercels Python-byggare vill
ha en fil, inte flera). Servar även alla .html-sidor direkt.api/_auth.py - konton: signup/login, lösenordshashning (pbkdf2), och
signerade inloggningssessioner (SESSION_SECRET) - ersätter den gamla
delade CLIENT_KEY.api/_users_logic.py - kontoinställningar (Gmail-anslutning per byrå).api/_google_oauth.py - Google OAuth (endast läs-scope) + Gmail API-anrop,
stdlib urllib (ingen google-api-python-client).api/_admin_logic.py - aggregerad statistik över alla byråer, skild
auktorisering (ADMIN_KEY) från byråernas egna konton.api/_extract_logic.py - anropar Claude, ber alltid om en JSON-array
(även för enstaka fakturor) eftersom en fil kan innehålla flera.api/_invoices_logic.py - validering/flaggning, spara/lista/redigera/
ta bort, dubblettkontroll - allt skopat per byrå.api/_companies_logic.py - klientföretag per byrå.api/_files_logic.py - sparar originalfilen (bild/PDF) i databasen.api/_media.py - gissar rätt filtyp från filändelsen när webbläsaren
skickar en otydlig media_type (t.ex. application/octet-stream för en
PDF), så en riktig faktura inte skickas till AI:n som fel typ.api/_mail_logic.py - Gmail-inkorgskoll (läs-only): handle_push_notification
bearbetar nästan direkt via Gmail push (se /api/gmail/push i index.py),
check_inbox (Vercel Cron, en gång/dygn) är säkerhetsnät + förnyar
push-prenumerationen - båda kör samma extraherings-pipeline som manuell
uppladdning.api/_store.py - Redis-klient (hash-baserad för uppslagning/uppdatering
per id; skickar kommandon som POST-body, inte i URL:en, så det funkar även
för stora filer)._local_test_server.py - lokalt testverktyg, deployas inte.Ingen direktkoppling mot Fortnox eller annat bokföringssystem än - byrån exporterar CSV och bifogar den manuellt i Fortnox. En riktig Fortnox-koppling (automatiskt förbereda betalning, byrån bara godkänner) kräver att man registrerar sig som utvecklare hos Fortnox och blir godkänd som integrationspartner - det är en process på Fortnox sida, inte något som går att bygga runt. Om/när ni vill gå den vägen: registrera er på fortnox.se/developer/developer-portal så är den processen igång medan vi bygger annat; kopplingen görs då som ett utbytbart modul-lager så andra bokföringssystem kan stödjas på samma sätt.