This project is a notice board application designed for Inha family community. It helps students stay on top of important announcements without the hassle of constantly checking the school website.
Reduce missed notices as much as possible and maximize the benefits students can receive.
Students often struggle with inconvenient notice checks and tend to miss critical information (e.g., exam schedules, deadlines, events). This project was started to solve that problem through real-time push notifications and easy management tools.
-
Real-time Push Alerts: Get notified the moment a new notice is posted.
-
Custom Tabs: Personalize your home screen with only the categories you care about.
-
Bookmarking: Save and organize important notices for later.
-
Academic Calendar Alerts: Receive reminders for major academic events.
-
Search: Quickly find specific notices.
-
Light/Dark Mode: Choose the style that suits you.
Inha Notice collects and provides announcements from a wide range of university sources. including:
- Departments (70+ across Engineering, Natural Sciences, Business, Education, Social Sciences, Humanities, Medicine, Arts & Sports, Life Sciences, and interdisciplinary programs)
- Colleges (10 colleges)
- Graduate Schools (10 schools, including Law, Public Policy, Education, and more)
- University-wide Notices (e.g., Academic Affairs, Scholarships, Recruitment, International Affairs, Library)
- Special Projects (e.g., SW-Oriented University Project, Climate Change Response Project)
In total, the app supports over 100 announcement categories, ensuring that students can subscribe only to the notices that matter to them.
| Name | Roles |
|---|---|
| Kim Jun-Ho(logicallaw) | Full-Stack Developer & Lead Product Owner |
- iOS: Released on 02/17/2025.
- Android Beta: 02/17/2025 ~ 03/24/2025.
- Android Official Release: 03/03/2025.
- Notion: Click
- iOS (iPhone, iPad, Mac): Download on the App Store
- Android: Download on Google Play
inha_notice
├─ android # Android build files and configuration
├─ ios # iOS build files and configuration
│
├─ lib/
│ ├─ main.dart # App entry point
│ ├─ injection_container.dart # Dependency injection (GetIt) setup
│ │
│ ├─ core/ # Shared core modules
│ │ ├─ config/ # App-wide configurations (theme, font, Firebase, BLoC observer)
│ │ ├─ constants/ # String, page, identifier constants
│ │ ├─ error/ # Common exceptions and failures
│ │ ├─ keys/ # SharedPreferences key definitions
│ │ ├─ utils/ # Shared utilities (logger, SharedPrefs manager)
│ │ └─ presentation/ # Shared presentation layer
│ │ ├─ models/ # Shared models (NoticeTileModel, Pages)
│ │ ├─ pages/ # Shared pages (InAppWebPage)
│ │ ├─ utils/ # UI utilities (SnackBar, BlockingDialog)
│ │ └─ widgets/ # Reusable widgets (AppBar, NoticeTile, Toggle, etc.)
│ │
│ └─ features/ # Feature modules (Clean Architecture + BLoC)
│ │
│ ├─ notice/ # Notice board feature
│ │ ├─ data/
│ │ │ ├─ datasources/ # Remote data source & scrapers
│ │ │ │ └─ scrapers/ # Absolute/Relative style notice scrapers
│ │ │ ├─ models/ # Data models (HomeTabModel, NoticeBoardModel)
│ │ │ └─ repositories/ # Repository implementations
│ │ ├─ domain/
│ │ │ ├─ entities/ # Entities (MajorType, CollegeType, NoticeSelectors, etc.)
│ │ │ ├─ failures/ # Feature-specific failures (Freezed)
│ │ │ ├─ repositories/ # Repository interfaces
│ │ │ └─ usecases/ # Use cases (GetNotices, GetHomeTabs)
│ │ └─ presentation/
│ │ ├─ bloc/ # HomeBloc, NoticeBoardBloc
│ │ ├─ pages/ # HomePage, NoticeBoardPage
│ │ └─ widgets/ # Pagination, KeywordSearch, RefreshHeader, etc.
│ │
│ ├─ search/ # Search feature
│ │ ├─ data/
│ │ │ ├─ datasources/ # Search scraper, recent search, remote/local sources
│ │ │ ├─ models/ # TrendingTopicModel
│ │ │ └─ repositories/
│ │ ├─ domain/
│ │ │ ├─ entities/ # SearchSelectors, TrendingTopicEntity
│ │ │ ├─ failures/
│ │ │ ├─ repositories/
│ │ │ └─ usecases/ # GetTrendingTopics, RecentSearchWords, etc.
│ │ └─ presentation/
│ │ ├─ bloc/ # SearchBloc
│ │ ├─ pages/ # SearchPage, SearchResultPage
│ │ └─ widgets/ # TrendingTopicsItem
│ │
│ ├─ bookmark/ # Bookmark feature
│ │ ├─ data/
│ │ │ ├─ datasources/ # SQLite-based local data source
│ │ │ ├─ models/ # BookmarkModel
│ │ │ └─ repositories/
│ │ ├─ domain/
│ │ │ ├─ entities/ # BookmarkEntity, BookmarkSortingType
│ │ │ ├─ failures/
│ │ │ ├─ repositories/
│ │ │ └─ usecases/ # GetBookmarks, RemoveBookmark, ClearBookmarks
│ │ └─ presentation/
│ │ ├─ bloc/ # BookmarkBloc
│ │ ├─ pages/ # BookmarkPage
│ │ └─ widgets/ # BookmarkRefreshHeader
│ │
│ ├─ more/ # More (settings & utilities) feature
│ │ ├─ data/
│ │ │ ├─ datasources/ # Cache, theme, OSS license, more local data sources
│ │ │ ├─ models/ # MoreConfiguration, OssLicense models
│ │ │ └─ repositories/
│ │ ├─ domain/
│ │ │ ├─ entities/ # MoreConfiguration, OssLicense entities
│ │ │ ├─ failures/ # Cache, More, OssLicense, ThemePreference failures
│ │ │ ├─ repositories/
│ │ │ └─ usecases/ # GetCacheSize, GetOssLicenses, ThemePreference, etc.
│ │ └─ presentation/
│ │ ├─ bloc/ # CacheBloc, MoreBloc, OssLicenseBloc, ThemePreferenceBloc
│ │ ├─ pages/ # MorePage, OssLicensePage
│ │ └─ widgets/ # Tiles, dialogs, theme selection
│ │
│ ├─ custom_tab/ # Custom tab feature
│ │ ├─ data/
│ │ │ ├─ datasources/ # Local data source
│ │ │ └─ repositories/
│ │ ├─ domain/
│ │ │ ├─ entities/ # CustomTabType
│ │ │ ├─ failures/
│ │ │ ├─ repositories/
│ │ │ └─ usecases/ # GetSelectedTabs, SaveTabs
│ │ └─ presentation/
│ │ ├─ bloc/ # CustomTabBloc
│ │ ├─ pages/ # CustomTabPage
│ │ └─ widgets/ # AvailableList, SelectedList, Preview, SaveButton
│ │
│ ├─ notification/ # Firebase notification feature
│ │ ├─ data/
│ │ │ ├─ datasources/ # FirebaseRemoteDataSource
│ │ │ ├─ models/ # NotificationMessageModel
│ │ │ └─ repositories/
│ │ └─ domain/
│ │ ├─ entities/ # NotificationMessageEntity
│ │ ├─ repositories/
│ │ └─ usecases/ # RequestInitialPermission
│ │
│ ├─ notification_setting/ # Notification subscription settings feature
│ │ ├─ data/
│ │ │ ├─ datasources/ # Local & remote data sources
│ │ │ └─ repositories/
│ │ ├─ domain/
│ │ │ ├─ entities/ # NotificationMajorItem
│ │ │ ├─ failures/
│ │ │ ├─ repositories/
│ │ │ └─ usecases/ # GetSubscriptionStatus, ToggleSubscription
│ │ └─ presentation/
│ │ ├─ bloc/ # NotificationSettingBloc
│ │ ├─ pages/ # NotificationSettingPage
│ │ └─ widgets/ # NotificationTile, category widgets
│ │
│ ├─ university_setting/ # University/department settings feature
│ │ ├─ data/
│ │ │ ├─ datasources/ # Local data source
│ │ │ └─ repositories/
│ │ ├─ domain/
│ │ │ ├─ entities/ # UniversitySettingType
│ │ │ ├─ failures/
│ │ │ ├─ repositories/
│ │ │ └─ usecases/ # GetCurrentSetting, SaveSetting, SaveMajorSetting
│ │ └─ presentation/
│ │ ├─ bloc/ # UniversitySettingBloc
│ │ ├─ pages/ # CollegeSetting, GraduateSchoolSetting, MajorSetting pages
│ │ └─ widgets/ # SettingHeader, SettingListTile, SettingSearchField
│ │
│ ├─ main/ # Main navigation feature
│ │ ├─ domain/
│ │ │ └─ usecases/ # GetInitialNotificationMessage
│ │ └─ presentation/
│ │ ├─ bloc/ # MainNavigationBloc
│ │ └─ pages/ # MainNavigationPage (bottom navigation)
│ │
│ └─ onboarding/ # Onboarding feature
│ └─ presentation/
│ ├─ bloc/ # OnboardingBloc
│ └─ pages/ # OnboardingPageThis project was developed and tested in the following environment.
- Flutter v3.38.1
- Dart v3.10.0
- Supported Platforms: iOS (15.0+), Android (SDK 21+)
- Encoding: UTF-8 (includes some Korean content)
-
Clone the repository
git clone https://github.com/InhaNotice/inha_notice.git cd inha_notice -
Install dependency
flutter pub get
-
Configure Environment Variables (.env)
This project uses environment variables to manage API keys and service configurations.
-
Create the file: Create a new file named
.envin the root directory of the project. -
Add required keys: Copy the following structure into your new
.envfile, replacing the placeholder values with your actual keys:# Firebase Configuration FIREBASE_API_KEY = your-api-key FIREBASE_APP_ID = your-app-id FIREBASE_MESSAGING_SENDER_ID = your-messaging-sender-id FIREBASE_PROJECT_ID = your-project-id FIREBASE_STORAGE_BUCKET = your-storage-bucket FIREBASE_IOS_BUNDLE_ID = your-ios-bundle-id # Other Keys (e.g., department-specific APIs) # Other department-specific keys are requested to the person in charge of this project.
-
-
Android Signing Setup (Required for Android)
To successfully build and release the Android application, you must configure the signing keys. * These files are sensitive and are not included in the repository.*
-
Obtain Key Files: You will need the following files, which must be obtained from the project maintainer:
- Keystore File (
*.jksor*.keystore) - Key Properties File (
key.properties) - This file contains the key alias, password, and store password
- Keystore File (
-
Place Key Files:
- Place the keystore file (e.g.,
inha_notice_key.jks) in theandroid/app/directory. - Place the
key.propertiesfile in theandroid/directory.
- Place the keystore file (e.g.,
-
Verify
key.properties: Thekey.propertiesfile must contain the following format:storePassword=[your_store_password] keyPassword=[your_key_password] keyAlias=[your_key_alias] storeFile=[your_keystore_filename].jks
-
-
Build and Run the App After configuring all keys, you can run the app on a connected device or build the final package.
Run Locally:
flutter runBuild for Release
# For Android (APK/AAB)
flutter build appbundle --release
# For iOS (Requires XCode)
flutter build ipa --release
# For Web (Chrome)
flutter build webThis project providers an API Reference for all major classes and methods, generated using DartDoc.
API Reference (DartDoc)
The API documentation is automatically generated from the code comments and is stored in
the doc/api directory.
-
Generate and Update the Docs:
To generate the latest documentation reflecting the current codebase, run the following command from the project root:
dart doc
-
View the Documentation:
Once generated, you can view the documentation by opening the
index.htmlfile in your web browser.Local Path Example:
file:///Users/logicallaw/Downloads/inha_notice/doc/api/index.htmlNote: The actual path will vary depending on your local machine environment.
- Fork this repository
- Create a new branch
git checkout -b feature/your-new-feature-name your-remote-name/feature/your-new-feature-name
- Commit your change logs
git commit -m "feat: add your-change-logs" - Push your branch
git push your-remote-name feature/your-new-feature-name
- Create a pull request at github
This project is licensed under the Apache License 2.0. For more details, please refer to the LICENSE file.
This project utilizes the following open-source libraries and packages to deliver its core functionality:
| Category | Package(s) | Description |
|---|---|---|
| Firebase Services | firebase_core, firebase_messaging |
Core integration and services for real-time push notifications. |
| Notification Handling | flutter_local_notifications, flutter_background_service |
Manages local notifications and background processing tasks for receiving updates. |
| Networking & Data Parsing | http, xml |
Handles HTTP requests for network communication and parses XML data from web sources. |
| Data & Locale Utilities | intl |
Provides internationalization and localization features, including date/number formatting. |
| Storage & File System | shared_preferences, sqflite, path_provider, path |
Manages local key-value storage, stores data in a local SQLite database, and handles platform-specific file paths. |
| User Interface & UX | flutter_inappwebview, share_plus, pull_to_refresh, cupertino_icons |
Provides an embedded web view, enables content sharing, implements pull-to-refresh functionality, and uses iOS-style icons. |
| Development Utilities | flutter_dotenv, logger |
Loads environment variables from .env files and provides advanced logging capabilities for development and debugging. |
| Custom Fonts | Pretendard, Tossface, NanumGothic |
Custom typeface assets used to ensure optimal readability and design consistency across the application. |
If you have any questions or need support, feel free to open an issue on GitHub or reach out via the following contact methods:
-
Email: [email protected]
-
GitHub: InhaNotice