Project Tattoo

A modern reimplementation of TAT — the course helper app for Taipei Tech students

What is this?

Project Tattoo is a work-in-progress Flutter app that helps Taipei Tech (NTUT) students access their course schedules and academic information. This is a ground-up reimplementation with a focus on:

  • Modern, maintainable code — Clean architecture and best practices
  • Developer-friendly — Easy for future club members to understand and contribute
  • Concise implementation — No unnecessary complexity

Getting Started

This project uses mise to manage development tools (Flutter, Java, Ruby).

# Install and activate mise (if not already)
# See: https://mise.jdx.dev/getting-started.html

# Install Flutter, Java, and Ruby
mise install

# Install Flutter dependencies
flutter pub get

# Install Ruby dependencies (fastlane)
bundle install

# Fetch credentials (Firebase configs, keystores)
# Requires a properly configured .env file
dart run tool/credentials.dart fetch

# Run the app
flutter run

Firebase & Credentials

This project uses a private Git repository to manage sensitive credentials (signing keys, service accounts, and Firebase configuration files).

  1. Request Access: Contact the maintainers for access to the tattoo-credentials repository.
  2. Configure .env: Copy .env.example to .env and fill in the MATCH_GIT_URL and MATCH_PASSWORD.
  3. Fetch Configs: Run dart run tool/credentials.dart fetch. This will decrypt and place files like google-services.json and keystore.jks in their respective directories.

Firebase Setup (Maintainers only)

If you need to reconfigure Firebase:

  1. Install the Firebase CLI.
  2. Install the FlutterFire CLI.
  3. Run flutterfire configure to update lib/firebase_options.dart.
  4. Encrypt and push new config files using dart run tool/credentials.dart encrypt <file> <path_in_repo>.

Local Development

Android SDK: Install Android Studio or let Flutter download SDK components automatically on first build.

VS Code users: See .vscode/README.md for project-specific setup instructions.

Contributors: See CONTRIBUTING.md for commit and branch guidelines.

Project Context

Check AGENTS.md to see detailed architecture notes, implementation status, and future plans.

This project exists alongside two other implementations:

Project Tattoo aims to take lessons learned from both and create a clean, maintainable foundation for future development.

License

Copyright (C) 2026 NTUT Programming Club (NTUT-NPC)

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

See LICENSE for details.

Libraries

components/app_skeleton
components/notices
components/option_entry_tile
components/section_header
database/actions
database/database
database/schema
Database schema definitions for Tattoo.
database/views
firebase_options
i18n/strings.g
Generated file. Do not edit.
i18n/strings_en.g
Generated file. Do not edit.
main
models/course
models/ranking
models/score
models/user
repositories/auth_repository
repositories/course_repository
repositories/preferences_repository
router/animated_shell_container
router/app_router
screens/main/course_table/course_table_screen
screens/main/home_screen
screens/main/profile/profile_card
screens/main/profile/profile_providers
screens/main/profile/profile_screen
screens/main/score/score_screen
screens/welcome/intro_screen
screens/welcome/login_screen
services/course_service
services/firebase_service
services/i_school_plus_service
services/portal_service
services/student_query_service
utils/fetch_with_ttl
utils/http
utils/localized
utils/shared_preferences