A personalized financial decision advisor that generates actionable roadmaps based on your financial profile.
Ascend.ai is a full-stack application featuring a custom-built recommendation engine that analyzes user financial profiles and generates personalized, staged roadmaps with logical dependencies. Built for nwHacks 2026.
- Overview
- Features
- Architecture
- Installation
- Usage
- API Documentation
- Project Structure
- Development
- Configuration
- Testing
- Deployment
- Contributing
- License
Ascend.ai solves the problem of inaccessible, expensive, or generic financial advice by providing a personalized recommendation engine that adapts to each user's unique financial situation. The system combines structured heuristic logic with intelligent personalization to deliver transparent, actionable financial guidance.
- Custom Recommendation Engine: Built from scratch, not a wrapper around generic APIs
- Dependency-Aware Recommendations: Uses DAG (Directed Acyclic Graph) structure to ensure logical action sequencing
- Multi-Factor Scoring: Evaluates recommendations across 8 weighted dimensions
- Real-Time Adaptation: Instant roadmap updates when users adjust their profile
- Transparent & Explainable: Every recommendation includes score breakdowns and reasoning
- Personalized Financial Roadmaps: Staged recommendations organized by time horizon (Short-Term, Medium-Term, Long-Term)
- Interactive Profile Management: Adjust age, income, debt, and investments with real-time roadmap updates
- Risk Tolerance Slider: Visual slider to set risk preference (Low/Medium/High) with instant adaptation
- Dependency Visualization: Interactive node graph showing how actions connect and depend on each other
- Educational Resources: Curated links to trusted financial resources for each recommendation
- User Authentication: Secure login via Firebase with Google OAuth
- Profile Setup: Comprehensive onboarding to capture financial situation
- Modular Engine Architecture: Extensible components for easy customization
- RESTful API: Clean, documented endpoints for engine integration
- Sub-100ms Response Times: Optimized for real-time updates
- Input Normalization: Handles diverse input formats intelligently
- Dynamic Action Generation: Creates personalized goals based on user context
- Cycle Detection: Ensures logical consistency in recommendation sequences
- Handles diverse input formats (ranges, free text, categorical)
- Normalizes financial data into standardized metrics
- Computes financial health indicators
- Creates evaluation context for downstream components
- Extensible registry of 50+ financial actions
- Each action includes: category, risk level, expected return, effort hours, complexity, dependencies
- Dynamic action generation based on user goals
- Filtering system for applicable actions
Evaluates each action across 8 weighted dimensions:
- Base Priority (0-100)
- Risk Alignment
- Goal Alignment
- Profile Fit
- Urgency Score
- Impact Potential
- Feasibility Score
- Priority Area Match
- Constructs dependency graph of financial actions
- Cycle detection and resolution
- Topological sorting for optimal sequencing
- Path optimization and parallel action identification
- Groups scored actions by time horizon
- Applies diversity filters
- Generates sequential paths
- Creates personalized descriptions
- Adds estimated timelines
- Generates contextual descriptions
- Adjusts language based on financial literacy
- Node.js (v16 or higher)
- Python (3.10 or higher)
- npm or yarn
- Firebase account (for authentication)
git clone https://github.com/yourusername/ascend.ai.git
cd ascend.ai- Create a Firebase project at Firebase Console
- Enable Google Authentication
- Create a Firestore database
- Copy your Firebase configuration
cd client
npm installCreate a .env file in the client directory:
REACT_APP_ENGINE_API_URL=http://localhost:5001/api
REACT_APP_FIREBASE_API_KEY=your_api_key
REACT_APP_FIREBASE_AUTH_DOMAIN=your_auth_domain
REACT_APP_FIREBASE_PROJECT_ID=your_project_id
REACT_APP_FIREBASE_STORAGE_BUCKET=your_storage_bucket
REACT_APP_FIREBASE_MESSAGING_SENDER_ID=your_sender_id
REACT_APP_FIREBASE_APP_ID=your_app_idUpdate client/src/firebase.js with your Firebase configuration.
cd engine
pip install flask flask-corsOr install from requirements:
pip install -r requirements.txtTerminal 1 - Start Engine API:
cd engine
python api.pyThe engine API will start on http://localhost:5001
Terminal 2 - Start React Frontend:
cd client
npm startThe frontend will start on http://localhost:3000
- Landing Page: Visit the application and click anywhere to continue
- Authentication: Sign in with Google to create an account
- Profile Setup: Complete your financial profile:
- Age range
- Location
- Property value
- Vehicle value
- Investments
- Debt
- Monthly salary
- Dependents status
- User Input: Provide your financial situation:
- Current situation (free text)
- Future goals (free text)
- Risk tolerance (slider: Low/Medium/High)
- Explore Roadmap: View your personalized recommendations organized by time horizon
- Adjust Profile: Use the toggles in the visualization page to adjust your profile and see real-time updates
from engine import AscendEngine, create_profile, create_query
# Create user profile
profile = create_profile(
age_range="30-34",
location="Vancouver, BC",
monthly_salary="$4k-$5k",
debt="$25k-$50k",
investments="$5k-$10k",
has_dependents=False
)
# Create query
query = create_query(
risk_tolerance="medium",
current_situation="I have student loans and some savings",
goal="Pay off debt and start investing"
)
# Initialize engine
engine = AscendEngine()
# Generate recommendations
result = engine.process(profile, query)
# Access recommendations
print("Short-term actions:", len(result.short_term))
print("Medium-term actions:", len(result.medium_term))
print("Long-term actions:", len(result.long_term))# Health check
curl http://localhost:5001/api/health
# Get recommendations
curl -X POST http://localhost:5001/api/recommend \
-H "Content-Type: application/json" \
-d '{
"age_range": "30-34",
"monthly_salary": "$4k-$5k",
"debt": "$25k-$50k",
"investments": "$5k-$10k",
"risk_tolerance": "medium",
"current_situation": "I have student loans",
"goal": "Pay off debt and start investing"
}'Health check endpoint.
Response:
{
"status": "ok",
"engine": "Ascend Engine v1.0"
}Generate personalized financial recommendations.
Request Body:
{
"age_range": "30-34",
"location": "Vancouver, BC",
"property_value": "prefer_not_to_say",
"vehicle_value": "prefer_not_to_say",
"investments": "$5k-$10k",
"debt": "$25k-$50k",
"monthly_salary": "$4k-$5k",
"has_dependents": false,
"employment_stability": 0.7,
"risk_tolerance": "medium",
"current_situation": "I have student loans and some savings",
"goal": "Pay off debt and start investing"
}Response:
{
"immediate": [...],
"short_term": [
{
"action_id": "action_001",
"name": "Build Emergency Fund",
"description": "Start building an emergency fund...",
"personalized_description": "Given your $4k-$5k monthly income...",
"score": 85.5,
"score_breakdown": {...},
"prerequisites": [],
"estimated_timeline": "3-6 months"
}
],
"medium_term": [...],
"long_term": [...],
"extended_term": [...],
"sequential_path": [...],
"profile_summary": {...},
"processing_time_ms": 45.2
}ascend.ai/
├── client/ # React frontend
│ ├── public/ # Static assets
│ ├── src/
│ │ ├── components/ # React components
│ │ │ ├── AccountPage/
│ │ │ ├── ProfileSetup/
│ │ │ ├── UserInputPage/
│ │ │ └── Visualization/
│ │ ├── App.js # Main app component
│ │ ├── firebase.js # Firebase configuration
│ │ └── index.js # Entry point
│ └── package.json
│
├── engine/ # Python recommendation engine
│ ├── api.py # Flask REST API
│ ├── core/ # Core engine components
│ │ ├── engine.py # Main orchestrator
│ │ ├── normalizer.py # Input normalization
│ │ ├── action_registry.py # Action registry
│ │ ├── scorer.py # Multi-factor scorer
│ │ ├── dag_builder.py # DAG construction
│ │ └── recommender.py # Recommendation generation
│ ├── models/ # Data models
│ ├── utils/ # Utility functions
│ ├── config/ # Configuration files
│ │ └── actions.json # Action definitions
│ └── requirements.txt
│
├── server/ # Optional Node.js server
│ └── src/
│ └── index.js
│
├── .gitignore
├── LICENSE
└── README.md
- Install Dependencies
# Frontend
cd client
npm install
# Backend
cd engine
pip install -r requirements.txt- Environment Variables
Set up environment variables as described in the Installation section.
- Run in Development Mode
# Terminal 1: Engine API (with auto-reload)
cd engine
python api.py # Flask runs in debug mode
# Terminal 2: React Frontend (with hot reload)
cd client
npm start- App.js: Main application component with routing and state management
- ProfileSetup/: Multi-step profile setup with confirmation
- UserInputPage/: Financial situation and goals input with risk slider
- Visualization/: Interactive roadmap visualization with profile toggles
- AccountPage/: User account management
- engine.py: Main orchestrator that coordinates all components
- normalizer.py: Input normalization and profile analysis
- action_registry.py: Action registry and filtering
- scorer.py: Multi-factor scoring algorithm
- dag_builder.py: DAG construction and optimization
- recommender.py: Recommendation generation and grouping
- Edit
engine/config/actions.json - Add a new action with required fields:
{
"id": "action_xxx",
"name": "Action Name",
"description": "Action description",
"category": "savings",
"risk_level": "low",
"horizon": "short_term",
"dependencies": [],
"base_priority": 75,
"parameters": {}
}- Restart the engine API
from engine.models import ScoringWeights
from engine.core.engine import AscendEngine
# Create custom weights
weights = ScoringWeights(
base_priority_weight=0.15,
risk_tolerance_weight=0.20,
goal_alignment_weight=0.25,
profile_fit_weight=0.15,
urgency_weight=0.10,
impact_weight=0.10,
feasibility_weight=0.05
)
# Initialize engine with custom weights
engine = AscendEngine(scoring_weights=weights)The engine can be configured through:
- Actions Configuration:
engine/config/actions.json - Scoring Weights: Passed during engine initialization
- API Settings: Modified in
engine/api.py
- API URL: Set via
REACT_APP_ENGINE_API_URLenvironment variable - Firebase: Configured in
client/src/firebase.js
cd engine
python -m pytest tests/cd client
npm test- Test profile setup flow
- Test risk slider interaction
- Test real-time roadmap updates
- Test API endpoints with curl or Postman
- Build the React app:
cd client
npm run build-
Deploy the
buildfolder to your hosting service -
Set environment variables in your hosting platform
- Create
Procfile:
web: python engine/api.py
- Deploy:
heroku create ascend-engine
git push heroku main- Create
Dockerfile:
FROM python:3.10
WORKDIR /app
COPY engine/ .
RUN pip install flask flask-cors
EXPOSE 5001
CMD ["python", "api.py"]- Build and run:
docker build -t ascend-engine .
docker run -p 5001:5001 ascend-engineDeploy as a containerized service or serverless function following your cloud provider's documentation.
We welcome contributions! Please follow these steps:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Follow existing code style and conventions
- Add tests for new features
- Update documentation as needed
- Ensure all tests pass before submitting
This project is licensed under the MIT License - see the LICENSE file for details.
- Built for nwHacks 2026
- Inspired by the need for accessible, personalized financial advice
- Thanks to the open-source community for excellent tools and libraries
- Add more financial actions to registry
- Integrate financial APIs for automatic profile updates
- Add progress tracking and milestone celebrations
- Improve mobile responsiveness
- Machine learning integration for improved personalization
- A/B testing framework for recommendation optimization
- Analytics dashboard for recommendation effectiveness
- Multi-user support (couples, families)
- Regulatory compliance modules
- Mobile SDK for app integration
- White-label solution for financial institutions
- Advanced tax optimization strategies
ascend.ai allows you to make the right steps so that you can reach your next financial peak.


