Skip to content

tharinduxn/internly

Repository files navigation

CareerAI (InternX)

Your AI-powered career companion — find internships, practice interviews, track applications, and grow your career, all in one app.

Flutter Dart Supabase License


📋 Table of Contents


Overview

CareerAI is a Flutter mobile application designed to help students and early-career professionals find the right internships, prepare for interviews, and track their applications — all powered by AI matching and a modern, intuitive UI.

The app uses Supabase for authentication, Riverpod for state management, and GoRouter for navigation.


Features

🏠 Home Dashboard

  • Personalized greeting with user name from Supabase auth
  • Career readiness score and XP tracking
  • Quick action cards (Mock Interview, Quiz, Discover, Track)
  • Upcoming deadlines and interviews
  • Top internship matches with AI match percentages
  • Notification bell with tappable items

🔍 Discover

  • Search internships by company or role (live filtering)
  • Filter by 7 categories: Engineering, Design, Marketing, Data Science, Product, Finance
  • 10 sample internships with AI match scores
  • Tap any card to view full details (description, requirements, save, apply)

🎯 Practice

  • 3 tabs: Interview, Quizzes, Challenges
  • Full quiz system with multiple-choice questions
  • Color-coded right/wrong answers with explanations
  • Progress bar, score tracking, results screen
  • Topics: Behavioral, DSA, System Design, HR, Flutter, JavaScript, UI/UX, SQL, and more
  • Try Again / Back to Practice flow

📊 Tracker

  • Add new applications with company, role, URL, and notes
  • 5 status categories: Applied, Screening, Interview, Offer, Rejected
  • Filter by status with summary cards
  • Tap any application to view details & update status
  • Edit notes, delete with undo support
  • Long-press for quick delete

👤 Profile

  • User info from Supabase auth (name, email, initial)
  • Edit Profile — update display name (saves to Supabase)
  • Education — add/remove education entries
  • Skills — manage skills with chips + suggested skills
  • Resume/CV — CV Tips (6 tips), CV Checklist (9 items with progress)
  • Notifications — toggle push, email, deadline reminders
  • Appearance — light/dark/system theme selector
  • Language — 8 language options
  • Help & FAQ — 6 expandable FAQ items
  • Send Feedback — emoji rating + text form
  • About — app info dialog
  • Sign Out — confirmation dialog

💬 AI Chat Assistant

  • Smart contextual responses (interview, CV, skills, internships)
  • Markdown rendering for rich responses
  • Auto-scroll, typing indicator
  • Quick prompt chips for common questions
  • Clear conversation support

🔐 Authentication

  • Email/password sign-in and sign-up
  • Input validation (empty check, 6-char password minimum)
  • Friendly error messages for common Supabase errors
  • OAuth buttons (Google, GitHub) with graceful error handling
  • Auth state-driven routing (auto redirect)

Screenshots

Add your screenshots here after running the app.

Home Discover Practice
Home Discover Practice
Tracker Profile Chat
Tracker Profile Chat

Tech Stack

Technology Purpose
Flutter 3.x Cross-platform UI framework
Dart 3.x Programming language
Supabase Authentication (email/password, OAuth)
flutter_riverpod State management
go_router Declarative routing with auth guards
flutter_markdown Markdown rendering in chat
fl_chart Charts and data visualization
Material 3 Modern design system

Project Structure

lib/
├── main.dart                          # App entry point, Supabase init
├── core/
│   ├── providers/
│   │   └── auth_provider.dart         # Auth state, AuthService, user getters
│   ├── router/
│   │   └── app_router.dart            # GoRouter config with auth redirect
│   └── theme/
│       └── app_theme.dart             # AppColors, light/dark themes, gradients
├── features/
│   ├── auth/
│   │   └── presentation/
│   │       └── auth_screen.dart       # Login/signup screen
│   ├── chat/
│   │   └── presentation/
│   │       └── chat_screen.dart       # AI career assistant chat
│   ├── discover/
│   │   └── presentation/
│   │       └── discover_screen.dart   # Internship search & filtering
│   ├── home/
│   │   └── presentation/
│   │       └── home_screen.dart       # Home dashboard
│   ├── practice/
│   │   └── presentation/
│   │       └── practice_screen.dart   # Quiz system with 3 tabs
│   ├── profile/
│   │   └── presentation/
│   │       └── profile_screen.dart    # User profile & settings
│   └── tracker/
│       └── presentation/
│           └── tracker_screen.dart    # Application tracker
└── shared/
    └── widgets/
        ├── deadline_card.dart         # Upcoming deadline display
        ├── internship_card.dart       # Internship card with bookmark/apply
        ├── mobile_shell.dart          # Bottom nav bar shell
        ├── progress_ring.dart         # Circular progress indicator
        └── quick_action_card.dart     # Quick action card with onTap

Prerequisites

Before you begin, make sure you have the following installed:

  1. Flutter SDK (3.x or later)

    # Check your version
    flutter --version
  2. Dart SDK (3.x or later — included with Flutter)

  3. A code editor — VS Code (recommended) or Android Studio

  4. Platform tools:

    • Android: Android Studio with Android SDK
    • iOS: Xcode (macOS only)
    • Web: Chrome browser
    • Windows: Visual Studio with C++ desktop workload
  5. A Supabase accounthttps://supabase.com (free tier works)


Getting Started

1. Clone the repository

git clone https://github.com/your-username/internx.git
cd internx

2. Install dependencies

flutter pub get

3. Configure Supabase (see section below)

4. Run the app

flutter run

Supabase Configuration

The app uses Supabase for authentication. Follow these steps to set up your own Supabase project:

Step 1: Create a Supabase Project

  1. Go to https://supabase.com and create a new project
  2. Note your Project URL and Anon Key from Settings > API

Step 2: Update the app with your credentials

Open lib/main.dart and replace the Supabase credentials:

await Supabase.initialize(
  url: 'YOUR_SUPABASE_PROJECT_URL',        // e.g. https://xxxx.supabase.co
  anonKey: 'YOUR_SUPABASE_ANON_KEY',       // starts with eyJ...
);

Step 3: Enable Email/Password Auth

  1. In your Supabase dashboard, go to Authentication > Providers
  2. Make sure Email provider is enabled
  3. (Optional) Disable "Confirm email" for faster testing:
    • Go to Authentication > Settings
    • Toggle off "Enable email confirmations"

Step 4: (Optional) Enable Google OAuth

  1. Go to Google Cloud Console
  2. Create a new project or select existing
  3. Go to APIs & Services > Credentials
  4. Create an OAuth 2.0 Client ID (Web application type)
  5. Add authorized redirect URI:
    https://YOUR_PROJECT_REF.supabase.co/auth/v1/callback
    
  6. Copy the Client ID and Client Secret
  7. In Supabase dashboard → Authentication > Providers > Google
  8. Enable Google and paste the Client ID and Client Secret

Step 5: (Optional) Enable GitHub OAuth

  1. Go to GitHub Developer Settings
  2. Create a new OAuth App
  3. Set the callback URL to:
    https://YOUR_PROJECT_REF.supabase.co/auth/v1/callback
    
  4. Copy Client ID and Client Secret
  5. In Supabase dashboard → Authentication > Providers > GitHub
  6. Enable GitHub and paste the credentials

Running the App

Android

flutter run -d android

iOS (macOS only)

flutter run -d ios

Web

flutter run -d chrome

Windows

flutter run -d windows

All devices

# List available devices
flutter devices

# Run on a specific device
flutter run -d <device_id>

Environment Variables

Variable Location Description
SUPABASE_URL lib/main.dart Your Supabase project URL
SUPABASE_ANON_KEY lib/main.dart Your Supabase anonymous/public key

Note: For production, consider using --dart-define or a .env file with a package like flutter_dotenv to avoid hardcoding credentials.


Architecture

State Management — Riverpod

Provider Tree:
├── supabaseClientProvider          → Supabase client instance
├── authStateProvider (Stream)      → Listens to auth state changes
├── currentUserProvider             → Current logged-in user
├── authServiceProvider             → AuthService with sign in/up/out methods
└── appRouterProvider               → GoRouter with auth-gated redirects

Navigation — GoRouter

Routes:
├── /auth                           → AuthScreen (login/signup)
├── /chat                           → ChatScreen (AI assistant)
└── ShellRoute (MobileShell)        → Bottom navigation bar
    ├── /                           → HomeScreen
    ├── /discover                   → DiscoverScreen
    ├── /practice                   → PracticeScreen
    ├── /tracker                    → TrackerScreen
    └── /profile                    → ProfileScreen

Auth Flow:

  • refreshListenable pattern with ValueNotifier — re-evaluates redirects on auth state changes without recreating the router
  • If not logged in → redirect to /auth
  • If logged in and on /auth → redirect to /
  • Loading state is handled gracefully (no redirect while loading)

Design System

  • Material 3 with custom color scheme
  • AppColors — Primary (Indigo), Secondary (Coral), Success (Emerald), Warning (Amber)
  • Card & Button themes — Rounded corners (14-20px), no elevation, soft borders
  • Gradient decorationsgradientPrimary and gradientHero for accent areas

Key Dependencies

dependencies:
  supabase_flutter: ^2.3.0      # Authentication & backend
  flutter_riverpod: ^2.4.9      # State management
  go_router: ^13.0.0            # Declarative routing
  fl_chart: ^0.66.0             # Charts
  flutter_markdown: ^0.6.18     # Markdown rendering in chat
  http: ^1.2.0                  # HTTP requests
  intl: ^0.18.1                 # Internationalization
  cached_network_image: ^3.3.1  # Image caching
  flutter_svg: ^2.0.9           # SVG support

Troubleshooting

"Invalid login credentials" error

→ The email/password doesn't exist. Try Sign Up first, then Sign In.

"User already registered" error

→ Account exists. Switch to Sign In mode.

"Email not confirmed" error

→ Check your email for a confirmation link, or disable email confirmations in Supabase settings.

"Unsupported provider" error on Google/GitHub

→ OAuth is not enabled in your Supabase dashboard. See Supabase Configuration above.

Build fails with font asset errors

→ The app does not use custom fonts. If you see font-related errors, ensure no font declarations exist in pubspec.yaml.

"CardTheme" type error

→ Flutter 3.x renamed CardTheme to CardThemeData. This is already fixed in the codebase.


Contributing

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature/amazing-feature
  3. Commit your changes: git commit -m 'Add amazing feature'
  4. Push to the branch: git push origin feature/amazing-feature
  5. Open a Pull Request

License

This project is licensed under the MIT License. See the LICENSE file for details.


Roadmap

  • Real AI integration (OpenAI / Gemini API) for chat
  • Persistent data storage (Supabase database tables)
  • Push notifications
  • Resume/CV PDF generation
  • Dark mode toggle (wired to app state)
  • User onboarding flow
  • Bookmarked internships page
  • Real-time application status updates

Built with ❤️ using Flutter & Supabase

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages