Minimal pre-release checklist. Covers only the highest-risk, must-pass cases.
**Full test suite:** See Comprehensive list
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
1.1 |
Fresh install |
Uninstall the app, install the new build, launch it |
App opens without errors; onboarding or login screen is shown |
Android ✅ iOS ✅ |
1.2 |
Update over existing install |
Install the previous release, log in, then install the new build on top |
App launches; user is still logged in, no crash |
Android ✅ iOS ✅ |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
2.1 |
Sign in with valid credentials |
Enter a valid instance URL, email, and password; tap Sign In |
User reaches the Home dashboard |
Android ✅ iOS ✅ |
2.2 |
Sign in with wrong credentials |
Enter a valid URL with a wrong password; tap Sign In |
Error message is shown; user stays on Sign In page |
Android ✅ iOS ✅ |
2.3 |
Session persists after restart |
Log in, close the app fully, reopen it |
User lands on Home dashboard without re-login |
Android ✅ iOS ✅ |
2.4 |
Sign out |
Navigate to Account, tap Log Out |
User is returned to the Sign In screen |
Android ✅ iOS ✅ |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
3.1 |
Dashboard loads |
Log in and open the Home tab |
Widgets load without errors or blank screens |
Android ✅ iOS ✅ |
3.2 |
Navigate from widget |
Tap a work package in any Home widget |
Work Package Details screen opens |
Android ✅ iOS ✅ |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
4.1 |
Projects list loads |
Open the Workspaces tab |
List of projects is displayed |
Android ✅ iOS ✅ |
4.2 |
Open a project |
Tap any project in the list |
Project overview opens with at least one tab loading correctly |
Android ✅ iOS ✅ |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
5.1 |
Work package list loads |
Open the Work Packages tab |
List of work packages is displayed |
Android ✅ iOS ✅ |
5.2 |
Open work package details |
Tap any work package |
Details screen shows title, status, and description |
Android ✅ iOS ✅ |
5.3 |
Create a work package |
Tap "+", fill in title, type, and project; save |
Work package is created and visible in the list |
Android ✅ iOS ✅ |
5.4 |
Edit a field |
Open a work package, change the status, save |
Updated status is shown in the details view |
Android ✅ iOS ✅ |
5.5 |
Add a comment |
Open a work package, go to Activity tab, post a comment |
Comment appears in the activity timeline |
Android ✅ iOS ✅ |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
6.1 |
Time tracking page loads |
Open the Time Tracking tab |
Calendar and time entries load |
iOS ✅ |
6.2 |
Start and stop timer |
Open the Timer tab, tap Start, wait a few seconds, tap Stop |
Log Time form opens pre-filled with elapsed time |
iOS ✅ Android ✅ |
6.3 |
Save a time entry |
Fill in the Log Time form and confirm |
Entry is saved and appears in the calendar view |
iOS ✅ Android ✅ |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
7.1 |
Search returns results |
Open Search, type a known work package title |
Matching results appear in the list |
iOS ✅ Android ✅ |
7.2 |
Navigate to result |
Tap a result |
Correct work package detail screen opens |
iOS ✅ Android ✅ |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
8.1 |
Notifications list loads |
Open the Notifications tab |
Notification list is displayed (or empty state shown) |
iOS ✅ Android ✅ |
8.2 |
Tap a notification |
Tap any notification |
Associated work package detail opens |
iOS ✅ Android ✅ |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
9.1 |
Profile loads |
Open the Account tab |
User name, email, and avatar are displayed |
iOS ✅ Android ✅ |
9.2 |
Settings are accessible |
Open Account → Work Package Settings |
Settings page opens without error |
iOS ✅ Android ✅ |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
10.1 |
Bottom nav tabs all work |
Tap each icon in the bottom navigation bar |
Each tab opens its correct screen |
iOS ✅Android ✅ |
10.2 |
Back navigation |
Go several screens deep, press back |
App navigates back correctly without crash |
iOS ✅ Android ✅ |
10.3 |
Offline error handling |
Disable network, try to load any screen |
Error or offline message shown; app does not crash |
iOS ✅ Android ✅ |
10.4 |
No crash during basic usage |
Use the app across all main sections for ~10 minutes |
No crashes or unresponsive states occur |
iOS ✅ Android ✅ |
Minimal pre-release checklist. Covers only the highest-risk, must-pass cases.
**Full test suite:** See Comprehensive list
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
1.1 |
Fresh install |
Uninstall the app, install the new build, launch it |
App opens without errors; onboarding or login screen is shown |
Android ✅ iOS ✅ |
1.2 |
Update over existing install |
Install the previous release, log in, then install the new build on top |
App launches; user is still logged in, no crash |
Android ✅ iOS ✅ |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
2.1 |
Sign in with valid credentials |
Enter a valid instance URL, email, and password; tap Sign In |
User reaches the Home dashboard |
Android ✅ |
2.2 |
Sign in with wrong credentials |
Enter a valid URL with a wrong password; tap Sign In |
Error message is shown; user stays on Sign In page |
Android ✅ |
2.3 |
Session persists after restart |
Log in, close the app fully, reopen it |
User lands on Home dashboard without re-login |
Android ✅ |
2.4 |
Sign out |
Navigate to Account, tap Log Out |
User is returned to the Sign In screen |
Android ✅ |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
3.1 |
Dashboard loads |
Log in and open the Home tab |
Widgets load without errors or blank screens |
Android ✅ |
3.2 |
Navigate from widget |
Tap a work package in any Home widget |
Work Package Details screen opens |
Android ✅ |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
4.1 |
Projects list loads |
Open the Workspaces tab |
List of projects is displayed |
Android ✅ |
4.2 |
Open a project |
Tap any project in the list |
Project overview opens with at least one tab loading correctly |
Android ✅ |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
5.1 |
Work package list loads |
Open the Work Packages tab |
List of work packages is displayed |
Android ✅ |
5.2 |
Open work package details |
Tap any work package |
Details screen shows title, status, and description |
Android ✅ |
5.3 |
Create a work package |
Tap "+", fill in title, type, and project; save |
Work package is created and visible in the list |
Android ✅ |
5.4 |
Edit a field |
Open a work package, change the status, save |
Updated status is shown in the details view |
Android ✅ |
5.5 |
Add a comment |
Open a work package, go to Activity tab, post a comment |
Comment appears in the activity timeline |
Android ✅ |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
6.1 |
Time tracking page loads |
Open the Time Tracking tab |
Calendar and time entries load |
Android ✅ |
6.2 |
Start and stop timer |
Open the Timer tab, tap Start, wait a few seconds, tap Stop |
Log Time form opens pre-filled with elapsed time |
Android ✅ |
6.3 |
Save a time entry |
Fill in the Log Time form and confirm |
Entry is saved and appears in the calendar view |
Android ✅ |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
7.1 |
Search returns results |
Open Search, type a known work package title |
Matching results appear in the list |
Android ✅ |
7.2 |
Navigate to result |
Tap a result |
Correct work package detail screen opens |
Android ✅ |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
8.1 |
Notifications list loads |
Open the Notifications tab |
Notification list is displayed (or empty state shown) |
Android ✅ |
8.2 |
Tap a notification |
Tap any notification |
Associated work package detail opens |
Android ✅ |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
9.1 |
Profile loads |
Open the Account tab |
User name, email, and avatar are displayed |
Android ✅ |
9.2 |
Settings are accessible |
Open Account → Work Package Settings |
Settings page opens without error |
Android ✅ |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
10.1 |
Bottom nav tabs all work |
Tap each icon in the bottom navigation bar |
Each tab opens its correct screen |
Android ✅ |
10.2 |
Back navigation |
Go several screens deep, press back |
App navigates back correctly without crash |
Android ✅ |
10.3 |
Offline error handling |
Disable network, try to load any screen |
Error or offline message shown; app does not crash |
Android ✅ |
10.4 |
No crash during basic usage |
Use the app across all main sections for ~10 minutes |
No crashes or unresponsive states occur |
Android ✅ |
Follow these steps to install and start using the OpenProject Mobile App (Beta):
Before downloading the app, please ensure your environment meets the following prerequisites:
An active OpenProject account: Either from an OpenProject Cloud workspace or an OpenProject On-premises installation with API access enabled.
Having a signed certificate (https not http) on your instance to be able to log in.
Minimum OpenProject version: 17.0.0
_{BASE_URL}/admin/settings/experimental_.
Minimum system requirements:
iOS 15 or later
Android 12 or later
Built-in OAuth applications enabled: Make sure that the built-in OAuth applications are enabled in your administration settings ({BASE_URL}/admin/oauth/applications). This is required for successful login from the mobile app.
Network connection: Internet access is required for syncing data with your OpenProject instance.
Note: Some features, such as deep-linking and realtime push notifications, may depend on your organization’s configuration or will become available in future updates.
The OpenProject Mobile App is available for both major platforms:
Android: [Google Play Store link]
iOS: [App Store link]
Search for “OpenProject” in your app store, or use the direct links above to download the app.
After installation, open the app on your device.
You’ll be greeted with a short onboarding on the app features and then prompted to log in to your OpenProject instance.
Enter the complete base URL of your instance (for example, https://yourcompany.openproject.com).
Once your instance is confirmed, log in using your OpenProject username and password in the browser modal that opened.
The app will ask you permission to have full access to the **OpenProject API v3** so account and securely connect to your workspace.
You’re all set!
Once logged in, you can:
View and edit work packages
Comment and reply to discussions
Create and track work packages easy and fast
Log time and run focus timers
Stay updated with local notifications
The Home Dashboard is your go-to screen for staying informed, focused, and efficient on mobile — providing an at-a-glance view of everything that matters across your projects. It allows creating a personalized overview of your projects, work packages, and activities, helping you stay informed and productive on the go.
The dashboard is designed to give you quick access to the information you care about most, without needing to navigate deep into individual projects or work packages.
The Home Dashboard is your central hub for project management on mobile. Its main purposes include:
Quickly reviewing your priorities: See which work packages, deadlines, or updates need your attention.
Monitoring project activity: Stay up to date on work package changes, comments, and progress across all your projects.
Accessing relevant widgets: Customize what you see based on your workflow and focus areas.
Saving time: Avoid switching between multiple screens — everything important is consolidated in one view.
The Home Dashboard consists of modular widgets that provide snapshots of your most relevant data. Depending on your role and project access, some widgets may vary.
Displays recent notifications, such as mentions, comments, or work package updates.
Enables you to react quickly without leaving the dashboard.
Displays projects you’ve marked as favorites for quick access.
Ideal for prioritizing high-importance projects.
Shows the currently running timer or allows you to start a new focus timer.
Helps track work time efficiently and accurately.
Provides an overview of time logged during the current week.
Helps you monitor your productivity and ensure accurate reporting.
Shows a snapshot of the portfolios available.
Useful for portfolio managers and team members tracking high-level progress across multiple projects.
Lists all work packages currently assigned to you.
Includes types and status indicators for quick task management.
Shows a list of recently edited work packages.
Allows fast navigation back to items that are work in progress.
While the mobile dashboard is designed for simplicity, the order and visibility of widgets can be customized by using the edit widgets button on the top navigation bar, you are allowed to:
Activate and deactivate widgets
Reorder widgets
Note: If you don't have the right permissions or have disabled a feature, the related widgets will be deactivated in the home dashboard tab.
The OpenProject Mobile App is designed to keep you connected to your projects wherever you are. While it doesn’t replace the full desktop experience, it provides access to the essential tools you need to stay productive on the go.
This section introduces the core features of the app and links to detailed guides for each functionality.
With the mobile app, you can:
Stay informed about project updates and notifications
Manage work packages efficiently from anywhere
Track your time and log progress
Access project dashboards and overviews at a glance
Customize your settings to tailor the app to your workflow
Each feature is designed to complement the OpenProject web and desktop experience, giving you the flexibility to react, update, and communicate on the go.
The following core features are available in the mobile app:
Feature |
Description |
|---|---|
Home Dashboard |
Your personal overview of tasks, notifications, and project updates — giving you a quick snapshot of what matters most. |
Projects |
Browse your projects, access project-specific details, and stay on top of deadlines and activities. |
Time Tracking |
Track time spent on work packages, run timers in focus mode, and keep your reporting accurate and up to date. |
Work Packages |
Create, view, and edit work packages directly from the app. Work packages are organized for quick access and easy collaboration. |
Notification Centre |
Receive updates about comments, mentions, and work package changes — ensuring you never miss important activity. |
User Settings |
Configure your account, manage app preferences, and tailor notifications to suit your workflow. |
💡 Note: For a seamless experience, use the mobile app alongside the web or desktop version of OpenProject. The app is designed as a companion, so you can stay informed, respond quickly, and keep your projects moving — even when you’re away from your desk.
The Projects module in the OpenProject Mobile App gives you an organized view of all portfolios, programs, and projects you have access to. It allows you to check status, attributes, and progress, explore hierarchy, and navigate seamlessly between different levels of work.
The Projects module is designed to help you:
Monitor progress and status of projects, programs, and portfolios.
View all attributes and key details of a portfolio, program, or project.
Understand hierarchy by exploring the relationship between portfolios, programs, and projects.
Access work packages and child projects of portfolios, programs, and projects directly from the mobile interface.
This module is particularly useful for team members, project managers, and portfolio managers who need a clear overview of ongoing work and its organization.
The main screen of the Projects module acts as an index page, allowing you to:
Enter Portfolios, Programs, or individual Projects directly.
Browse a hierarchical list of all projects, expandable to show programs and child projects.
Filter the list to display only your favorite projects for quick access.
When you enter a portfolio, program, or project, the mobile app provides three key tabs for detailed insights:
Overview Tab
Shows the description, status, and all available attributes of the selected item.
Provides a snapshot of key details at a glance.
Work Packages Tab
Lists all work packages associated with the portfolio, program, or project.
Allows you to view, open, and interact with tasks directly from the app.
In this Portfolio / Program / Project
Displays all projects or programs that belong to the selected portfolio, program, or project.
Helps you explore the hierarchy and drill down into individual initiatives.
The app is released in Beta to provide early access to users while the core functionality is still under development. This allows the OpenProject team to gather feedback from real users, identify issues, and make improvements before the full public release. The Beta release ensures that users can start using the app for essential tasks while the remaining advanced features and refinements are being implemented.
The OpenProject Mobile App is a companion to the OpenProject desktop and web applications. It allows users to stay informed, manage work packages, track time, and collaborate while on the go. The app is currently in Beta, meaning core features are available, but some advanced functionalities are still under development.
iOS 15 or later
Android 10 or later
The app requires an active internet connection to sync data with your OpenProject instance.
You can log in using your OpenProject Cloud account or an On-Premises instance, username and password. Please ensure:
Your instance has a valid HTTPS certificate.
Built-in OAuth applications are enabled in your instance administration settings ({BASE_URL}/admin/oauth/applications).
Your instance is on OpenProject version 17.0.0 or higher, or the “OAuth Authentication” feature flag is enabled under Administration → Experimental for older instances.
The Home Dashboard provides a personalized overview of your work and includes the following widgets:
Notifications: See recent mentions, comments, and updates.
Time Tracker: Start or resume focus-mode timers.
Favorite Projects: Quick access to starred projects.
Week Time Tracking: Overview of logged hours for the current week.
Portfolios: Snapshot of portfolio-level progress.
Assigned to Me: List of work packages assigned to you.
Recently Viewed: Quick access to recently opened items.
The Projects module provides an index of all portfolios, programs, and projects. Users can:
Navigate the hierarchy between portfolios, programs, and projects.
Filter the list to show only favorites.
Open any item to see:
Overview tab: Description, status, and attributes
Work Packages tab: List of associated tasks
Child Projects/Programs tab: Projects or programs under the selected item
The Work Packages module supports:
Viewing and filtering all open work packages
Searching by keywords
Editing work package details and custom fields
Creating new work packages (quick creation or full attribute entry)
Adding comments, mentions, and images in the Activity tab
Uploading files or photos directly from the camera
Managing relations and watchers
Logging time or starting a timer for focused work
Setting reminders
Sharing work packages using the device’s native sharing options
The Time Tracking module allows you to monitor and log your work efficiently:
Time Entries Index: View current and past weeks and their logged time entries.
Timer Focus Mode: Track work in real time with a background timer.
Log Time: Record time spent on specific work packages manually.
The Notification Centre collects updates from your projects. Users can:
View all new notifications from OpenProject.
Open a notification to see the associated work package in the Activity tab.
Mark individual notifications or all notifications as read.
Switch between notification queries to filter by participation, mentions, or other custom inboxes.
Toggle between viewing only unread or all notifications.
Through the User Settings module, users can:
Change the default launch page
Switch color mode (light, dark, system default)
Change the app language
Enable or disable specific features (e.g., hide Time Tracking module)
Update personal details (name, email, etc.)
Configure notification settings and deactivate OS-level notifications
Provide feedback directly to the OpenProject Community project
No. The mobile app is a companion app and is currently in Beta. Some advanced features from the web or desktop version are not yet available, including:
Deep-linking to On-Premises instances
Multi-device UI synchronization
Real-time push notifications
Writing internal comments across multiple work packages
Viewing meeting agendas in the app
These features are planned for future releases.
Check the following:
Your instance supports HTTPS and is reachable from your device.
Built-in OAuth applications are enabled in your instance administration.
Your instance meets the minimum version requirement (17.0.0), or the OAuth feature flag is enabled.
Ensure your credentials are correct, and you have API access enabled on On-Premises instances.
If none of the above solves the problem, check the [Login Troubleshooting Guide](link).
Feedback can be submitted directly through the User Settings → Feedback section. Submitted feedback is sent to the OpenProject Mobile App team, allowing us to review and incorporate user suggestions.
The app requires an active internet connection to sync data with your OpenProject instance. Some previously loaded data may be viewable offline, but creating work packages, logging time, or updating tasks requires connectivity.
The Time Tracking module in the OpenProject Mobile App enables you to easily record, review, and manage the time you spend on your work. Whether you prefer logging time manually or using a real-time focus timer, the module offers a clear and efficient mobile workflow.
The Time Tracking feature helps you:
Keep accurate records of your work across projects
Maintain consistent time reporting while on the move
Review your weekly work patterns at a glance
Track focused work sessions without distractions
The Time Entries Index provides a clear, chronological view of all your logged time. What you can do:
Browse weekly overviews: Move between the current week and previous weeks to see all your recorded time entries.
Review logged hours: See each entry with its associated work package, duration, and date.
Quick view chart: Easily see the total of hours recorded by day in the weekly chart.
This view is ideal for maintaining accurate records and verifying past entries.
The Timer Focus Mode allows you to track time as it happens, helping you stay focused and avoid manual entry errors. What you can do:
Start a focus timer on any work package to measure your work session in real time.
Let the timer run in the background, even if you switch apps or lock your device.
Stop the timer when finished, and convert the session into a logged time entry.
The Log Time feature allows you to manually enter time spent on work packages. What you can do:
Create a new time entry for any work package.
Specify the date, duration, and activity type.
Ensure accurate reporting even if you didn’t use the focus timer.
The Work Packages module is one of the central components of the OpenProject Mobile App. It allows you to browse, search, create, update, and collaborate on work packages directly from your mobile device. The module includes full support for commenting, file attachments, relations, watchers, time logging, timers, and reminders.
The Work Packages module enables you to:
Access and manage tasks across all your projects
Create new work packages quickly or with full detail
Update existing work packages
Collaborate through comments and mentions
Attach files, images, and photos directly from your device
Manage relations, watchers, and attributes
Track time and set reminders for upcoming work
When accessing the Work Packages module, you are presented with a list of open work packages from all projects. This serves as the starting point for navigation and work package management, making it easy to view ongoing work at a glance. The module also offers flexible filtering tools that allow users to refine the list by selecting a specific project, applying a saved query, and adjusting sorting and grouping options. As filters are modified, the list dynamically adapts to show the corresponding work packages.
In addition to filtering, you can quickly locate specific work packages through the search functionality. Tapping the search icon opens a search bar where users can type keywords and instantly view matching results.
Creating new work packages is also fully supported. You can tap the "+" button to begin the creation process. After selecting the work package type and project, you can fill in the required fields to quickly create a new entry. For more detailed entries, you may choose to open the full attribute list and complete optional fields before saving, resulting in a comprehensive work package with all available metadata.
You can open any work package to view its details and make updates. Editing is initiated through the pencil icon, giving access to fields such as the title, description, status, and any available custom fields. All updates are applied directly in the work package, so users can easily refine information as work progresses.
The module supports collaboration through the Activity tab, where you can participate in discussions. Comments can be added or replied to, mentions can be used to involve other users, and images may be included directly in the comment body. This makes it easier to share updates, coordinate with your team, or provide visual information on the go.
Attachments are handled through the Files tab. You can upload files, photos, or videos from their device, or take a new picture using the camera and attach it immediately. This allows work packages to hold all relevant documentation in one place.
Relations between work packages can be managed in the Relations tab, where you can connect tasks to one another by adding new relations when needed. Similarly, watchers can be added from the Watchers tab to keep stakeholders informed about progress or changes.
Time can be logged directly from a work package by opening the More menu and selecting the logging option. You can enter duration, date, activity, and any other necessary details to record their work accurately.
For continuous time tracking, the app also supports starting a live timer from the same More menu. This opens the timer in focus mode, allowing you to track their work in real time while minimizing distractions.
Additionally, you can set reminders from within the More menu. By configuring a reminder for a specific date and time, the app will notify you when it’s time to return to that work package or take action on it.
Work packages can be easily shared using the device’s native sharing features. From within a work package, you can access the system share from the More menu to send a direct link to the item through messaging apps, email, collaboration tools, or any other app supported by their operating system. This simplifies cross-platform communication and makes it effortless to bring others into the loop.
The Notification Centre provides a centralized view of all updates, mentions, and activities that require the user’s attention. It ensures users can stay informed about important changes across their projects, even while on the move. Notifications from the web or desktop application are synchronized with the mobile app, making it easy to keep track of all relevant activity in one place.
After logging in to the app, you will automatically receive notifications generated in their OpenProject environment. Whenever an update occurs—such as a comment, status change, or mention—the notification will appear inside the Notification Centre. You can simply open the app and navigate to the Notification Centre to view any new, unread items waiting for their attention.
You can also choose to display all notifications, not just unread ones. By toggling the switch to view all items, the Notification Centre expands to include both read and unread notifications. This is useful for revisiting past activity or reviewing a complete history of updates.
Tapping on a notification opens the associated work package directly in the mobile app. You are taken to the Activity tab of that work package, where the specific update that triggered the notification is highlighted. This makes it easy to understand the context of the notification and respond immediately if needed.
When a notification is opened or manually marked as read, it is removed from the Unread inbox. This allows you to maintain a clear and focused view of only pending items. For quicker inbox management, the Notification Centre also provides an option to mark all notifications as read from the top bar, clearing the unread list in a single action.
The Notification Centre includes filters that allow you to switch between different notification queries, similar to the web interface. You can choose alternative inboxes—such as “Assigne,” “Mention,” or other notification categories their instance provides. When switching queries, the list updates immediately to show only the notifications relevant to that filter.
The User Settings module allows users to personalize their mobile app experience, configure notifications, manage account details, and provide feedback. All settings are accessible through the user avatar, giving a central location for managing preferences and account-specific options.
You can customize how the app behaves and appears to suit their workflow and preferences. The following options are available:
Change Launch Page: You can select which page the app opens to by default when launched. Once the new launch page is set, closing and reopening the app will open directly on the selected page.
Enabled Features: Allows you to enable or disable specific features for a streamlined experience. This enables you to focus only on the tools relevant to their workflow.
Change Language: You can select their preferred language, which updates all app labels, menus, and interface elements accordingly.
Switch Color Mode: The app supports different color modes. You can switch between light, dark, or system-default modes to match your personal preference or device settings.
You can manage their personal information from the Account Details section. Changes to the name, email, or other personal data are reflected across both the mobile app and desktop/web interface, ensuring consistency across all OpenProject platforms.
The Notification Settings section allows you to configure how and when they receive notifications:
Deactivate Local Notifications: You can disable OS-level local pull notifications, preventing alerts from appearing on their device.
Adjust Notification Preferences: You can fine-tune which notifications they receive, such as participation alerts, non-participation alerts, or date-related reminders. Changes are applied to both mobile and desktop apps, and notifications will adhere to the new settings.
The app includes a Feedback section where you can provide suggestions, report issues, or share their experiences. Submitted feedback is sent to the OpenProject Mobile app team for review.
Dear Team,
We are excited to announce the launch of the internal Alpha Testing phase for the OpenProject Mobile App! Your participation and feedback will be invaluable in shaping the future of our mobile experience. Below, you will find a document with all the details regarding the features of the app, what Alpha Testing entails, and how you can get involved.
Note: Please consider that the current state of the app is a work in progress and not considered ready for public release. That’s exactly the reason why we do this testing round, to gather feedback and improve the app until a point we can release it publicly.
Alpha Testing is the first phase of testing a product in a controlled environment. During this phase, only internal team members (employees of OpenProject) will:
Test the app’s functionality in real-world scenarios (like Community).
Identify and report any bugs, performance issues, or usability concerns.
Share feedback on potential improvements or new feature ideas.
The OpenProject Mobile App currently includes the following features:
Home page: View an access your favourite projects and latest edited work packages from the home page.
Work package management: Create, view, edit, and manage your work packages with the same capacities as in the web app.
Log time: Log your time spent on tasks directly from the app (see the logged time or log times for others is not available in mobile).
Notifications: Stay updated with real-time notifications on work packages, act upon them and mark them as read if needed.
User settings: See and modify your account details (change avatar is not available in mobile), change what is the default opening page of the app, change between light and dark mode, modify your notification settings (project-specific notification settings are not available in mobile), work packages settings for activity tab and creation and sign out.
Global search: Being able to search for all work packages by text or quick filters from the search bar.
We are continually enhancing these features and look forward to your insights for further improvements. Just for your information, these are the features that are already in our roadmap for the next months:
Automatic scheduling (like in web app)
Push notifications
Feedback flow in app
Time tracking
Emoji reactions
Multi-language
OIDC connect
Multi-device specific designs (for tablets and desktop)
Apps for Windows and Linux
Nextcloud integration in app
Offline capabilities
This testing phase is exclusively open to employees of OpenProject. We encourage all team members to participate and help us refine the mobile app.
Participating is simple and involves the following steps:
Download the App: Follow the instructions below to download the app on your device.
Test the Features: Use the app as you would in your daily workflow.
Provide Feedback: Report your observations, including any bugs or suggestions.
Android Users:
Contact Marc Alcobé (Elements chat or m.alcobe@openproject.com) to be added as internal testers of the Android Alpha test with your email.
Download and install the app via the Google Play Store using this link: https://play.google.com/apps/testing/org.openproject.app.
With the app downloaded and open use this credentials to access the app:
Once that credentials are filled you will be redirected to the web browser to perform the normal log in and authentication with your credentials in Community.
iOS Users:
Download the TestFlight app.
Access the app through TestFlight with this invitation link: https://testflight.apple.com/join/DaN3WXfJ.
Download and install the OpenProject Mobile app via TestFlight.
With the app downloaded and open use this credentials to access the app:
Once that credentials are filled you will be redirected to the web browser to perform the normal log in and authentication with your credentials for Community or QA Edge.
We have set up the Stream Mobile App project inside of Community as the central hub for feedback. Use the following categories to organise your input:
General Feedback: Share your overall experience and suggestions for improvement using the work package type FEEDBACK and assign it to version Mobile Wish List.
Bugs: Report any issues or glitches you encounter using the work package type BUG filling all the necessary information to reproduce the bug and the version of the app where you found the bug. Assign it to version Mobile Wish List.
Feature Requests: Suggest new features that could enhance the app using the work package type IDEA and assign it to version Mobile Wish List and to the assignee OP Mobile Team. We will analyse the idea and transform it to the corresponding work package type when required.
Steps to submit feedback:
Open OpenProject Community (also from your mobile app if you are in Community of course 😉)
Navigate to the Stream Mobile App project.
Check if another similar work package with the same feedback exist, if not do point 4.
Create a new work package with the correct type and information as specified in the section on top.
Your active participation and constructive feedback will be critical in ensuring the success of the OpenProject Mobile App. Let’s work together to make this a tool that enhances productivity and collaboration for all!
If you have any questions or need assistance, please don’t hesitate to reach out Marc at m.alcobe@openproject.com.
Thank you for your support and enthusiasm!
This document supports decisions about automated testing, CI, and how QA and engineering share responsibility. It is grounded in the current OpenProject Flutter app repository.
If you are new here: read Vision and planned directions first. It states what we want to achieve and why, in plain language. The rest of the document refines that vision with repository facts, priorities, risks, and effort estimates.
This section is for readers who were not part of earlier discussions. It captures our intended direction; later sections explain how that maps to this codebase, what already exists, and what we recommend adjusting.
We ship a Flutter client against a living API and rich UI. Bugs show up as wrong data, broken flows, visual regressions, or surprises after server changes. The goal is not “maximum tests,” but predictable quality and earlier feedback, while keeping cost and flake risk under control.
Vision: Run meaningful end-to-end style checks on a real app binding—on a device or emulator—so we exercise navigation, real layout, and timing closer to production.
Constraints we accept: These tests are expensive (time, machines, stability). We do not assume a device farm in CI today. The plan is not to run them on every pull request, but to use them as scheduled smoke (for example once a week) and/or around release candidates, to catch “glue” regressions and reduce repetitive manual load on QA without replacing exploratory testing.
Tooling stance: Prefer Flutter’s **integration_test** where possible; reserve heavier tools (for example Appium) only when the platform cannot be covered otherwise.
Vision: While building a feature, add widget tests and, where agreed, golden (reference image) tests for the screens or states that matter—so we get fast feedback in GitHub Actions on layout and critical UI paths.
Open question we acknowledge: For those tests, we may mock BLoC/Cubit state (or fakes at the repository boundary) or push further and mock HTTP (Dio) with static JSON. The document later recommends a split: keep most widget/golden tests free of wire-level JSON; put HTTP parsing and contract behavior in dedicated API / contract tests so failures stay interpretable and maintenance stays sane.
Vision: Add tests that behave like integration checks for the client–API contract but run on Linux CI—no emulator. Typical forms: fixture-backed HTTP tests next to the generated or hand-written client, and/or tests that drive use cases with a fake HTTP port, still asserting realistic responses.
Motivation: We sometimes ship a broken client because the API or HAL changed and we were not aware. Running these suites on every PR (and optionally triggering workflows when the API repository changes) is meant to surface incompatibility early. This only works if the suite is deterministic (fixtures or a stable staging contract)—hooks without a real test body create noise, not safety.
Vision: Keep growing unit tests, **bloc_test**-style tests, and use case tests as the default safety net for rules and state machines. They are the cheapest layer and should remain the bulk of automated coverage.
Some features may additionally use the flow snapshot pattern (full or near-full app under flutter_test, static JSON, faked platform APIs, golden milestones). That is optional and expensive—use for a few critical journeys; details appear below.
Sprint planning: We intend to allocate visible time for tests alongside feature work (for example a agreed percentage or explicit tasks). Management may initially see this as overhead; the argument is that unplanned quality work still happens—it is simply deferred, more expensive, and often lands on QA or customers.
Bugs and TDD: When a bug is reproducible and worth preventing again, we want to fix it through a test-first or test-accompanying workflow where that is practical—not as a dogma for every one-line change, but as a default for real regressions.
After this section |
You will find |
|---|---|
Short decisions and asks for leadership and QA. |
|
What we mean by each test type. |
|
What already exists in this repo (CI, tests, gaps). |
|
Later sections |
ROI ordering, bootstrap vs ROI, mock boundaries, effort tables, risks, and QA handoff. |
Goal: Improve release quality and reduce surprise breakages—especially when the API or shared contracts change—without drowning the team in flaky or redundant tests.
Current constraint: GitHub Actions runs flutter test on Ubuntu only. Device and emulator integration tests are not in CI today; they are suitable for a weekly smoke lane or pre-release, not for every PR.
Highest ROI next step: Add contract or fixture-backed HTTP tests next to the API client layer (packages/openproject_api_sdk). That directly targets “the server changed and the client broke without us knowing.” Widget tests with mocked Dio are not a substitute.
What already works: The repo has substantial unit, BLoC, and use case coverage under test/. The strategy is to extend proven layers, not restart from zero.
Organizational ask: Treat test work as part of delivery in sprint planning (transparent capacity band and Definition of Done). Use TDD-style regression tests for reproducible bugs; avoid dogmatic TDD for trivial changes.
Decisions for management
Approve a small recurring capacity band (for example 10–20% of engineering time on non-trivial stories) for tests that match the DoD below.
Approve ownership and cadence for weekly on-device smoke (who runs it, which devices, where results are recorded).
Approve one CI strategy for golden tests (pinned OS or runner) if goldens are adopted, to avoid endless screenshot churn.
Decisions for QA
Agree which journeys are in the weekly automated smoke set versus what remains manual exploratory testing.
Agree how API or environment incidents are distinguished from app regressions when smoke fails.
Audience |
Use |
|---|---|
Managers |
Trade-offs (cost, schedule, risk), CI expectations, why sprint capacity for tests is rational. |
QA |
What automation can replace or narrow, weekly smoke scope, where to log gaps when coverage does not exist yet. |
Term |
Meaning here |
|---|---|
Unit test |
Fast, no I/O; pure functions, parsers, small helpers. |
BLoC / Cubit test |
State transitions and side-effect ordering with controlled fakes ( |
Use case test |
Application service orchestration with fake repositories or ports—not real network. |
Widget test |
Pumps widgets under |
Golden test |
Compares rasterized output to a reference image; great for stable design surfaces, sensitive to fonts and OS. |
Integration test ( |
Runs a real app binding; often on device or emulator; higher cost and flake risk. |
Contract / API test |
Asserts HTTP shapes, status codes, and parsing against fixtures or a staging API; catches server drift. |
Flow snapshot test (optional pattern) |
Full-app widget test: pump near-complete app, Dio (or client) returns static JSON from |
Facts you can cite when prioritizing work:
Area |
Baseline |
|---|---|
CI |
|
Integration tests |
|
Unit / BLoC / use case |
Many tests under |
Golden tests |
No |
API SDK tests |
|
Feature areas: There are 21 top-level feature directories under lib/app/features/ (for example auth, work_package, home, time_tracking, shared_files, notifications, onboarding, projects, user).
Platform-sensitive dependencies (from pubspec.yaml) include OAuth (flutter_appauth), deep links (app_links), share-in (receive_sharing_intent), image_picker, file_picker, video_player, home_widget, live_activities, flutter_local_notifications, flutter_background_service, flutter_inappwebview, gal, permission_handler, Drift/SQLite, secure storage, and others.
Code touchpoints: A search for direct use of the heaviest plugins (for example ImagePicker, FilePicker, home_widget, local notifications, background service, sharing, Gal, flutter_appauth, AppLinks) lands on the order of roughly 20–25 Dart files under lib/. Many of these are shared services consumed by several features—not 25 separate products.
Interpretation
Only a minority of files sit on the “hard to fake completely” boundary, but they underpin cross-cutting flows: sign-in and callbacks, attachments, notifications, home screen widgets, deep links, rich editor embeds.
On-device or weekly smoke remains important for those flows; it is not true that most of the app must be covered by expensive E2E.
Rule of thumb for stakeholders: ~21 feature areas; several critical journeys benefit from scheduled smoke; the majority of business rules and UI states are cheaper to cover with use case, BLoC, and widget tests if boundaries stay clean.
flowchart TB
subgraph fastCI [Fast CI - GitHub Actions]
unit[Unit utils parsers]
bloc[BLoC Cubit bloc_test]
usecase[Use cases fake repos]
widget[Widget tests]
golden[Golden tests optional]
contract[API contract or fixture HTTP tests]
end
subgraph slowManual [Weekly or manual]
integ[integration_test on device or emulator]
smoke[Smoke subset of critical journeys]
end
subgraph hardE2E [Rare deep E2E if needed]
appium[Only if Flutter integration_test insufficient]
end
unit --> bloc
bloc --> usecase
usecase --> widget
widget --> golden
contract --> usecase
integ --> smoke
Intent: Catch integration issues that unit tests miss, and reduce repetitive manual checks for QA—not to duplicate every manual case.
Reality: Expensive in time and infrastructure; no device farm in CI today. Recommendation: Run a small fixed set of integration_test journeys once per week (or per release candidate), with a named owner and published pass/fail.
Suggested smoke scope (5–10 journeys, illustrative):
Enter instance URL and complete sign-in path (already aligned with integration_test/sign_in_test.dart).
Open a work package from a list into details (navigation + data binding).
Attachment flow: pick or attach where the test uses fakes at the file/camera boundary where possible.
Deep link or cold start into a known route (if stable test URLs exist).
Optional: one path that touches WebView or rich editor only if flakiness stays acceptable.
QA handoff: Weekly smoke narrows regression risk on “whole app glue”; it does not remove need for exploratory testing on new features or visual polish.
Widget tests: Prefer fake repositories or fixed Cubit/BLoC states so failures localize to layout and interaction, not wire format.
Golden tests: Best for design-system widgets and stable screens. Plan for maintenance cost when typography, themes, or locales change. CI must use a single pinned environment for goldens (see Appendix).
BLoC mocked versus Dio mocked in widget tests
Approach |
When to use |
Trade-off |
|---|---|---|
Mock / fake BLoC or fixed state |
Most widget and golden tests |
Fast, stable; does not prove HTTP parsing. |
Fake repository at domain boundary |
When the widget depends on orchestration outcomes |
More logic than a dumb bloc mock, still avoids JSON in every test. |
Mock Dio deep in the tree |
Rarely |
Couples UI tests to serialization; noisy failures; prefer dedicated API tests instead. |
More “logic covered” without device tests: Put that in use case tests with a fake port (same idea as integration_test/mocks/mock_auth_client.dart at unit speed).
Intent: Detect client breakage when the API or HAL changes.
Recommendation: Implement fixture-backed or staging-backed tests in or beside packages/openproject_api_sdk: status codes, error bodies, parsing, and critical query shapes. Optionally trigger workflows when the API repository changes—only after a minimal runnable suite exists; otherwise hooks create noise without signal.
Do not rely on “run every BLoC” as a proxy for API correctness; BLoCs with mocks prove app logic, not server truth.
Continue as the default for new rules and regressions. This layer already exists; extend it for every non-trivial state machine and use case branch.
This is an optional pattern—not the default for every feature—when the team wants a single automated “snapshot” of a flow (navigation + parsing + UI) under CI without a device.
Shape of the approach
Pump most or all of the app (real MaterialApp / router / GetIt where practical).
Replace HTTP with Dio (or HTTP client) adapters that return bodies from static JSON files under test/ (or a shared fixture package).
Fake or mock platform plugins (auth browser, file picker, notifications, etc.) so the test stays on flutter test.
Drive the same user actions as in a manual flow (tap, enterText, scroll) with stable finders or Keys.
Capture golden images (or equivalent screenshots) at milestone states to form a visual snapshot of the feature.
When it helps
Regressions in wired flows you scripted (navigation, bloc orchestration, mapping JSON → UI).
Unintended UI changes at captured steps (strong signal if goldens are reviewed).
Parsing and field usage for the exact JSON you checked in—only as accurate as fixtures are kept.
Costs and risks
High authoring cost (DI, routing, splash/onboarding, timing). High maintenance when routes, l10n, theme, or fixtures change. Risk of duplicate truth if the same JSON is not aligned with SDK contract tests—prefer one fixture source or generate from OpenAPI where possible.
Does not replace contract tests at the API layer for unknown server changes; fixtures that nobody updates create false confidence.
Does not catch real OS or plugin behavior (everything is mocked).
Use this pattern for few high-value journeys (for example one happy path per critical feature), not as the only test type for every screen.
“Breaking change” here means anything that could ship a bad build: wrong data, crash, wrong UI, broken navigation, incompatible API, or environment-specific failure.
Category |
API / JSON contract drift |
App logic & state |
UI layout & visuals |
Navigation & deep links |
Real device / OS / plugins |
|---|---|---|---|---|---|
Unit |
Low |
Low (local only) |
None |
None |
None |
BLoC / Cubit |
Low (unless bloc parses raw JSON) |
High for covered transitions |
Low |
Low |
None |
Use case + fake repo |
Low at HTTP edge |
High for orchestration |
None |
Low |
None |
Widget (scoped, fake state) |
Low |
Medium (binding only) |
High for pumped screens |
Medium |
None |
Golden (selective) |
Low |
Low |
High at snapshot points |
Low |
None |
Contract / API tests (fixtures or staging) |
High |
Low |
None |
Low |
Low (staging deps) |
Flow snapshot (full app + JSON + goldens) |
Medium (only if fixtures match reality) |
High for scripted paths |
High at milestones |
High for scripted paths |
Low |
|
Medium–high (if real backend) |
High |
Medium |
High |
High for covered plugins |
Reading the table: No single layer scores high everywhere. Combine contract tests (server truth), BLoC/use case (rules), scoped widget or goldens (UI), and a small set of device smokes or flow snapshots for glue.
Ordered by defect prevention per minute of maintenance for this codebase:
Contract or fixture-backed API tests — addresses unaware API-side breaks; lives next to HTTP/DTO code.
BLoC and use case tests — fast feedback on business rules and orchestration.
Widget tests — non-trivial UI, errors, empty states, accessibility fixes where applicable.
Golden tests — selective; design system and stable screens; needs CI discipline.
Weekly **integration_test** smoke — small journey set; human-process ownership.
Flow snapshot tests (optional) — use sparingly for critical end-to-end UI stories under flutter test; pair with API contract tests so JSON fixtures do not drift silently.
Why flow snapshot is last in the numbered list — That list ranks return per minute of maintenance (and CI fit), not “business unimportance.” Flow snapshots combine DI, routing, fixtures, and goldens and overlap API and visual checks unless limited to very few journeys. Prefer them after cheaper layers, or only where one scripted story is worth that cost.
Two orderings (do not confuse them)
ROI / next-hour investment: Favor contract/API, BLoC/use case, scoped widget, then smoke, then optional flow snapshot—sensible when choosing one extra layer.
Bootstrap / delivery sequence: Starting with wider tests (for example weekly smoke, a thin integration_test slice) can help momentum, learning, and visible wins; it is not the long-term inverted pyramid. Tighten with smaller tests around code that actually breaks.
If there is no time for “everything” (digest)
Fixture or contract tests at the HTTP client — server drift.
BLoC and use case tests — rules and branches.
A small device smoke set — glue.
Scoped widget tests — risky UI states.
Goldens — only with pinned CI and agreed scope.
Flow snapshots — few critical stories, not a duplicate of the whole pyramid.
Bug-driven deepening (works with “big tests first”)
You may prioritize wide tests early; still add unit / BLoC / use case (or a small widget test) when fixing a bug or touching non-trivial logic—cheap regression nets grow on real pain. Use bugs and meaningful edits as triggers, not vague “when we have time.” For new API or domain behavior, add at least a contract or use case happy path—not only tests born from defects—so happy paths do not stay untested.
Layer |
Effort to write |
Effort to maintain |
Flake risk |
CI fit today |
|---|---|---|---|---|
Unit |
Low |
Low |
Very low |
Excellent |
BLoC |
Low–medium |
Low |
Low |
Excellent |
Use case + fake repo |
Medium |
Low–medium |
Low |
Excellent |
Widget |
Medium |
Medium |
Low |
Good |
Golden |
Medium–high |
High (design/locale) |
Medium |
Good if OS pinned |
|
High |
Medium |
Medium–high |
Poor without device CI |
Cross-repo API hook |
Medium setup |
Low per change if automated from OpenAPI/fixtures |
Low |
Excellent once suite exists |
Flow snapshot (full app + fixtures + goldens) |
Very high |
High |
Medium–high |
Good if OS pinned for goldens |
The ranges below are indicative engineer-time for one medium-complexity feature in this codebase (significant UI + state + a few API calls). They are not estimates for legal or procurement use—teams vary with familiarity, DI shape, and how stable finders are.
Assumptions: AI = strong prompting + human review and correction; restricted environments may add time for redaction and offline iteration.
Test category |
Manual (typical range) |
AI-assisted (typical range) |
Notes |
|---|---|---|---|
Unit (helpers, parsers) |
0.25–1.5 h |
0.15–0.75 h |
AI excels at table-driven cases. |
BLoC / Cubit |
1–4 h |
0.5–2 h |
Depends on event/side-effect complexity. |
Use case + fake repo |
1.5–5 h |
1–3 h |
Fakes must match real ports; AI speeds scaffolding. |
Widget (scoped subtree, fake bloc/repo) |
2–8 h |
1–4 h |
Finder stability drives variance. |
Golden only (a few stable widgets or screens) |
2–6 h |
1–3 h |
First-time CI + font pinning not included. |
Contract / API (first endpoints + fixtures) |
3–12 h |
2–8 h |
Faster if OpenAPI or samples exist. |
|
4–16 h |
2.5–10 h |
Flakiness tuning often dominates. |
Flow snapshot (full app + Dio JSON + platform fakes + flow + goldens) |
1–3 days |
0.5–2 days |
DI + routing + async + baseline images; AI helps but does not remove integration pain. |
Test category |
Manual (typical range) |
AI-assisted (typical range) |
|---|---|---|
Unit / BLoC / use case |
0.25–2 h |
0.15–1.25 h |
Widget (scoped) |
0.5–3 h |
0.25–2 h |
Golden |
0.5–4 h |
0.25–3 h (often re-baselining images) |
Contract / API |
0.5–3 h |
0.25–2 h |
|
1–6 h |
0.5–4 h |
Flow snapshot |
0.5–2 days |
0.25–1.5 days |
What AI usually does not compress much
Topic |
Classic |
With AI assistance |
|---|---|---|
First draft of tests and mocks |
Slower |
Faster boilerplate and case enumeration |
Flaky test diagnosis |
Engineer-led |
Still engineer-led; AI may suggest hypotheses |
Golden review |
Human judgment |
Human judgment; AI should not “approve” pixels |
Secrets and restricted env |
Controlled manually |
Still require policy: no credentials in prompts, offline constraints respected |
Wrong green tests |
Rare if review is strict |
Higher risk if assertions are weak—review stays in Definition of Done |
Bottom line for management: AI reduces typing and scaffolding time; it does not remove review, CI stability, or product choices about what must be covered. Use the authoring time tables above when negotiating sprint capacity.
Sprint planning
Reserve a transparent band of capacity for tests on non-trivial work (for example 10–20%, tuned by team).
Definition of Done (example bullets):
New domain rule or branchy logic → use case or BLoC test.
New or risky UI states → widget test (and golden only if agreed).
New or changed API usage → contract or fixture test at the SDK/client layer.
Bug fix with reproduction → regression test where feasible.
TDD for bugs
Encourage: regression test first for reproducible bugs in logic or state machines (documents intent, prevents return of the defect).
Avoid mandating TDD for trivial copy, one-line layout, or pure asset changes—credibility with engineers matters.
This appendix is not a list of blockers; it is a list of places where strategy meets reality. Each item mixes risk (what goes wrong if ignored), open decision (what leadership or the team must choose), and environment limit (what GitHub Actions, emulators, or OS vendors do not guarantee). Use it when estimating cost, assigning owners, or explaining to stakeholders why a test type “works in principle” but needs guardrails.
Context: A policy of “run integration tests weekly” sounds simple. In practice it competes with releases, support, and PTO. If nobody is accountable, the habit dies and confidence drops back to manual-only without anyone updating the strategy doc.
Risk: Silent gaps—you believe smoke runs, but it has not run for weeks; regressions ship; QA is asked to compensate with broader manual passes under time pressure.
What to decide explicitly
Owner: One named person or rotating role responsible for kick-off, triage of failures, and escalation—not “the team.”
Device matrix: At minimum, over time, both Android and iOS (or two representative OS versions). Different OEMs still surface different WebView, keyboard, and permission quirks.
Artifacts: Store logs and failure screenshots (or video) in CI artifacts, a shared drive, or a ticket template so failures are debuggable offline and comparable week to week.
Environment limit: Hosted device farms cost money; local devices depend on who is in the office. Budget and access are management inputs, not engineering-only details.
Context: Golden tests rasterize widgets to pixels. Pixel output depends on font metrics, subpixel rendering, theme, device pixel ratio, and Skia/Impeller behavior. GitHub’s ubuntu-latest runners are not pixel-identical to macOS, iOS, or Android.
Risk: PRs fail only because the runner image changed, or because a designer updated a token that was never meant to block merge. Teams then disable goldens or stop updating baselines—losing the benefit entirely.
What to decide explicitly
Single source of truth: For example run goldens only on macos-latest, or use a pinned Docker image with bundled fonts and a fixed Flutter version—documented in the repo.
Update policy: Who may approve baseline image updates, and whether large visual diffs require design or QA sign-off.
Scope: Goldens for design tokens and stable shells first; avoid goldening every screen until the process is trusted.
Localization: Large translation drops (for example Crowdin OTA or mass l10n updates) can invalidate many baselines at once—decide whether goldens run under a fixed test locale and which strings are allowed to appear in golden-covered widgets.
Environment limit: Linux vs macOS font shaping differs; emulator vs physical device differs. “Looks the same to a human” is not the same as “byte-identical PNG.”
Context: The desirable story is: “API repo changed → client tests run → we know before merge.” That only works if the client repo contains a test suite that speaks the same contract as production (or staging), and if credentials and rate limits are handled.
Risk: A hook that runs a smoke URL against production creates flaky jobs, rate limits, and compliance issues. A hook that runs nothing meaningful trains everyone to ignore red builds.
What to decide explicitly
Input artifact: Prefer recorded fixtures, OpenAPI snapshots, or a dedicated staging with stable seed data over calling arbitrary production URLs from CI.
Failure semantics: Red means “client must adapt or API must roll back”—agree with backend owners what breaking means (response shape, status codes, deprecations).
Secrets: Where instance URLs and tokens live (GitHub secrets, vault); restricted environments may forbid outbound calls entirely—fixtures-only mode then becomes mandatory.
Environment limit: CI runners may not reach internal APIs without VPN or self-hosted runners; that is an infrastructure decision, not a test style decision.
Context: The app uses platform channels, local notifications, background services, and Firebase-related tooling for stability and diagnostics. CI is a headless, often non-Google Play Services Linux environment. It does not replicate APNs delivery, exact alarm policies on newer Android, or user permission flows the way a phone does.
Risk: Assuming “green CI means push works” creates false confidence. Real failures appear only in dogfood, staging, or store review.
What to decide explicitly
Split responsibilities: Automate pure logic (payload JSON parsing, mapping to domain models, idempotency) with unit or contract tests; keep OS integration on a short manual or staging checklist per release (or per notification feature).
Version matrix: Android notification permission and background execution rules change by OS version—QA and product should know which versions are in support.
Environment limit: Simulating “user dismissed notification” or “app killed then opened from tap” in CI is brittle; budget for targeted manual or device-farm runs for those stories when they change.
Context: Flutter’s **integration_test** package drives the app from Dart, shares the same isolate model, and is the default in the ecosystem. Appium (or similar) drives the UI from outside, often across a bridge, and shines when non-Flutter surfaces, system dialogs, or multi-app scenarios dominate.
Risk: Two stacks mean double maintenance, slower feedback, and harder debugging for the majority of flows that Flutter already covers.
What to decide explicitly
Use **integration_test** until a concrete gap is written down (for example “must validate OS share sheet with a specific third-party app”).
If Appium is adopted, cap scope to those gaps and fund training and stable device inventory.
Environment limit: For this codebase, the share of UI that requires Appium-style control is small relative to total features; default to **integration_test** first.
Context: This pattern gives a cinematic record of a feature under **flutter_test**, but it stacks DI setup, routing, fixture curation, and golden churn in one place.
Risk: The team maintains two sources of truth for JSON—fixtures in widget tests and reality on the server—unless contract tests own the canonical fixtures.
What to decide explicitly
Cap the number of flow-snapshot suites (for example “at most N active flows”).
Fixture ownership: Same owners as API client changes, or enforce generation from OpenAPI where possible.
Environment limit: Same as goldens: OS and fonts must be pinned for comparable screenshots.
Context: The app uses local storage (for example Drift/SQLite, preferences). Tests must control schema migrations, seed data, and clock (DateTime.now(), time zones) or become order-dependent and flaky.
Risk: Tests pass locally and fail in CI at midnight UTC, or fail only when run in parallel.
What to decide explicitly
Prefer in-memory databases or isolated temp directories per test where supported.
Inject clock and locale in tests that assert formatting or deadlines.
Environment limit: CI default locale may differ from a developer’s laptop—document or fix locale in tests that format dates and numbers.
Context: Some organizations forbid pasting production URLs or tokens into AI tools, block arbitrary outbound network from CI, or require audit trails for test data.
Risk: Engineers skip writing API tests because “CI cannot reach the server,” or leak secrets into logs and golden names.
What to decide explicitly
A fixture-only path for CI and a staging path for scheduled jobs, both documented.
Redaction rules for logs and for AI-assisted authoring (no credentials in prompts).
Environment limit: If outbound network is disallowed, contract tests must use checked-in HTTP recordings or static OpenAPI examples—there is no alternative in-process.
Revisit this strategy after major changes: introduction of golden CI, addition of API contract suite, or onboarding of a device farm. Revisit the appendix decisions (owners, OS pins, fixtures, secrets) when those change. Update the smoke journey list with QA when major flows ship or retire.
We are excited to announce the Beta Release of the OpenProject Mobile App — now available in the App Store and Google Play Store. This Beta version marks the beginning of our journey to bring OpenProject to your mobile devices, enabling you to stay connected and productive wherever you are.
Note: The app is currently under active development, and core features are being continuously improved. We invite you to test the app, share feedback, and help shape the future of OpenProject Mobile.
The OpenProject Mobile App is designed as a companion application to the OpenProject web and desktop experience. It allows you to:
Access your work packages and projects on the go.
React and respond quickly to updates, comments, and notifications.
Stay informed about project progress, tasks, and deadlines — anytime, anywhere.
Track your work and log time directly within the app to keep your reporting up to date.
The goal is to provide lightweight mobile access for essential collaboration and project management tasks, perfectly complementing the full web experience of OpenProject.
In this initial Beta version, you can:
Log in securely with your OpenProject credentials.
View and edit your work packages.
Comment and reply to discussions.
View your portfolio, program or project details.
Receive notifications about updates and mentions.
Quickly search and filter work packages.
Track and log your work time.
The OpenProject Mobile App introduces a set of features built specifically for mobile devices, designed to make project management faster, more focused, and more convenient wherever you are:
Attach photos directly from your camera: Capture and upload images instantly to work packages or comments — ideal for documenting on-site work, visual progress, or issues in real time.
Local notifications: Stay up to date with mentions, comments, and task updates through local notifications — even when the app isn’t open. Note: these are not yet real-time push notifications.
Create work packages fast: Quickly add new work packages in a distraction-free interface designed for fast, mobile-friendly input.
Run timers in focus mode: Track your work time effortlessly with built-in timers that run in the background, helping you stay focused and accurate with time logs.
Configure modules and dashboards: Customize what you see by enabling only the modules and views most relevant to you — keeping your mobile workspace clean and efficient.
Optimized touch interface: Navigate with ease using gestures, adaptive layouts, and mobile-first design tailored for smaller screens.
These mobile-specific capabilities enhance your ability to work efficiently, document instantly, and stay connected — all while maintaining focus and flexibility on the go.
The app is still under development, and many core features are planned for future updates, including:
Deep-linking (including on-premises support): Seamlessly open specific work packages, projects, or comments directly from links in emails, chats, or browser pages — whether you’re using the cloud or an on-premises instance.
Multi-device UI: Enjoy a consistent, responsive experience across phones, tablets and macOS, with layouts optimized for each device size and orientation.
Real-time push notifications: Receive updates instantly as they happen — from mentions and comments to task status changes — ensuring you never miss important activity.
Write internal comments: Add internal comments directly from the app, enabling secure collaboration within your project team while keeping external communications separate.
Meeting agendas in the app: Access and review meeting agendas on the go to stay prepared and aligned with your team wherever you are.
These upcoming features will make the OpenProject Mobile App even more connected, collaborative, and aligned with the full OpenProject experience.
As a Beta user, your feedback is invaluable. If you encounter issues or have suggestions, please let us know:
Using the flow to provide feedback directly from the app in the user settings.
Create a feedback work package directly in OpenProject Community.
Your input directly helps improve the mobile experience and ensure a stable, feature-rich public release.
The OpenProject Mobile App (Beta) is available now for:
iOS: [App Store link]
Android: [Google Play link]
To access and use the OpenProject Mobile App (Beta), you’ll need the following:
An active OpenProject account: Either from an OpenProject Cloud workspace or an OpenProject On-premises installation with API access enabled.
Having a signed certificate (https not http) on your instance to be able to log in.
Minimum OpenProject version: 17.0.0
_{BASE_URL}/admin/settings/experimental_.
Minimum system requirements:
iOS 15 or later
Android 12 or later
Built-in OAuth applications enabled: Make sure that the built-in OAuth applications are enabled in your administration settings ({BASE_URL}/admin/oauth/applications). This is required for successful login from the mobile app.
Network connection: Internet access is required for syncing data with your OpenProject instance.
Note: Some features, such as deep-linking and realtime push notifications, may depend on your organization’s configuration or will become available in future updates.
This is a Beta Release, which means the app may contain incomplete features and occasional bugs.
We recommend using it alongside the OpenProject web application for the full experience.
Method should always have a return value. If method doesn't return anything, it should be marked as void
Method naming: if method returns Widget, it should start with 'build'.
Preferably create stateless widgets, not methods if you build a reusable UI block
By default, we prefer using sealed event classes with a single **on<Event>** handler. This approach ensures compile-time exhaustiveness checks — if a new event subtype is added, the compiler will require handling it explicitly in the switch statement. It also improves code organization by keeping related event logic grouped together and easier to maintain.
// events.dart
sealed class WorkPackageFormEvent {}
final class WorkPackageFormInit extends WorkPackageFormEvent {}
final class WorkPackageFormRefresh extends WorkPackageFormEvent {}
final class WorkPackageFormSubmit extends WorkPackageFormEvent {}
final class WorkPackageFormUpdated extends WorkPackageFormEvent {}
// bloc.dart
on<WorkPackageFormEvent>(
(event, emit) => switch (event) {
WorkPackageFormInit() => _onInit(event, emit),
WorkPackageFormRefresh() => _onRefresh(event, emit),
WorkPackageFormSubmit() => _onSubmit(emit),
WorkPackageFormUpdated() => _onUpdated(event, emit),
},
);
If no event transformers (e.g., debounce, throttle, droppable, restartable) are required, always use the sealed-class + single-handler pattern for clarity and type safety.
When individual events require different concurrency or timing behaviors, use separate **on<SpecificEvent>** handlers to assign appropriate transformers and keep event processing independent.
on<WorkPackagesInitEvent>((event, emit) => _init(event, emit));
on<WorkPackagesRefreshEvent>((event, emit) => _refresh(event, emit));
on<WorkPackagesLoadEvent>((event, emit) => _load(event, emit));
// Example: distinct transformer for one event
on<WorkPackagesUpdateFilterEvent>(
transformer: debounceSequential(const Duration(milliseconds: 300)),
(event, emit) => _updateFilter(event, emit),
);
In summary:
✅ Default → sealed class + single on<Event> with switch
⚙️ Exception → multiple on<SpecificEvent> when distinct transformers are needed
A comprehensive test that we can run once in several sprints to check that all main features are working. This can be a base of automated tests
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
1.1 |
Fresh install — Android |
1. Uninstall any existing version |
App installs without errors; splash screen and onboarding are shown |
|
1.2 |
Fresh install — iOS |
1. Uninstall any existing version |
App installs without errors; splash screen and onboarding are shown |
|
1.3 |
Fresh install — complete login flow |
1. Fresh install |
User is authenticated and lands on Home dashboard |
|
1.4 |
Fresh install — no leftover data |
1. Fresh install after a previous installation existed |
No stale data, cached credentials, or broken state from the previous install |
|
1.5 |
Update over existing install — Android |
1. Install the previous release version |
App updates successfully; existing session is preserved |
|
1.6 |
Update over existing install — iOS |
1. Install the previous release version via TestFlight or direct install |
App updates successfully; existing session is preserved |
|
1.7 |
Session preserved after update |
1. Log in on the old version |
User is still logged in after update; no forced re-login unless intentional |
|
1.8 |
Cached data intact after update |
1. Use the app on old version (load projects, work packages) |
Previously cached content is still accessible or gracefully refreshed |
|
1.9 |
Settings preserved after update |
1. Change user preferences (e.g., activity order, notification settings) on old version |
User preferences are retained after the update |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
2.1 |
Launch app (not logged in) |
Cold-start the app with no active session |
Splash screen appears briefly, then redirects to Sign In page |
|
2.2 |
Sign in with valid credentials |
1. Enter valid server URL |
User is authenticated and redirected to Home dashboard |
|
2.3 |
Sign in with wrong password |
1. Enter valid server URL |
Error message is shown; user remains on Sign In page |
|
2.4 |
Sign in with no internet connection |
1. Enter valid server URL |
Error message is shown |
|
2.5 |
Sign in to a wrong server instance |
1. Enter an invalid URL (i.e. google.com) |
Error message is shown; user remains on Sign In page |
|
2.6 |
Instance selection via bottom sheet |
1. On Sign In page, tap the instance selector control |
Bottom sheet opens; selected instance URL is applied to the sign-in form |
|
2.7 |
Session persistence after app restart |
1. Log in successfully |
User lands directly on Home dashboard without seeing Sign In page |
|
2.8 |
Sign out |
1. Navigate to Account/User section |
User is signed out and redirected to Sign In page; session is cleared |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
3.1 |
First-time onboarding shown |
Install a fresh build and launch the app for the first time |
Onboarding carousel is shown before the login screen |
|
3.2 |
Swipe through onboarding pages |
Swipe left through all onboarding slides |
Each slide advances; progress indicator updates |
|
3.3 |
Skip onboarding |
Tap the Skip button on any onboarding page |
Onboarding is dismissed; user is taken to Sign In page |
|
3.4 |
Complete onboarding |
Advance through all slides to the last one and tap Continue/Get Started |
User is taken to Sign In page |
|
3.5 |
Onboarding not shown on second launch |
Complete onboarding, close the app, reopen it |
Onboarding is not shown again; app goes to Sign In or Home directly |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
4.1 |
Dashboard loads with widgets |
Log in and navigate to the Home tab |
Home dashboard loads; visible widgets display their content without errors |
|
4.2 |
Notifications widget |
View the Notifications widget on Home |
Widget shows the count of unread notifications |
|
4.3 |
Assigned to Me widget |
View the Assigned to Me widget |
Widget lists work packages currently assigned to the logged-in user |
|
4.4 |
Recently Edited widget |
View the Recently Edited widget |
Widget shows recently modified work packages |
|
4.5 |
Favorite Projects widget |
View the Favorite Projects widget |
Widget shows the user's starred/favorited projects |
|
4.6 |
Time Tracker widget |
View the Time Tracker widget |
Widget shows weekly tracked time summary |
|
4.7 |
Tap a work package in a widget |
Tap any work package listed in a Home widget |
App navigates to the Work Package Details screen for that item |
|
4.8 |
Tap a project in Favorite Projects |
Tap a project in the Favorite Projects widget |
App navigates to that project's overview |
|
4.9 |
Pull to refresh |
Pull down on the Home dashboard |
Dashboard data refreshes; widgets reload their content |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
5.1 |
Projects list loads |
Navigate to the Workspaces/Projects tab |
List of accessible projects is displayed |
|
5.2 |
Search projects |
Tap the search field and type a partial project name |
List filters to show matching projects only |
|
5.3 |
Filter by project type |
Apply a project type filter |
Only projects matching the selected type are shown |
|
5.4 |
Toggle favorites view |
Switch between "All Projects" and "Favorites" view |
List updates to show only favorited projects or all projects accordingly |
|
5.5 |
Open project overview |
Tap on a project in the list |
Project Overview page opens showing project details |
|
5.6 |
Project overview tabs |
Inside a project, switch between the available tabs (Details, Work Packages, Subprojects, etc.) |
Each tab loads its content correctly |
|
5.7 |
Navigate to work packages from project |
Inside a project's Work Packages tab, tap a work package |
Work Package Details screen opens for that item |
|
5.8 |
Subprojects list |
Open a project that has subprojects and view the Subprojects tab |
Subprojects are listed under that parent project |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
6.1 |
Work packages list loads |
Navigate to the Work Packages tab |
List of work packages loads correctly |
|
6.2 |
Filter work packages by status |
Apply a status filter (e.g., "In Progress") |
Only work packages with that status are shown |
|
6.3 |
Filter by assignee |
Apply an assignee filter |
Only work packages assigned to that person are shown |
|
6.4 |
Search work packages |
Type a query in the search field |
List filters to work packages matching the query |
|
6.5 |
Pull to refresh |
Pull down on the work packages list |
List refreshes with latest data from the server |
|
6.6 |
Tap a work package |
Tap any item in the list |
Work Package Details screen opens |
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
6.7 |
Details screen loads |
Open any work package |
Title, type, status, and description are displayed correctly |
|
6.8 |
Switch to Activity tab |
In Work Package Details, tap the Activity tab |
Activity/comment history is displayed |
|
6.9 |
Switch to Attachments tab |
Tap the Attachments tab |
Uploaded files are listed (or empty state shown) |
|
6.10 |
Switch to Relations tab |
Tap the Relations tab |
Related work packages are listed |
|
6.11 |
View a file attachment |
Tap an attachment in the Attachments tab |
File preview or download opens |
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
6.12 |
Open create form |
Tap the "+" / Create button on the Work Packages screen |
Create Work Package form opens |
|
6.13 |
Create with required fields |
1. Select a project |
New work package is created; user is navigated to its details or back to the list |
|
6.14 |
Validation on empty title |
Leave the subject/title field empty and tap Save |
Validation error is shown; work package is not created |
|
6.15 |
Cancel creation |
Open the create form and tap Cancel/Back |
Form closes; no work package is created |
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
6.16 |
Edit title |
Open work package details, tap Edit, change the title, save |
Updated title is reflected in the details view |
|
6.17 |
Change status |
In work package details or edit form, change the status field |
Status updates and the change appears in the Activity tab |
|
6.18 |
Change assignee |
Edit the assignee field and save |
New assignee is shown in the details |
|
6.19 |
Edit description |
Open the description editor, make a change, save |
Updated description is rendered in the details view |
|
6.20 |
Add a comment |
In the Activity tab, type a comment and submit |
Comment appears in the activity timeline |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
7.1 |
Time tracking page loads |
Navigate to the Time Tracking tab |
Calendar view loads with existing time entries |
|
7.2 |
Navigate calendar dates |
Tap previous/next day or week in the calendar |
View updates to show entries for the selected period |
|
7.3 |
View daily time entries |
Tap a specific date in the calendar |
Time entries for that day are displayed below |
|
7.4 |
Weekly hours summary |
View the time tracking page for a week |
Total hours logged for the week are shown |
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
7.5 |
Open focus timer |
Navigate to the Timer tab within Time Tracking |
Focus timer page shows with a circular timer at 00:00 |
|
7.6 |
Start timer |
Tap the Start button |
Timer begins counting up; Start changes to Pause |
|
7.7 |
Pause and resume timer |
Tap Pause, then tap Resume |
Timer pauses at the current time; resuming continues from that point |
|
7.8 |
Stop timer |
Tap Stop |
Timer stops; Create Log Time form opens to finalize the entry |
|
7.9 |
Link work package to timer |
Before or during timing, select a work package to link |
Timer shows the linked work package name |
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
7.10 |
Create log time entry |
1. Open Create Log Time form |
Time entry is saved and appears in the time tracking calendar |
|
7.11 |
Validation on empty hours |
Submit log time form without entering hours |
Validation error is shown; entry is not saved |
|
7.12 |
Date selection |
Change the date field to a past date and save |
Time entry is saved for the selected date |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
8.1 |
Open global search |
Tap the Search icon in the navigation |
Global Search screen opens with Work Packages and Projects tabs |
|
8.2 |
Search for a work package |
Type a work package title in the search field (Work Packages tab) |
Matching work packages appear in the results list |
|
8.3 |
Search for a project |
Switch to the Projects tab and type a project name |
Matching projects appear in results |
|
8.4 |
Filter search results |
Apply a filter (status, type, etc.) within Work Packages search |
Results are narrowed to match the applied filter |
|
8.5 |
Navigate to result |
Tap a work package in search results |
Work Package Details screen opens for that item |
|
8.6 |
Navigate to project result |
Tap a project in search results |
Project Overview page opens |
|
8.7 |
Empty state |
Search for a string with no matches |
Empty state message is shown; no crash |
|
8.8 |
Clear search query |
Clear the search input field |
Results reset; prior state or empty prompt is shown |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
9.1 |
Notifications list loads |
Navigate to the Notifications tab |
List of notifications is displayed |
|
9.2 |
Notification count badge |
Check the Notifications tab icon when there are unread notifications |
Badge shows correct unread count |
|
9.3 |
View notification details |
Tap a notification in the list |
Associated work package details are shown inline or the user is navigated to it |
|
9.4 |
Notification reason |
Tap or long-press a notification to see the reason |
Bottom sheet or tooltip explains why the user was notified (e.g., "Assigned to you") |
|
9.5 |
Mark as read |
Mark a notification as read (if the action is available) |
Notification is marked read; unread count decreases |
|
9.6 |
Empty state |
View Notifications when there are none |
Empty state message is displayed; no crash |
|
9.7 |
Pull to refresh |
Pull down on the notifications list |
List refreshes with latest notifications |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
10.1 |
Open user profile |
Navigate to Account/User tab |
User profile page shows name, email, and avatar |
|
10.2 |
View account details |
Tap on Account Details |
Account info page opens with the user's profile data |
|
10.3 |
View another user's profile |
Tap a user's avatar or name (e.g., in work package details) |
That user's profile view opens with their basic info |
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
10.4 |
Open notification settings |
Go to Settings → User Notifications |
Notification preferences screen opens |
|
10.5 |
Toggle a notification preference |
Toggle an email notification setting on or off |
Setting is saved; toggle reflects the new state after navigating away and back |
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
10.6 |
Open work package settings |
Go to Settings → Work Package Settings |
Settings page opens |
|
10.7 |
Change activity sort order |
Switch activity order between newest/oldest first |
Setting is saved; activity in work packages reflects the chosen order |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
11.1 |
Open editor |
Edit the description of a work package or add a comment |
Rich text editor opens |
|
11.2 |
Bold text |
Select text and tap the Bold button |
Selected text becomes bold |
|
11.3 |
Italic text |
Select text and tap the Italic button |
Selected text becomes italic |
|
11.4 |
Bullet list |
Tap the unordered list button and type items |
Bullet list is created |
|
11.5 |
Numbered list |
Tap the ordered list button and type items |
Numbered list is created |
|
11.6 |
Add a hyperlink |
Tap the link button, enter a URL and display text |
Link is inserted and rendered as clickable text |
|
11.7 |
Heading formatting |
Select a heading level and type |
Text is rendered as a heading |
|
11.8 |
Mention a user |
Type @ followed by a username |
Autocomplete suggestion appears; selecting it inserts a user mention |
|
11.9 |
Mention a work package |
Type # followed by a work package ID or title |
Autocomplete suggestion appears; selecting it inserts a work package link |
|
11.10 |
Save edited content |
Make changes and tap Save/Done |
Changes are persisted and rendered correctly in the details view |
|
11.11 |
Discard changes |
Make changes and tap Cancel/Back without saving |
Changes are discarded; original content is unchanged |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
12.1 |
Share a file from another app |
From the device Files app (or another app), share a file and select OpenProject |
OpenProject opens the Share page with the file ready to attach |
|
12.2 |
Select a project for attachment |
On the Share page, select a target project |
Project is selected and work packages for that project are available |
|
12.3 |
Select a work package |
Select a work package to attach the file to |
Work package is confirmed as the attachment target |
|
12.4 |
Confirm attachment upload |
Tap Attach/Confirm |
File is uploaded to the selected work package; success state is shown |
|
12.5 |
Cancel sharing |
Open the Share page and tap Cancel/Back |
App closes the share intent; no file is uploaded |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
13.1 |
Bottom navigation tabs |
Tap each icon in the bottom navigation bar |
Each tab navigates to the correct screen |
|
13.2 |
Back navigation |
Navigate into a deep screen and tap the back button/gesture |
App navigates back through the screen stack correctly |
|
13.3 |
Deep link to work package |
Open a valid deep link to a work package (e.g., from a email) |
App opens and navigates directly to the correct work package |
|
13.4 |
App runs without crashes (baseline) |
Use the app normally for 5 minutes across multiple screens |
No unexpected crashes or ANR (unresponsive) events occur |
Minimal pre-release checklist. Covers only the highest-risk, must-pass cases.
**Full test suite:** See Comprehensive list
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
1.1 |
Fresh install |
Uninstall the app, install the new build, launch it |
App opens without errors; onboarding or login screen is shown |
|
1.2 |
Update over existing install |
Install the previous release, log in, then install the new build on top |
App launches; user is still logged in, no crash |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
2.1 |
Sign in with valid credentials |
Enter a valid instance URL, email, and password; tap Sign In |
User reaches the Home dashboard |
|
2.2 |
Sign in with wrong credentials |
Enter a valid URL with a wrong password; tap Sign In |
Error message is shown; user stays on Sign In page |
|
2.3 |
Session persists after restart |
Log in, close the app fully, reopen it |
User lands on Home dashboard without re-login |
|
2.4 |
Sign out |
Navigate to Account, tap Log Out |
User is returned to the Sign In screen |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
3.1 |
Dashboard loads |
Log in and open the Home tab |
Widgets load without errors or blank screens |
|
3.2 |
Navigate from widget |
Tap a work package in any Home widget |
Work Package Details screen opens |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
4.1 |
Projects list loads |
Open the Workspaces tab |
List of projects is displayed |
|
4.2 |
Open a project |
Tap any project in the list |
Project overview opens with at least one tab loading correctly |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
5.1 |
Work package list loads |
Open the Work Packages tab |
List of work packages is displayed |
|
5.2 |
Open work package details |
Tap any work package |
Details screen shows title, status, and description |
|
5.3 |
Create a work package |
Tap "+", fill in title, type, and project; save |
Work package is created and visible in the list |
|
5.4 |
Edit a field |
Open a work package, change the status, save |
Updated status is shown in the details view |
|
5.5 |
Add a comment |
Open a work package, go to Activity tab, post a comment |
Comment appears in the activity timeline |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
6.1 |
Time tracking page loads |
Open the Time Tracking tab |
Calendar and time entries load |
|
6.2 |
Start and stop timer |
Open the Timer tab, tap Start, wait a few seconds, tap Stop |
Log Time form opens pre-filled with elapsed time |
|
6.3 |
Save a time entry |
Fill in the Log Time form and confirm |
Entry is saved and appears in the calendar view |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
7.1 |
Search returns results |
Open Search, type a known work package title |
Matching results appear in the list |
|
7.2 |
Navigate to result |
Tap a result |
Correct work package detail screen opens |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
8.1 |
Notifications list loads |
Open the Notifications tab |
Notification list is displayed (or empty state shown) |
|
8.2 |
Tap a notification |
Tap any notification |
Associated work package detail opens |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
9.1 |
Profile loads |
Open the Account tab |
User name, email, and avatar are displayed |
|
9.2 |
Settings are accessible |
Open Account → Work Package Settings |
Settings page opens without error |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
10.1 |
Bottom nav tabs all work |
Tap each icon in the bottom navigation bar |
Each tab opens its correct screen |
|
10.2 |
Back navigation |
Go several screens deep, press back |
App navigates back correctly without crash |
|
10.3 |
Offline error handling |
Disable network, try to load any screen |
Error or offline message shown; app does not crash |
|
10.4 |
No crash during basic usage |
Use the app across all main sections for ~10 minutes |
No crashes or unresponsive states occur |
Minimal pre-release checklist. Covers only the highest-risk, must-pass cases.
**Full test suite:** See Comprehensive list
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
1.1 |
Fresh install |
Uninstall the app, install the new build, launch it |
App opens without errors; onboarding or login screen is shown |
|
1.2 |
Update over existing install |
Install the previous release, log in, then install the new build on top |
App launches; user is still logged in, no crash |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
2.1 |
Sign in with valid credentials |
Enter a valid instance URL, email, and password; tap Sign In |
User reaches the Home dashboard |
|
2.2 |
Sign in with wrong credentials |
Enter a valid URL with a wrong password; tap Sign In |
Error message is shown; user stays on Sign In page |
|
2.3 |
Session persists after restart |
Log in, close the app fully, reopen it |
User lands on Home dashboard without re-login |
|
2.4 |
Sign out |
Navigate to Account, tap Log Out |
User is returned to the Sign In screen |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
3.1 |
Dashboard loads |
Log in and open the Home tab |
Widgets load without errors or blank screens |
|
3.2 |
Navigate from widget |
Tap a work package in any Home widget |
Work Package Details screen opens |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
4.1 |
Projects list loads |
Open the Workspaces tab |
List of projects is displayed |
|
4.2 |
Open a project |
Tap any project in the list |
Project overview opens with at least one tab loading correctly |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
5.1 |
Work package list loads |
Open the Work Packages tab |
List of work packages is displayed |
|
5.2 |
Open work package details |
Tap any work package |
Details screen shows title, status, and description |
|
5.3 |
Create a work package |
Tap "+", fill in title, type, and project; save |
Work package is created and visible in the list |
|
5.4 |
Edit a field |
Open a work package, change the status, save |
Updated status is shown in the details view |
|
5.5 |
Add a comment |
Open a work package, go to Activity tab, post a comment |
Comment appears in the activity timeline |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
6.1 |
Time tracking page loads |
Open the Time Tracking tab |
Calendar and time entries load |
|
6.2 |
Start and stop timer |
Open the Timer tab, tap Start, wait a few seconds, tap Stop |
Log Time form opens pre-filled with elapsed time |
|
6.3 |
Save a time entry |
Fill in the Log Time form and confirm |
Entry is saved and appears in the calendar view |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
7.1 |
Search returns results |
Open Search, type a known work package title |
Matching results appear in the list |
|
7.2 |
Navigate to result |
Tap a result |
Correct work package detail screen opens |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
8.1 |
Notifications list loads |
Open the Notifications tab |
Notification list is displayed (or empty state shown) |
|
8.2 |
Tap a notification |
Tap any notification |
Associated work package detail opens |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
9.1 |
Profile loads |
Open the Account tab |
User name, email, and avatar are displayed |
|
9.2 |
Settings are accessible |
Open Account → Work Package Settings |
Settings page opens without error |
---
# |
Use Case |
Steps |
Expected Result |
Result |
|---|---|---|---|---|
10.1 |
Bottom nav tabs all work |
Tap each icon in the bottom navigation bar |
Each tab opens its correct screen |
|
10.2 |
Back navigation |
Go several screens deep, press back |
App navigates back correctly without crash |
|
10.3 |
Offline error handling |
Disable network, try to load any screen |
Error or offline message shown; app does not crash |
|
10.4 |
No crash during basic usage |
Use the app across all main sections for ~10 minutes |
No crashes or unresponsive states occur |
to have a signed certifcate (https) on your instance
open {BASE_URL}/admin/settings/experimental
enable "Built in OAuth applications" flag
open {BASE_URL}/admin/oauth/applications
enable "Built-in OAuth applications" there
log in inside the app
NOTE: from version 17.0, the flag "Built in OAuth applications" is not in experimental any more
The app uses SharedPreferences for local data persistence approach to manage different data scopes. For different platforms (ios, android, desktops) this storage has different naming. All these implementation are covered under one umbrella of flutter library shared_preferences.
This document describes the architecture, data flow, categorisation, and naming convention.
1. PreferencesStorage - Low-level wrapper around SharedPreferences
2. MultiUserPreferencesStorage - Helper for multi-user data storage
3. SettingsRepository - Repository layer for accessing settings
4. Use Cases - Business logic layer (GetUserSettingUseCase, SaveUserSettingUseCase)
5. BLoCs - Presentation layer that uses Use Cases
BLoC/Service
↓ (uses)
Use Case (GetUserSettingUseCase/SaveUserSettingUseCase)
↓ (gets current userId)
UserRepository
↓ (passes userId to)
SettingsRepository
↓ (uses)
MultiUserPreferencesStorage
↓ (uses)
PreferencesStorage (SharedPreferences wrapper)
Currently preferences are organised into four categories based on their scope and lifecycle:
Scope: Per-user data
Lifecycle: Persists across logout (for user switching support)
Storage Format: `{"userId1": data1, "userId2": data2}`
Access: Via Use Cases (GetUserSettingUseCase/SaveUserSettingUseCase)
Scope: Application-wide settings
Lifecycle: Persists across all sessions and users
Storage Format: Direct key-value pairs
Access: Direct repository access (no Use Cases needed)
Scope: OpenProject server configuration
Lifecycle: Persists until instance is changed
Storage Format: Direct key-value pairs
Access: Via InstanceConfigurationRepository
Scope: Deprecated keys pending migration
Lifecycle: Various
Status: Should not be used in new code
Key |
Type |
Description |
Used In |
|---|---|---|---|
|
BottomBarConfiguration |
Bottom navigation bar customization per user |
BottomBarConfigurationRepository |
|
Timer |
Active time tracking timers per user |
TimeEntriesRepository |
|
WorkPackageSettings |
Work package display preferences (sorting, filtering, activities display) |
SettingsRepository |
|
LocalNotificationsSettings |
Local notification preferences (enabled/disabled, participants, weekdays) |
SettingsRepository |
|
HomeDashboardWidgets |
Home dashboard widget configuration and visibility |
SettingsRepository |
|
bool |
Push notification toggle per user |
PreferencesStorage (direct) |
|
int (timestamp) |
Last project sync timestamp for incremental sync |
ProjectsSyncPreferences |
|
int |
Default launch page index (which tab opens on startup) |
SettingsRepository |
Key |
Type |
Description |
Used In |
|---|---|---|---|
|
String (ThemeMode) |
App theme mode: light, dark, or system |
SettingsRepository |
|
String |
User's selected language code (e.g., "en", "de") |
LocaleRepository |
|
DeveloperSettings |
Developer mode settings and feature toggles |
SettingsRepository |
|
FeatureFlags |
Feature flags configuration (experimental features) |
SettingsRepository |
Key |
Type |
Description |
Used In |
|---|---|---|---|
|
String |
OpenProject instance base URL |
InstanceConfigurationRepository |
|
String |
OAuth client ID for the instance |
InstanceConfigurationRepository |
|
Map<String, String> |
Map of instance URLs to client IDs for multi-instance support |
InstanceConfigurationRepository |
Key |
Type |
Description |
Status |
|---|---|---|---|
|
List<int> |
IDs of unread notifications |
Used in background service, needs migration |
Follow the naming convention for new keys:
- Multi-user: multi_user_<descriptive_name>
- App-level: app_<descriptive_name>
- Instance-level: instance_<descriptive_name>
If you’re having trouble logging in to the OpenProject Mobile App, the following sections will help you identify and resolve the most common issues.
Symptom:
You see an error such as “We can't connect with the instance URL. Please, check possible solutions here”
Cause:
The URL you entered may be incorrect, inaccessible, or not using HTTPS.
How to Fix:
Double-check the URL format (e.g., https://yourcompany.openproject.com).
Ensure your instance is publicly accessible and uses HTTPS (HTTP is not supported).
Try opening the same URL in your mobile browser to confirm connectivity.
Symptom:
Login fails with an error such as “We can't complete the OAuth Authentication. Please, check possible solutions here”, or you are redirected back to the login screen without authentication.
Cause:
The mobile app uses OAuth 2.0 for secure authentication. If the built-in OAuth applications are not enabled in your instance, the app cannot log you in.
How to Fix:
Go to your OpenProject administration area at:
{BASE_URL}/admin/oauth/applications
Make sure that Built-in OAuth applications are enabled.
If you don’t have admin rights, contact your OpenProject administrator.
Symptom:
You receive an error such as “Instance not on minimum supported version: OpenProject 17.0.0”, or the authentication window fails to open.
Cause:
The OpenProject Mobile App requires your instance to be on OpenProject version 17.0.0 or later.
If your instance is running an older version, OAuth authentication may be disabled by default.
How to Fix:
Ask your OpenProject administrator to check the current version of your instance.
Update to newer version of OpenProject.
If updating is not am option, the administrator can temporarily enable OAuth authentication by removing the feature flag under:
{BASE_URL}/admin/settings/experimental
Once this flag is removed, the built-in OAuth applications will be available in {BASE_URL}/admin/oauth/applications, once enabled the users can log in via the mobile app.
💡 Note: Upgrading to the latest OpenProject version is recommended for the best compatibility and security.
Symptom:
You receive a message such as “Secure connection failed. Untrusted certificate”.
Cause:
Your OpenProject instance must use a valid, signed SSL certificate (HTTPS). Self-signed certificates or expired certificates are not supported.
How to Fix:
Verify that your SSL certificate is valid and trusted by your device.
If you’re using a self-signed certificate, replace it with one from a trusted certificate authority (CA).
Symptom:
You see “Invalid username or password” when logging in.
Cause:
Your login credentials are incorrect or have been changed.
How to Fix:
Make sure you’re using your OpenProject account credentials, not your email alias (unless configured as your username).
Try logging in via the web version of OpenProject to confirm your credentials.
Reset your password if necessary.
Symptom:
Login attempts fail with no clear error message.
Cause:
Your on-premises OpenProject instance may have API access disabled, preventing the mobile app from connecting.
How to Fix:
Log in as an administrator and navigate to:
Administration → System settings → API
Ensure that API access is enabled.
Save changes and try logging in again.
Symptom:
The app refuses to connect or shows “Secure connection failed. Untrusted certificate”.
Cause:
The mobile app only supports secure connections via HTTPS.
How to Fix:
Configure your instance to use HTTPS with a valid certificate.
Redirect HTTP traffic to HTTPS using your web server configuration.
Symptom:
Login attempts time out or fail when using certain networks with an error such as “Login time out. Check your network”.
Cause:
Corporate or restricted networks may block outbound requests to your OpenProject instance or authentication endpoints.
How to Fix:
Check the network connection of your device. Internet access is required for the app to work.
Try connecting from a different network (e.g., mobile data).
Ask your IT team to whitelist your OpenProject domain.
Currently we have iOs and Android builds. Both of them have two flavors for now: openproject and pmflexone
to build apps for prod please run:
flutter build ios --flavor openproject --release
flutter build appbundle --flavor openproject --release
A comprehensive test that we can run once in several sprints to check that all main features are working. This can be a base of automated tests
---
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
1.1 |
Fresh install — Android |
1. Uninstall any existing version |
App installs without errors; splash screen and onboarding are shown |
1.2 |
Fresh install — iOS |
1. Uninstall any existing version |
App installs without errors; splash screen and onboarding are shown |
1.3 |
Fresh install — complete login flow |
1. Fresh install |
User is authenticated and lands on Home dashboard |
1.4 |
Fresh install — no leftover data |
1. Fresh install after a previous installation existed |
No stale data, cached credentials, or broken state from the previous install |
1.5 |
Update over existing install — Android |
1. Install the previous release version |
App updates successfully; existing session is preserved |
1.6 |
Update over existing install — iOS |
1. Install the previous release version via TestFlight or direct install |
App updates successfully; existing session is preserved |
1.7 |
Session preserved after update |
1. Log in on the old version |
User is still logged in after update; no forced re-login unless intentional |
1.8 |
Cached data intact after update |
1. Use the app on old version (load projects, work packages) |
Previously cached content is still accessible or gracefully refreshed |
1.9 |
Settings preserved after update |
1. Change user preferences (e.g., activity order, notification settings) on old version |
User preferences are retained after the update |
---
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
2.1 |
Launch app (not logged in) |
Cold-start the app with no active session |
Splash screen appears briefly, then redirects to Sign In page |
2.2 |
Sign in with valid credentials |
1. Enter valid server URL |
User is authenticated and redirected to Home dashboard |
2.3 |
Sign in with wrong password |
1. Enter valid server URL |
Error message is shown; user remains on Sign In page |
2.4 |
Sign in with no internet connection |
1. Enter valid server URL |
Error message is shown |
2.5 |
Sign in to a wrong server instance |
1. Enter an invalid URL (i.e. google.com) |
Error message is shown; user remains on Sign In page |
2.6 |
Instance selection via bottom sheet |
1. On Sign In page, tap the instance selector control |
Bottom sheet opens; selected instance URL is applied to the sign-in form |
2.7 |
Session persistence after app restart |
1. Log in successfully |
User lands directly on Home dashboard without seeing Sign In page |
2.8 |
Sign out |
1. Navigate to Account/User section |
User is signed out and redirected to Sign In page; session is cleared |
---
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
3.1 |
First-time onboarding shown |
Install a fresh build and launch the app for the first time |
Onboarding carousel is shown before the login screen |
3.2 |
Swipe through onboarding pages |
Swipe left through all onboarding slides |
Each slide advances; progress indicator updates |
3.3 |
Skip onboarding |
Tap the Skip button on any onboarding page |
Onboarding is dismissed; user is taken to Sign In page |
3.4 |
Complete onboarding |
Advance through all slides to the last one and tap Continue/Get Started |
User is taken to Sign In page |
3.5 |
Onboarding not shown on second launch |
Complete onboarding, close the app, reopen it |
Onboarding is not shown again; app goes to Sign In or Home directly |
---
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
4.1 |
Dashboard loads with widgets |
Log in and navigate to the Home tab |
Home dashboard loads; visible widgets display their content without errors |
4.2 |
Notifications widget |
View the Notifications widget on Home |
Widget shows the count of unread notifications |
4.3 |
Assigned to Me widget |
View the Assigned to Me widget |
Widget lists work packages currently assigned to the logged-in user |
4.4 |
Recently Edited widget |
View the Recently Edited widget |
Widget shows recently modified work packages |
4.5 |
Favorite Projects widget |
View the Favorite Projects widget |
Widget shows the user's starred/favorited projects |
4.6 |
Time Tracker widget |
View the Time Tracker widget |
Widget shows weekly tracked time summary |
4.7 |
Tap a work package in a widget |
Tap any work package listed in a Home widget |
App navigates to the Work Package Details screen for that item |
4.8 |
Tap a project in Favorite Projects |
Tap a project in the Favorite Projects widget |
App navigates to that project's overview |
4.9 |
Pull to refresh |
Pull down on the Home dashboard |
Dashboard data refreshes; widgets reload their content |
---
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
5.1 |
Projects list loads |
Navigate to the Workspaces/Projects tab |
List of accessible projects is displayed |
5.2 |
Search projects |
Tap the search field and type a partial project name |
List filters to show matching projects only |
5.3 |
Filter by project type |
Apply a project type filter |
Only projects matching the selected type are shown |
5.4 |
Toggle favorites view |
Switch between "All Projects" and "Favorites" view |
List updates to show only favorited projects or all projects accordingly |
5.5 |
Open project overview |
Tap on a project in the list |
Project Overview page opens showing project details |
5.6 |
Project overview tabs |
Inside a project, switch between the available tabs (Details, Work Packages, Subprojects, etc.) |
Each tab loads its content correctly |
5.7 |
Navigate to work packages from project |
Inside a project's Work Packages tab, tap a work package |
Work Package Details screen opens for that item |
5.8 |
Subprojects list |
Open a project that has subprojects and view the Subprojects tab |
Subprojects are listed under that parent project |
---
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
6.1 |
Work packages list loads |
Navigate to the Work Packages tab |
List of work packages loads correctly |
6.2 |
Filter work packages by status |
Apply a status filter (e.g., "In Progress") |
Only work packages with that status are shown |
6.3 |
Filter by assignee |
Apply an assignee filter |
Only work packages assigned to that person are shown |
6.4 |
Search work packages |
Type a query in the search field |
List filters to work packages matching the query |
6.5 |
Pull to refresh |
Pull down on the work packages list |
List refreshes with latest data from the server |
6.6 |
Tap a work package |
Tap any item in the list |
Work Package Details screen opens |
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
6.7 |
Details screen loads |
Open any work package |
Title, type, status, and description are displayed correctly |
6.8 |
Switch to Activity tab |
In Work Package Details, tap the Activity tab |
Activity/comment history is displayed |
6.9 |
Switch to Attachments tab |
Tap the Attachments tab |
Uploaded files are listed (or empty state shown) |
6.10 |
Switch to Relations tab |
Tap the Relations tab |
Related work packages are listed |
6.11 |
View a file attachment |
Tap an attachment in the Attachments tab |
File preview or download opens |
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
6.12 |
Open create form |
Tap the "+" / Create button on the Work Packages screen |
Create Work Package form opens |
6.13 |
Create with required fields |
1. Select a project |
New work package is created; user is navigated to its details or back to the list |
6.14 |
Validation on empty title |
Leave the subject/title field empty and tap Save |
Validation error is shown; work package is not created |
6.15 |
Cancel creation |
Open the create form and tap Cancel/Back |
Form closes; no work package is created |
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
6.16 |
Edit title |
Open work package details, tap Edit, change the title, save |
Updated title is reflected in the details view |
6.17 |
Change status |
In work package details or edit form, change the status field |
Status updates and the change appears in the Activity tab |
6.18 |
Change assignee |
Edit the assignee field and save |
New assignee is shown in the details |
6.19 |
Edit description |
Open the description editor, make a change, save |
Updated description is rendered in the details view |
6.20 |
Add a comment |
In the Activity tab, type a comment and submit |
Comment appears in the activity timeline |
---
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
7.1 |
Time tracking page loads |
Navigate to the Time Tracking tab |
Calendar view loads with existing time entries |
7.2 |
Navigate calendar dates |
Tap previous/next day or week in the calendar |
View updates to show entries for the selected period |
7.3 |
View daily time entries |
Tap a specific date in the calendar |
Time entries for that day are displayed below |
7.4 |
Weekly hours summary |
View the time tracking page for a week |
Total hours logged for the week are shown |
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
7.5 |
Open focus timer |
Navigate to the Timer tab within Time Tracking |
Focus timer page shows with a circular timer at 00:00 |
7.6 |
Start timer |
Tap the Start button |
Timer begins counting up; Start changes to Pause |
7.7 |
Pause and resume timer |
Tap Pause, then tap Resume |
Timer pauses at the current time; resuming continues from that point |
7.8 |
Stop timer |
Tap Stop |
Timer stops; Create Log Time form opens to finalize the entry |
7.9 |
Link work package to timer |
Before or during timing, select a work package to link |
Timer shows the linked work package name |
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
7.10 |
Create log time entry |
1. Open Create Log Time form |
Time entry is saved and appears in the time tracking calendar |
7.11 |
Validation on empty hours |
Submit log time form without entering hours |
Validation error is shown; entry is not saved |
7.12 |
Date selection |
Change the date field to a past date and save |
Time entry is saved for the selected date |
---
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
8.1 |
Open global search |
Tap the Search icon in the navigation |
Global Search screen opens with Work Packages and Projects tabs |
8.2 |
Search for a work package |
Type a work package title in the search field (Work Packages tab) |
Matching work packages appear in the results list |
8.3 |
Search for a project |
Switch to the Projects tab and type a project name |
Matching projects appear in results |
8.4 |
Filter search results |
Apply a filter (status, type, etc.) within Work Packages search |
Results are narrowed to match the applied filter |
8.5 |
Navigate to result |
Tap a work package in search results |
Work Package Details screen opens for that item |
8.6 |
Navigate to project result |
Tap a project in search results |
Project Overview page opens |
8.7 |
Empty state |
Search for a string with no matches |
Empty state message is shown; no crash |
8.8 |
Clear search query |
Clear the search input field |
Results reset; prior state or empty prompt is shown |
---
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
9.1 |
Notifications list loads |
Navigate to the Notifications tab |
List of notifications is displayed |
9.2 |
Notification count badge |
Check the Notifications tab icon when there are unread notifications |
Badge shows correct unread count |
9.3 |
View notification details |
Tap a notification in the list |
Associated work package details are shown inline or the user is navigated to it |
9.4 |
Notification reason |
Tap or long-press a notification to see the reason |
Bottom sheet or tooltip explains why the user was notified (e.g., "Assigned to you") |
9.5 |
Mark as read |
Mark a notification as read (if the action is available) |
Notification is marked read; unread count decreases |
9.6 |
Empty state |
View Notifications when there are none |
Empty state message is displayed; no crash |
9.7 |
Pull to refresh |
Pull down on the notifications list |
List refreshes with latest notifications |
---
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
10.1 |
Open user profile |
Navigate to Account/User tab |
User profile page shows name, email, and avatar |
10.2 |
View account details |
Tap on Account Details |
Account info page opens with the user's profile data |
10.3 |
View another user's profile |
Tap a user's avatar or name (e.g., in work package details) |
That user's profile view opens with their basic info |
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
10.4 |
Open notification settings |
Go to Settings → User Notifications |
Notification preferences screen opens |
10.5 |
Toggle a notification preference |
Toggle an email notification setting on or off |
Setting is saved; toggle reflects the new state after navigating away and back |
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
10.6 |
Open work package settings |
Go to Settings → Work Package Settings |
Settings page opens |
10.7 |
Change activity sort order |
Switch activity order between newest/oldest first |
Setting is saved; activity in work packages reflects the chosen order |
---
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
11.1 |
Open editor |
Edit the description of a work package or add a comment |
Rich text editor opens |
11.2 |
Bold text |
Select text and tap the Bold button |
Selected text becomes bold |
11.3 |
Italic text |
Select text and tap the Italic button |
Selected text becomes italic |
11.4 |
Bullet list |
Tap the unordered list button and type items |
Bullet list is created |
11.5 |
Numbered list |
Tap the ordered list button and type items |
Numbered list is created |
11.6 |
Add a hyperlink |
Tap the link button, enter a URL and display text |
Link is inserted and rendered as clickable text |
11.7 |
Heading formatting |
Select a heading level and type |
Text is rendered as a heading |
11.8 |
Mention a user |
Type @ followed by a username |
Autocomplete suggestion appears; selecting it inserts a user mention |
11.9 |
Mention a work package |
Type # followed by a work package ID or title |
Autocomplete suggestion appears; selecting it inserts a work package link |
11.10 |
Save edited content |
Make changes and tap Save/Done |
Changes are persisted and rendered correctly in the details view |
11.11 |
Discard changes |
Make changes and tap Cancel/Back without saving |
Changes are discarded; original content is unchanged |
---
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
12.1 |
Share a file from another app |
From the device Files app (or another app), share a file and select OpenProject |
OpenProject opens the Share page with the file ready to attach |
12.2 |
Select a project for attachment |
On the Share page, select a target project |
Project is selected and work packages for that project are available |
12.3 |
Select a work package |
Select a work package to attach the file to |
Work package is confirmed as the attachment target |
12.4 |
Confirm attachment upload |
Tap Attach/Confirm |
File is uploaded to the selected work package; success state is shown |
12.5 |
Cancel sharing |
Open the Share page and tap Cancel/Back |
App closes the share intent; no file is uploaded |
---
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
13.1 |
Bottom navigation tabs |
Tap each icon in the bottom navigation bar |
Each tab navigates to the correct screen |
13.2 |
Back navigation |
Navigate into a deep screen and tap the back button/gesture |
App navigates back through the screen stack correctly |
13.3 |
Deep link to work package |
Open a valid deep link to a work package (e.g., from a email) |
App opens and navigates directly to the correct work package |
13.4 |
App runs without crashes (baseline) |
Use the app normally for 5 minutes across multiple screens |
No unexpected crashes or ANR (unresponsive) events occur |
Minimal pre-release checklist. Covers only the highest-risk, must-pass cases.
**Full test suite:** See Comprehensive list
---
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
1.1 |
Fresh install |
Uninstall the app, install the new build, launch it |
App opens without errors; onboarding or login screen is shown |
1.2 |
Update over existing install |
Install the previous release, log in, then install the new build on top |
App launches; user is still logged in, no crash |
---
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
2.1 |
Sign in with valid credentials |
Enter a valid instance URL, email, and password; tap Sign In |
User reaches the Home dashboard |
2.2 |
Sign in with wrong credentials |
Enter a valid URL with a wrong password; tap Sign In |
Error message is shown; user stays on Sign In page |
2.3 |
Session persists after restart |
Log in, close the app fully, reopen it |
User lands on Home dashboard without re-login |
2.4 |
Sign out |
Navigate to Account, tap Log Out |
User is returned to the Sign In screen |
---
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
3.1 |
Dashboard loads |
Log in and open the Home tab |
Widgets load without errors or blank screens |
3.2 |
Navigate from widget |
Tap a work package in any Home widget |
Work Package Details screen opens |
---
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
4.1 |
Projects list loads |
Open the Workspaces tab |
List of projects is displayed |
4.2 |
Open a project |
Tap any project in the list |
Project overview opens with at least one tab loading correctly |
---
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
5.1 |
Work package list loads |
Open the Work Packages tab |
List of work packages is displayed |
5.2 |
Open work package details |
Tap any work package |
Details screen shows title, status, and description |
5.3 |
Create a work package |
Tap "+", fill in title, type, and project; save |
Work package is created and visible in the list |
5.4 |
Edit a field |
Open a work package, change the status, save |
Updated status is shown in the details view |
5.5 |
Add a comment |
Open a work package, go to Activity tab, post a comment |
Comment appears in the activity timeline |
---
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
6.1 |
Time tracking page loads |
Open the Time Tracking tab |
Calendar and time entries load |
6.2 |
Start and stop timer |
Open the Timer tab, tap Start, wait a few seconds, tap Stop |
Log Time form opens pre-filled with elapsed time |
6.3 |
Save a time entry |
Fill in the Log Time form and confirm |
Entry is saved and appears in the calendar view |
---
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
7.1 |
Search returns results |
Open Search, type a known work package title |
Matching results appear in the list |
7.2 |
Navigate to result |
Tap a result |
Correct work package detail screen opens |
---
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
8.1 |
Notifications list loads |
Open the Notifications tab |
Notification list is displayed (or empty state shown) |
8.2 |
Tap a notification |
Tap any notification |
Associated work package detail opens |
---
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
9.1 |
Profile loads |
Open the Account tab |
User name, email, and avatar are displayed |
9.2 |
Settings are accessible |
Open Account → Work Package Settings |
Settings page opens without error |
---
# |
Use Case |
Steps |
Expected Result |
|---|---|---|---|
10.1 |
Bottom nav tabs all work |
Tap each icon in the bottom navigation bar |
Each tab opens its correct screen |
10.2 |
Back navigation |
Go several screens deep, press back |
App navigates back correctly without crash |
10.3 |
Offline error handling |
Disable network, try to load any screen |
Error or offline message shown; app does not crash |
10.4 |
No crash during basic usage |
Use the app across all main sections for ~10 minutes |
No crashes or unresponsive states occur |
This folder contains all data, files, thoughts, approaches of testing the Mobile App. The info here is not final and will be improved.
Pages:
A short checklist of most required cases covering the critical path of every major feature. Use this as the minimum bar before any release. It is designed to be completed in affordable amount of time on both platforms.
Run this when:
A release build is ready for sign-off
A hotfix needs quick verification
Time is limited and a full regression is not feasible
A comprehensive manual test suite with more that 100 cases covering most features in depth, including some edge cases, empty states, error handling, and platform-specific scenarios. Use this for thorough regression testing.
Run this when:
A major version is about to be released
Significant changes were made to core features
A full regression cycle is required
Documents the automated test coverage, how to run the test suite locally and in CI, and how to interpret results. This document is in progress 🚧