Job-Specific CV Generator
A custom CV generator tailored to job descriptions based on your work experience.
The following case studies highlight standalone machine learning projects, demonstrating data science and AI applications completely separate from the Rewura portfolio.
A custom CV generator tailored to job descriptions based on your work experience.
A comprehensive analysis of employee attrition to help HR departments proactively identify flight risks and understand key drivers of turnover.
A machine learning approach for analyzing Spotify song data to build cohort-based recommendations and explore musical feature patterns.
This portfolio project showcases an AI-powered portfolio management application designed to enhance investment decision-making through
The platform is deployed on AWS with clear separation across edge routing, API access, application services, data persistence, observability, and management tooling.
A modern React-based UI provides a conversational interface, portfolio views, and explainable AI responses tailored for investment workflows.
Python services and Spring Security based authorization separate business capabilities cleanly while enforcing secure access boundaries.
LangGraph drives retrieval, scoring, reasoning, and generation so the system can select the most fitting information before answering.
Infrastructure is defined as code using Terraform, allowing reproducible environments, controlled changes, and clear separation between application evolution and cloud provisioning.
Terraform provisions edge routing, API components, service infrastructure, database resources, and monitoring primitives in a repeatable way.
CloudTrail, CloudWatch, and Trusted Advisor support compliance visibility, cost awareness, and production health review.
AWS-native deployment patterns allow the project to evolve from portfolio showcase to production-grade application architecture.
The ingestion service uses the CryptoNews API to fetch the latest market news every 15 minutes. Incoming articles are chunked, enriched with metadata, and written into Pinecone for retrieval by the LangGraph workflow.
The platform uses a retrieval-and-reasoning graph to normalize user requests, gather candidate documents, score relevance, and decide whether generation should continue or fall back to web search.
The MCP Indicator Service uses scikit-learn's Linear Regression combined with traditional technical indicators (SMA, RSI, MACD) to generate weighted buy/sell signals. The system fetches 5 years of historical data, builds a regression model to detect long-term trends, and scores assets on a 0-100 scale.
{
"ticker": "BTC-USD",
"metrics": {
"current_trade_price": 29.65,
"predicted_linear_price": 32.32,
"sma_50": 31.78,
"sma_200": 43.12,
"rsi_14_day": 39.21,
"macd": -0.56,
"macd_signal": -0.51,
"regression_trend_slope": -0.1018
},
"analysis": {
"macro_trend_context": "BEARISH",
"buy_sell_signal_percentage": 20,
"recommended_target_action": "🔴 DISTRIBUTE / SELL"
}
}
Machine learning models require ongoing validation and retraining to remain accurate. The indicator service demonstrates a production ML workflow where models are continuously monitored for drift, validated against new data, tuned with updated parameters, and redeployed.
Financial markets evolve constantly. A model trained on 2020-2025 data may perform poorly in 2026 due to regime changes, new regulations, or macro shifts. Continuous monitoring detects when predictions diverge from reality, triggering retraining.
Before deploying a new model version, backtesting ensures signals would have produced profitable outcomes historically. This prevents deploying models that overfit recent noise rather than capturing true trends.
When drift is detected (e.g., prediction error exceeds threshold for 7 consecutive days), the system automatically fetches fresh data, retrains the model, validates accuracy, and redeploys via App Runner with zero downtime.
The project follows a contract-first approach where OpenAPI specifications are the source of truth. Changes to contracts trigger automated generation, publishing, and deployment across all services.
openapi/ directory define all API
contracts.generate_stubs.sh uses OpenAPI Generator to create Python
FastAPI stubs and TypeScript fetch clients.publish_contracts.sh authenticates with AWS CodeArtifact and
publishes both Python wheels and NPM packages.UV_INDEX_REWURA_PASSWORD.
The authorization service implements OAuth2 with support for Google and Facebook providers, issuing JWTs that downstream services validate to enforce resource-level access control.
Authorization: Bearer header for all API calls.
/api/auth/check_token endpoint.user_id and verify resource ownership before granting access.
SessionCreationPolicy.STATELESS ensures scalability
without server-side session storage.User stories are connected to secure authorization, validation, rate limiting, consistent error contracts, and observability requirements. The goal is not only correctness, but also operability in production.
{
"type": "security",
"title": "Unauthorized access to a resource",
"status": 401,
"detail": "The user: cf5c709c-c68e-405b-852b-19b6f7fc1bc3 has no access to the resource: 1f95abbb-127f-4f0e-85df-681665f9849b",
"instance": "/api/portfolios/v1/detail/1f95abbb-127f-4f0e-85df-681665f9849b",
"service": "portfolio service",
"trace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"priority": "HIGH",
"errorCode": "ERR-PORT-021",
"context": {
"userId": "cf5c709c-c68e-405b-852b-19b6f7fc1bc3",
"resource_type": "portfolio",
"resource_id": "1f95abbb-127f-4f0e-85df-681665f9849b"
}
}
All services use a centralized error code registry that maps business errors to structured payloads with error codes, priorities, trace IDs, and i18n support. This enables clear edge case handling during story writing and production debugging.
{
"error": {
"type": "https://api.rewura.com/errors/por-unauthenticated",
"title": "Unauthorized Access",
"status": 401,
"detail": "The user cf5c709c-c68e-405b-852b-19b6f7fc1bc3 has no access to resource 1f95abbb-127f-4f0e-85df-681665f9849b",
"instance": "/api/portfolios/v1/detail/1f95abbb-127f-4f0e-85df-681665f9849b",
"service": "portfolio-service",
"trace_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"priority": "HIGH",
"errorCode": "POR_001",
"context": {
"userId": "cf5c709c-c68e-405b-852b-19b6f7fc1bc3",
"resource_type": "portfolio",
"resource_id": "1f95abbb-127f-4f0e-85df-681665f9849b"
}
}
}