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).
- Request Access: Contact the maintainers for access to the
tattoo-credentialsrepository. - Configure
.env: Copy.env.exampleto.envand fill in theMATCH_GIT_URLandMATCH_PASSWORD. - Fetch Configs: Run
dart run tool/credentials.dart fetch. This will decrypt and place files likegoogle-services.jsonandkeystore.jksin their respective directories.
Firebase Setup (Maintainers only)
If you need to reconfigure Firebase:
- Install the Firebase CLI.
- Install the FlutterFire CLI.
- Run
flutterfire configureto updatelib/firebase_options.dart. - 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:
- NEO-TAT/tat_flutter — The original TAT app
- NTUT-NPC/tat2_flutter (QAQ) — A feature-rich alternative with offline mode, smart session management, and advanced UI
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