Page MenuHomePhabricator

Outreachy 31: Scribe Client Mobile Application to Server Connections
Closed, ResolvedPublic

Description

Project title:

Scribe Client Mobile Application to Server Connections

Brief summary:

Context:

The Scribe community makes Wikidata based mobile keyboard applications to help second language learners communicate in the languages they're learning. We have one released client application, Scribe-iOS, which provides keyboards that allow users to translate words, conjugate verbs and contextualize what they're typing in ways to help them understand what grammar to use. We'll soon be releasing Scribe-Android, and in prior internships we have developed the Scribe-Data CLI to extract data from Wikidata as well as Scribe-Server, a Toolforge API to serve data to client applications.

The task:

We're now ready to connect all of the various applications that we've developed into a system where data from Wikidata is extracted on a regular basis and provided to our client mobile applications via the Toolforge API. This project will focus on developing Scribe-Android and Scribe-iOS to allow them to call the data from the server.

Skills required:

Kotlin for Android development, Swift for iOS development

NOTE: The intern would ideally have access to developing on macOS so that they can use Xcode to develop the iOS application.

Learning outcomes:

The intern will expand their knowledge in or learn the following:

  • Android and iOS mobile development
  • API calls and data usage in mobile applications
  • Scheduling API based data update processes
  • Testing in mobile applications to assure that the developed code is robust

Possible mentor(s):

Microtasks:

All good first issue and help wanted issues and Scribe community projects are available for Outreachy applicants.

Please read through the project README.md and CONTRIBUTING.md files for each project for all steps needed to get started with contributing! Other helpful documents are the Scribe Wikidata Guide, architecture diagram and data contracts documentation.

The following are the links to good first issue and help wanted issues for all Scribe projects:

Any other additional information that the interns should know about:

NOTE: Community communications for Scribe happen in our public Matrix chatrooms. If you're new to Matrix, we'd suggest using Element as your client :) Feel free to introduce yourself in the General room if you'd like, and communication for the projects involved will happen in the Mentorship Programs, Android, iOS, and Data rooms.
IMPORTANT: GSoC / Outreachy candidates are required to complete micro-tasks during the application period to prove their ability to work on a three month long project

Event Timeline

Is this project ready for submission to the Outreachy website?

Hi @SWangari-WMF 👋 Yes we're ready to submit to the Outreachy website :) I can't remember if we can just submit already or if WMF needs to invite us to add something. Happy to take the next step once we know what to do 😊

You're good to go.. once you're ready, you can go ahead and submit to Outreachy.. :) I've already approved another project there..

Hi @SWangari-WMF 👋 Sorry for the wait on adding the project to Outreachy! I've just added it, and all mentors above have been given the link to sign up as co-mentors :)

@Henrikt93, @Afi570, @DeleMike, @Gauthammohanraj: Please see the Mentors + Mentees channel on Matrix for the link to sign up as a co-mentor. If you could confirm in the thread on Matrix that you've signed up then that would be great! Thank you all!

To the mentors: Has anyone started contributing to this project?

Hi @SWangari-WMF 👋 We already have four Outreachy participants that I know of who are in the Matrix channels and are communicating about/working on issues :) Thanks for checking in! Please let us know if further information is needed 😊

That's good to hear @AndrewTavis_WMDE good luck to the participants.. :) Let me know if you have any questions. I'll be checking in from time to time.. Thanks!

LGoto triaged this task as Medium priority.Nov 5 2025, 9:30 PM

Assigned to @Purnamasrahayu 🎉 We've just finished our planning meeting for the internship and are all excited to get started 😊

Weekly Update
Week 1: December 8 - December 12

  1. Overview of Tasks Completed:
    • Built a proof of concept for connecting to Scribe-Server and writing data to the database
    • Expanded the download button options for Scribe-Android
    • Investigated inconsistent border radius behavior on the iOS 26 simulator
    • Fixed UI unresponsiveness when switching translation language on Scribe-iOS
    • Added support capitalized input in Scribe-Android commands
  1. Key Accomplishments:
    • Added “Update” state to the download button and check for available updates based on the last updated date
    • Successfully connected to the server and wrote data to the SQLite database
  1. Challenges Faced:
    • Data duplication occurs on each request
    • Difficulty overriding the default iOS border radius
  1. Learnings and Skills Gained:
    • Learned how to fetch API data and store it in SQLite using Swift.
    • Improved code structure by removing redundancy and avoiding multiple database openings based on feedback from the capitalized input support task
  1. Feedback and Support Needed:
    • Guidance on properly overriding the default iOS border radius
    • Advice on notifying users about errors during data downloads
  1. Goals for Next Week:
    • Finalize/see progress on Scribe-iOS download button UI
    • Connect server request to the download button once the component is ready

Weekly Update
Week 2: December 15 - December 19

  1. Overview of Tasks Completed:
    • Fixed corner radius issue on iOS 26
    • Created a tooltip to confirm the translation source language (Android)
    • Created a tooltip to confirm the translation source language (iOS)
  1. Key Accomplishments:
    • Created a new reusable ConfirmDialog component using Kotlin and SwiftUI
  1. Challenges Faced:
    • Integrating storyboard-based navigation with SwiftUI components
  1. Learnings and Skills Gained:
    • Learned how to build reusable components in Kotlin and SwiftUI using component properties
  1. Feedback and Support Needed:
    • Reviews and feedback on the corner radius fix and the Android tooltip implementation

Weekly Update
Week 3: December 22 - December 26

  1. Overview of Tasks Completed:
    • Use ConfirmDialog component in Installation tab (iOS)
    • Use ConfirmDialog in Settings/Translation source language (Android and iOS)
    • Hide uninstalled keyboards from languages list of Download language data screen
    • Fix setting app language to Indonesian (Android)
  1. Key Accomplishments:
    • Successfully integrated UIKit and SwiftUI components with Storyboard navigation, resolving interface compatibility issues
    • Improved UX consistency by implementing ConfirmDialog across multiple screens (iOS Installation, Android/iOS Settings)
    • Fixed critical language selection bug for Indonesian users on Android
  1. Challenges Faced:
    • Resolving unexpected interface clashes between UIKit and SwiftUI during component integration
    • Navigating updated i18n key structure and matching keys across the codebase
  1. Learnings and Skills Gained:
    • Gained deeper understanding of project architecture and navigation patterns
    • Learned techniques for bridging UIKit and SwiftUI components effectively

Weekly Update
Week 4: December 29 - January 2

  1. Overview of Tasks Completed:
    • Convert Scribe-i18n into submodule in Scribe-Android and Scribe-iOS
    • Update i18n keys used in Scribe-Android and Scribe-iOS
    • Add Download button and Quick Tutorial button in Scribe-iOS' installation tab
    • Create Download language screen and add Update data section (iOS)
  1. Key Accomplishments:
    • Successfully migrated Scribe-i18n from subtree to submodule architecture across both Android and iOS projects
    • Enhanced iOS installation flow with new Download and Quick Tutorial entry points
    • Built new Download language screen with Update data section for iOS
  1. Challenges Faced:
    • Running into issues on making installation tab scrollable
  1. Learnings and Skills Gained:
    • Gained understanding of Git submodule workflow and how it differs from subtree management
    • Explored ScrollView behavior and constraint challenges in iOS layouts
  1. Feedback and Support Needed:
    • Need support to make installation tab scrollable

Weekly Update
Week 5: January 5- January 9

  1. Overview of Tasks Completed:
    • Add download language list with all installed keyboards (Scribe-iOS)
    • Add download button for each language
    • Add confirmation dialog when clicking download button
    • Implement navigation from download screen to translation source language settings
    • Create Download State Manager to handle download logic
    • Add view for "no installed keyboard" state
  1. Key Accomplishments:
    • Finished Download screen UI and navigation flow for Scribe-iOS
    • Discovered and fixed incorrect translation source language display
  1. Challenges Faced:
    • Running into a navigation issue that causes Download screen to be duplicated in the navigation stack
  1. Learnings and Skills Gained:
    • Learned to implement conditional rendering in SwiftUI based on application state
    • Learned to build reusable SwiftUI components driven by dynamic data and download state
    • Learned to integrate localization and persisted user settings into SwiftUI views

Weekly Update
Week 6: January 12- January 16

  1. Overview of Tasks Completed:
    • Investigated navigation stack duplication issues between Installation and Settings tabs in Scribe-iOS
    • Refactored navigation flow between Download screen and Translation Source language settings
    • Debugged UI issue where shortDescription text was truncated in the Settings screen
    • Adjusted layout constraints and view sizing to ensure dynamic text content renders fully
  1. Key Accomplishments:
    • Resolved duplicate Download screen navigation issues
    • Ensured shortDescription text renders fully without being cut off
  1. Challenges Faced:
    • Managing cross-tab navigation with separate navigation stacks
    • Ensuring UI fixes did not introduce regressions in other screen sizes or states
  1. Learnings and Skills Gained:
    • Improved understanding of tab-based navigation in iOS
    • Learned to debug and fix dynamic layout and text sizing issues

Weekly Update
Week 7: January 19- January 23

  1. Overview of Tasks Completed:
    • Investigated migration of Scribe-iOS to a data contract–based architecture
    • Identified required changes to support data contracts across language features
    • Implemented the first migration goal by refactoring noun annotation to use data contracts
  1. Key Accomplishments:
    • Achieved contract-driven noun annotation
    • Verified noun annotations display correct gender information using contract-driven logic
  1. Challenges Faced:
    • Scoping and analyzing a large architectural migration across multiple features
    • Debugging keyboard crashes and establishing effective logging for keyboard extensions
  1. Learnings and Skills Gained:
    • Learned to plan and execute incremental architectural migrations
    • Gained hands-on experience implementing data contract–driven logic in iOS

Weekly Update
Week 8: January 26 - January 30

  1. Overview of Tasks Completed:
    • Migrated plural command and preposition annotation features to a data-contract–based architecture
    • Replaced hardcoded Swift logic for plurals and prepositions with a JSON contract-driven system
    • Implemented dynamic plural form selection and preposition case display based on contract definitions
    • Updated database queries and UI components to support the new contract-based workflow
  1. Key Accomplishments:
    • Fully transitioned plural and preposition commands to contract-driven logic, removing language-specific hardcoding
    • Resolved case-sensitivity issues affecting German noun detection in database queries
    • Verified correct plural and preposition annotations across multiple languages using data contracts
  1. Challenges Faced:
    • Debugging keyboard extensions with limited logging and visibility.
    • Coordinating simultaneous migrations of multiple features without breaking existing functionality.
  1. Learnings and Skills Gained:
    • Gained experience with incremental feature migration while maintaining app stability across multiple commands

Weekly Update
Week 9: February 2 - February 6

  1. Overview of Tasks Completed:
    • Migrated conjugation and declension features from hardcoded logic to JSON-based data contracts
    • Designed a dynamic navigation system to support both conjugation and declension structures
    • Integrated the new contract-driven system into the keyboard and UI layers
    • Implemented API connectivity for Scribe-Android using Retrofit and OkHttp
  1. Key Accomplishments:
    • Removed all language-specific, hardcoded conjugation and declension rules
    • Built a reusable recursive navigation framework to generate screens dynamically
    • Implemented a single dynamic view controller that handles both conjugation and declension
  1. Challenges Faced:
    • Designing navigation that works for different conjugation and declension hierarchies
    • Refactoring complex, state-heavy keyboard logic without breaking functionality
    • Maintaining backward compatibility during migration of core grammar features
  1. Learnings and Skills Gained:
    • Experience building recursive navigation systems from JSON definitions
    • Refactoring large features into scalable, data-driven systems
    • Improved understanding of Android networking and API integration

Weekly Update
Week 10: February 9 - February 13

  1. Overview of Tasks Completed:
    • Implemented API calls to Scribe-Server for the download language functionality in Scribe-Android
    • Built contract-driven dynamic SQLite database creation and data insertion from API responses
    • Integrated download/update state management into the Download UI and Select Language screens
    • Added YAML-based data contracts and updated database logic to align with new contract structure
  1. Key Accomplishments:
    • Integrated Scribe-Server API connectivity using Retrofit and OkHttp to support language data downloads and updates
    • Implemented a contract-driven dynamic SQLite database for storing data response
    • Enabled update detection and force-download flows
  1. Challenges Faced:
    • Coordinating download triggers from multiple entry points (Download screen and Select Language screen)
    • Ensuring the download UI consistently reflected the real state (downloading, update available, up to date)
  1. Learnings and Skills Gained:
    • Hands-on experience with Retrofit and OkHttp for Android API integration
    • Building contract-driven, dynamic database schemas from API-defined structures
    • Improved understanding of ViewModel state management in Jetpack Compose across navigation flows

Weekly Update
Week 11: February 16 - February 20

  1. Overview of Tasks Completed:
    • Migrated Scribe-Android to read from the new downloaded SQLite database, removing all built-in static language data files
    • Added defensive database query handling across all data managers in Scribe-Android to check for table and column existence before queries
    • Implemented API connectivity and local SQLite persistence for language data downloads in Scribe-iOS
    • Integrated download/update state management into the Scribe-iOS Download screen, including an "All languages" download option
  1. Key Accomplishments:
    • Removed legacy {language}LanguageData.sqlite files from Scribe-Android, fully transitioning to contract-driven downloaded data
    • Delivered end-to-end API integration for Scribe-iOS, covering data fetching, local persistence, update detection, and user-facing feedback
    • Unified download state initialization and update checks across both Android and iOS platforms
  1. Challenges Faced:
    • Ensuring all existing data manager queries in Android remained functional after removing built-in database files
    • Handling edge cases where downloaded SQLite tables or columns may not yet exist at query time
  1. Learnings and Skills Gained:
    • Gained experience in safely migrating live app functionality from static assets to dynamically downloaded data without breaking existing features
    • Deepened understanding of SQLite schema validation and defensive query patterns in Android
    • Improved ability to coordinate parallel feature development across Android and iOS codebases

Resolving the task given that this round of Outreachy has finished up. Amazing work, @Purnamasrahayu! Really was such a nice internship experience working with you. We very much look forward to continued collaboration with you!