Tattoo Logo

Tattoo

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

An NPC Project Made with Flutter Works on my machine Crowdin Translation Progress

Help us translate! We use Crowdin to manage localizations. Join the project and help us bring Tattoo to your language!

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/chip_tab_switcher
components/notices
components/option_entry_tile
components/section_header
components/widget_preview_frame
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_US.g
Generated file. Do not edit.
main
models/contributor
models/course
models/ranking
models/score
models/user
repositories/auth_repository
repositories/course_repository
repositories/preferences_repository
router/app_router
screens/main/course_table/course_table_providers
screens/main/course_table/course_table_screen
screens/main/home_screen
screens/main/profile/about_screen
screens/main/profile/profile_card
screens/main/profile/profile_danger_zone
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/github_service
services/i_school_plus_service
services/portal_service
services/student_query_service
shells/animated_shell_container
shells/showcase_shell
utils/avatar_payload
utils/fetch_with_ttl
utils/http
utils/launch_url
utils/localized
utils/shared_preferences