← Tillbaka till portfolion

Nova Report - Examensarbete för nyhetsanalys och notifiering

Ett examensarbete inom systemintegration som fokuserar på att bygga en modulär mikrotjänst-arkitektur där nyhetsdata, AI-analys, kryptobetalningar och notifieringar kopplas samman till en enhetlig plattform. Målet är att visa hur flera externa API:er och datakällor kan integreras säkert, skalbart och automatiserat.

Projektmål

Teknisk miljö

Arkitektur

Plattformen är uppbyggd som ett nätverk av mikrotjänster där varje komponent har ett tydligt ansvar. reporter-service agerar som datainsamlare och analysmotor, subscriptions-service hanterar användarens aktiva prenumerationer, och notifications-service distribuerar sammanställd information till användaren. Betaltjänsterna för XMR och BTC hanterar betalningar. Jag valde att integrera betalningar via kryptovaluta i detta projekt då jag redan integrerat Stripe för kort och Klarna-betalningar i mina tidigare projekt och jag vill hela tiden lära mig nya saker.

Utvecklingssteg

Projektet utvecklas iterativt i fyra definierade faser, från ett funktionellt minimum till en marknadsfärdig produkt. Varje steg representerar ett färgkodat stadium i arkitekturdiagrammet.

Tidslinje

Centrala frågeställningar

Kryptomarknaden och tekniksektorn präglas av en enorm informationsmängd, tusentals artiklar, forumtrådar och sociala flöden som ofta är partiska, fragmenterade eller fyllda med brus. Nova Report undersöker hur moderna integrationsmönster och AI kan användas för att strukturera detta informationskaos och leverera faktabaserade insikter i realtid.

Plattformen fungerar som en “Crypto Briefing-as-a-Service”: den samlar nyheter från flera källor, filtrerar bort upprepningar och brus, låter en AI-modul skriva sammanfattningar och levererar sedan resultatet direkt till användaren via E-post, Discord eller dashboard. Det är ett praktiskt exempel på hur AI, dataintegration och säkerhetsdesign kan samverka i en verklig miljö.

Vad betyder “Crypto Briefing-as-a-Service”?
Uttrycket är en lek med SaaS-begreppet (Software as a Service), alltså molnbaserade tjänster som levererar färdig funktionalitet till användaren utan att denne behöver installera något själv. “Crypto Briefing-as-a-Service” betyder därför i praktiken: en automatiserad tjänst som samlar, filtrerar, analyserar och sammanfattar nyheter från kryptovärlden och levererar färdiga, lättlästa rapporter direkt till användaren.

Utvecklingslogg

Kort veckologg över projektets framsteg. Klicka på en vecka för att läsa mer.

Vecka 1 – Planering och grundläggande arkitektur

  • Fokus: Denna vecka har jag fokuserat på att skapa grunderna i projektet, mycket har handlat om att sätta upp en plan som går att genomföra under de kommande 8 veckorna och hur jag ska göra det. Eftersom jag gör detta projekt helt själv så har jag bestämt mig för att använda Githubs Copilot-funktion för att agera som en senior utvecklare som kollar igenom mina PR och gör reviews. Eftersom jag gillar att vara strukturerad så gjorde jag också en grundläggande "mindmap" över projektet så jag lätt kan ta en titt och få bekräftat visuellt att jag är på rätt väg. Jag har också en tanke om att kanske sätta upp en "kanbanboard" för att göra det enklare att se vilka uppgifter som är klara och vilka som är på gång.

  • Hinder: Än så länge har jag inte stött på några större hinder utan det har mest handlat om att få ner vad jag har i huvudet "på papper" och att göra en grundläggande planering.

  • Nästa steg: Under kommande vecka så tänker jag försöka bli klar med en UMVP där en användare kan registrera sig, logga in och se en genererad rapport från endast en informationskälla direkt på en minimal frontend.
Vecka 2 – Fungerande UMVP rullar lokalt

  • Fokus: Under denna vecka har jag färdigställt en UMVP där en användare kan registrera sig, logga in och se en genererad rapport från endast en informationskälla direkt på en minimal frontend. Under helgen så fick jag också ai-integrationen att fungera där jag använder gpt-4o-mini-modellen från 1minAI för att sammanställa en rapport med reporter-service. Jag valde att integrera 1minAI då jag har massa gratiskredit liggandes på den tjänsten.

  • Hinder: Största hindret denna vecka har varit att få Copilot på Github att bli nöjd med koden. Varje gång jag har gjort en commit så fick jag mellan 8-14 kommentarer från Copilot att åtgärda. När jag fixat dom så fick jag ytterligare ett gäng. Så det tog väldigt lång tid att få en "accepterad" PR.

  • Nästa steg: Denna vecka tänker jag fokusera på att försöka få till CI/CD, ett flöde mellan min laptop, github actions, vidare till dockerhub och till sist till en ubuntu-server på Contabo. Om jag hinner så vill jag också lägga till mer nyhetskällor för att få en mer omfattande rapport.
Vecka 3 – Migrering till Postgres och mer nyhetskällor

  • Fokus: Denna vecka har jag lagt fokus på att migrera från H2 till Postgres i produktionsmiljön och att lägga till mer nyhetskällor. Nu har jag fått in alla 4 rss-flöden och ett externt api för att hämta nyheter som jag sedan kan skapa en rapport av. Jag har också lagt grunderna till ett audit-system av min kod där ai hjälper mig att skapa en rapport av min kod och ger mig en åtgärdslista för att förbättra koden. Detta är något som jag tycker är väldigt intressant och kan förhoppningsvis viderautveckla under kommande veckor. Jag har också hunnit få till en fungerande pipeline mellan min laptop, github actions, vidare till dockerhub och till sist till en ubuntu-server. Detta har jag gjort i flera tidigare projekt så det gick relativt snabbt.

  • Hinder: Migrering till Postgres tog mer tid än planerat, mest för att jag inte jobbat med Postgres tidigare och jag hade inte koll på alla miljövariabler osv. Jag hade mycket strul med autentisering mot databasen och det tog nästan en hel dag att få till.

  • Nästa steg: Nästa vecka kommer till stor del bestå av att få till en 100% fungerande monero-betalning, jag misstänker att det arbetet kommer äta upp flera dagar då det inte verkar lika straightforward som att lägga till en Stripe integration till exempel. Jag har redan satt upp en del av betalningsflödet i både backend och frontend, men där själva betalningsmomentet är mockat.
Vecka 4 – Från UMVP till MVP/MMP

  • Fokus: Vecka 4 i detta projekt så gick jag från en UVMP till en MVP/MMP där systemet nu skapar en rapport av nyheter från flera källor. Det går att betala med monero, till systemets egna wallet i en egen container, men jag har stannat på stagenet (monero utan monetärt värde används) för att hålla nera mina kostnader under alla tester jag utför. Att gå från stagenet till mainnet (där riktiga xmr använd) är bara en fråga om att ändra några miljövaribler.

    Sedan förut så kan alla användare se rapporten i frontend men nu kan systemet också generera en rapport anpassad för Discord och levererar den till en kanal var fjärde timme. Meningen här är att en betalande medlem får tillgång till denna kanalen vid lyckad prenumeration. Jag har en tanke om att skapa en bot som man kan skicka ett kommando för att se rapporten men det får bli en nice-to-have-funktion att implementera om jag får tid över i projektet.

    Systemet skickar nu också ut en daglig rapport via email till registrerade medlemmar. Jag har också utfört flera stycken audits på koden och implementerat föreslagna förbättringar. Jag har infört tester med en ungefärlig kodtäckning på 80% på både frontend och backend-kod.

  • Hinder: Det har inte dykt upp några egentliga hinder denna vecka men jag har lagt extremt mycket tid på projektet. Dels för att jag tycker det är kul men också för att se till att ligga bra till i planeringen så jag inte halkar efter.

  • Nästa steg: Nästan alla funktioner som jag hade tänkt att ha i systemet på en MMP-nivå finns nu tillgängliga i minimal version men allt måste putsas och testas ordentligt. Så fokus denna vecka kommer ligga på att finjustera funktioner och koden så allt fungerar så nära felfritt som möjligt. Om jag har tid så kommer jag även att putsa frontend så att den blir mer användarvänlig och kanske lägga till ett admin-gränssnitt för att kunna se metrics osv.
Vecka 5 – Mer premiumflöde: e-post, Discord och metrics

  • Fokus: Den här veckan har jag lagt mycket tid på att få “premiumdelen” att kännas på riktigt. Jag har byggt in dagliga e-postutskick av rapporten (opt-in) och börjat göra systemet mer driftsbart genom att lägga till Prometheus metrics för bl.a. auth, payments och Monero RPC. Jag har också fortsatt bygga på Discord-delen så att rapporten faktiskt går att posta utan att Discord API:t ballar ur (längd/trunkering osv).

  • Hinder: Det som tar tid här är inte att skriva en endpoint, utan att få hela kedjan stabil: generera rapport → spara → distribuera → se till att det blir rätt format i Discord och att mailen blir läsbar. Det blir mycket testande och “småfix” som man inte ser förrän man kör allt tillsammans.

  • Nästa steg: Nästa vecka vill jag fortsätta med kvalitet och säkerhet (rate limiting, hårdare config osv) och samtidigt fortsätta göra betalning/premium-flödet mer robust.
Vecka 6 – Sjukvecka (lågt tempo, men jag hann ändå peta lite)

  • Fokus: Den här veckan blev tyvärr inte som planerat eftersom jag var sjuk, så tempot var riktigt lågt. Men jag hann ändå få in några smågrejer som jag tycker är viktiga för att systemet ska kännas mer “på riktigt”. Jag förenklade bl.a. JWT-hanteringen (claims) så det blir mindre krångligt i koden, jag la till stöd för att styra minsta antal confirmations för Monero via env-variabel, och jag hann även förbättra brute-force-skyddet/rate limiting för inloggningen (och uppdatera audit-listan så det faktiskt blev “avbockat”).

  • Hinder: Sjukdomen var såklart det stora hindret. Jag orkade inte köra långa pass, så det blev mer “småfix när jag kunde” än att driva stora features framåt.

  • Nästa steg: Eftersom jag låg före plan innan detta hände så kunde jag ändå anpassa utan att de viktigaste delmålen behövde flyttas. Nästa vecka går jag tillbaka till att jobba mer fokuserat och få upp farten igen.
Vecka 7 – Adminpanel, Discord-invite + Stripe

  • Fokus: Den här veckan har jag lagt mycket tid på att göra premiumflödet och helheten mer “på riktigt”. Jag har byggt ett adminpanel-flöde med rollbaserad access och metrics/nyckeltal (och puts som tooltips så det blir begripligt). Jag fick också till ett riktigt Discord-invite-flöde (knapp/handling i profil/settings + notifiering via e-post) så att premium faktiskt kan få access till Discord-kanalen på ett kontrollerat sätt. Utöver det hann jag implementera Stripe som alternativ betalning (PaymentIntent + webhook-hantering) och se till att tjänsten byggs/pushas i CI/CD som resten.

  • Hinder: Här märks det att “sista 10%” tar tid. Det är inte svårt att få en knapp att synas, men det tar tid att få hela kedjan stabil och tydlig för användaren (och att det inte blir konstiga edge cases i UI:t).

  • Nästa steg: Nästa vecka vill jag fokusera på slutspurten: dokumentation och presentationsmaterial/slutrapport, och samtidigt göra sista driftsputsen så jag kan känna mig trygg när jag kör demon.
Vecka 8 – Slutspurt: dokumentation/presentation + mainnet-puts och sista stabilisering

  • Fokus: Den här veckan har handlat mer om att landa projektet än att jaga nya features. Jag har uppdaterat och städat dokumentation så att den speglar hur systemet faktiskt fungerar nu (bl.a. Stripe, kodkvalitetsflödet osv). Jag har också jobbat med presentationsmaterial och manus, inklusive att formatera om så det går att klistra in i Canva utan att allt ser konstigt ut. På systemsidan har jag dessutom lagt tid på driftsrelaterade justeringar runt Monero-flödet inför mainnet: justera config/amounts, fixa polling så det bygger på en riktig expiration-timeout i stället för “X försök”, och lägga in wallet refresh innan pending-betalningar checkas. Det är exakt den typen av grejer som gör att systemet känns stabilt på riktigt.

  • Hinder: Sista veckan är alltid lite kaosig för att allt ska bli klart samtidigt (rapport, presentation, sista fixes). Jag har försökt vara hård med prioriteringar så att det jag visar upp faktiskt känns stabilt och inte “funkar bara på min dator”.

  • Nästa steg: Genomföra presentationen och lämna in allt, och sen skriva ner reflektioner kring vad som gick bra och vad jag hade gjort annorlunda om jag startade om projektet.