Oracle3
Open-source trading engine and MCP server for prediction markets. Fee-aware no-arbitrage trading across related contracts, live on Kalshi, Polymarket and Solana or on paper.
Ladda upp eller mejla in leverantörsfakturor - AI läser av och sparar dem automatiskt, organiserat per klient. Byggt för redovisningsbyråer.
Translation pending
FinancePython · HTMLGitHub @shalatiea-a11yOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
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.Read the full 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.