Profile Information
Name: Rishan P
Email: Rishan.pgowda@gmail.com
Github : rovertrack
Other communication modes: Discord, Zulip, Slack.
Location during GSoC: Bangalore India.
Typical Working hours (include your timezone) during GSoC: 6:00 pm to 2:00 am (IST) UTC+5:30
Synopsis
App
Scribe-Conjugate is a mobile application for iOS and Android developed by the Scribe community that allows language learners to instantly look up verb conjugations across multiple languages, powered entirely by open data from Wikidata. Users can search for any verb in their target language and receive a structured breakdown of its conjugations across tenses, moods, and grammatical persons in a clean, intuitive interface. The app extends the Scribe community's existing ecosystem, which includes the Scribe-iOS and Scribe-Android keyboard apps into a dedicated standalone tool focused on helping learners understand the grammatical foundations of their target language.
Project
Project Objectives
The development and release of the following
- Scribe conjugate app for Android
- Scribe conjugate app for IOS
Scribe-Conjugate (see designs on Figma)
Why a Separated Conjugate app
- The Present Verb conjugation tools which are available on the market are available easily, but they also come with hurdles such as ads, some are paid and moreover some of them collect user data. To overcome this the scribe community has come up with this idea/project because scribe community is having the infrastructure sufficient to get the required data from Wikidata.
- This app would be an example of how wikidata lexicographical data can be used in the mobile applications
- The Scribe-Conjugate app would be the first verb conjugation app which is fully open-source, completely ad-free, and transparent. Assuring complete privacy to the users and community.
Possible Mentor(s)
@AndrewTavis
@Henrikt93
@DeleMike
Have you contacted your mentors already?
Yes.
Implementation
Figma
- Conjugate tab (link to Figma)
- conjugated view : (link to Figma)
- Download data UI : (link to Figma)
- Autocompletion : (link to Figma)
- verb conjugation view scrollable and filterable :(link to Figma)
Phase 1 - Android
1.Basic UI Skeleton and Navigation integration
I'm choosing to add some UI to the app first instead of database because i feel if we do this then design the database and make it work and get data and connect the dots to the respective screens it proves we completely understand the flow of the app we can then improve it to meet our requirements.
- Setup the Conjugate tab and add it to the existing bottom navigation.
- Building the static version for all major important screens - search bar screen, autocomplete suggestion list, recently conjugated view, conjugation table, there is no real data yet, just UI structure with placeholder content.
- The goal would be to create pixel perfect screens present in the figma provided, Using Jetpack compose and reusing existing scribe UI components
- Tests: Compose UI tests using ComposeTestRule verifying all screens render correctly.
2.Database, Dataparsing and Repository
- Now that UI structure is confirmed, design the Room FTS5 schema, DTO parsing layer, and repository behind it to feed real data into the already-built screens
- Now that the UI is confirmed, we can design the Room schema, DTO parsing layer and repository and feed real data into the screens and test it for required working conditions.
- Design the Room database consisting of three entities Verb, ConjugationForm, and RecentlyConjugated .
- an FTS virtual table VerbFTS with` DAO`s exposing kotlin flow streaming the data for live search.tense-filtered conjugation fetches, and recently conjugated history queries, this ensures that every static screen built in the previous step has a clearly defined data contract ready to be plugged in.
- Implement Kotlin DTO classes to parse language data following the structure defined in scribe-org/Organization/DATA_CONTRACTS.md, mapping structured fields from the locally stored Scribe-Data language packs into Verb, ConjugationForm, and RecentlyConjugated Room entities. I have previously worked on this Wikidata property mapping to labels in Wikimedia Commons App we can use some of the same strategy here to improve the mapping too
- ConjugationRepository wil be the single source of truth using a local-first strategy, all ViewModel facing queries read exclusively from Room via Flow, which is then parsed through the DTO layer and inserted into Room inside a single transaction to prevent partial data states, at this point every dot between the static UI and the live data layer is defined and ready to be connected.Data is read from locally stored files already downloaded via the existing Scribe language pack infrastructure. No new network layer is introduced. The app reuses the same download pipeline already built for the Scribe keyboard app.
- Testing is done using Room.inMemoryDatabaseBuilder with JUnit4 (have implemented this type of tests) and Turbine with kotlinx-coroutines-test for Flow emission assertions.
3.Verb Search UI
- Building the search bar in Jetpack compose and debouncing the input with Flow.debounce() to increase performance and reduce number of DB queries.
- Display search results in real time, showing Verb lemma alongside its detected language tag
- Support simultaneous search across all user-downloaded languages in a single query.
- Handle empty, loading, no-results state with appropriate feedback.
4.Autocomplete
- Connecting the FTS5 table queries to ViewModel .
- Implement suggestion ranking.
- monitor response time and improve based on some dataset (~3,200) as benchmark.
5.Conjugated History
- Store the recently conjugated verbs in the RecentlyConjugated Room entity.
- Display them in a horizontally scrollable chip row or list on the search screen for quick re-access.
- This is implemented by Room db, Jetpack Compose lazy row for ui and ViewModel for data.
Testing : Data insertion and retrieval tests in Room.inMemoryDatabaseBuilder and composetestrule for Ui testing
6.Conjugation Table
- Build the conjugation table using LazyColumn for tense groups and LazyRow for pronouns pairs
- Implement tense-based chip filter bar at the top allowing users to isolate specific tenses
- Handle linguistically defective verbs (missing forms) with a styled placeholder cell instead of crashing or showing blank
Tesitng : implement basic UI testing with some performclick tests on tense chips
7.Tap to copy for conjugation cell
- Implement tap-to-copy on each conjugation cell using Android ClipboardManager
- Show a brief Snackbar or Toast confirmation message on successful copy
Tests: Instrumented UI tests verifying clipboard content after tap using ClipboardManager assertions in AndroidJUnit4.
8.Optimize
- Conduct performance profiling using Android Studio Profiler to catch jank or slow DB queries
- Optimize Ui for performance and check for apk size.
This completes the android Conjugate app
Phase 2 - IOS
1.Basic UI Skeleton & Navigation Integration
- Setup the Conjugate tab and add it to the existing Scribe-iOS TabView navigation so it is immediately accessible within the app alongside existing tabs.
- Build static versions of all major screens — search bar screen, autocomplete suggestion list, recently conjugated view, and conjugation table — no real data yet, just UI structure with SwiftUI placeholder content reusing existing Scribe-iOS components.
- The goal is to create pixel-perfect screens matching the same Figma designs used in Android, this time using SwiftUI idioms like List, ScrollView, LazyVStack, and SF Symbols to feel fully native on iOS.
- Tests: UI tests using XCUITest verifying all screens render correctly and tab navigation routes to the correct destination.
2.Database, Data Parsing and Repository Layer
- Now that the UI skeleton is confirmed, we can design the CoreData schema, DTO parsing layer, and repository to feed real data into the already-built static screens.
- Design the CoreData schema with three entities mirroring the Android Room schema Verb, ConjugationForm, and RecentlyConjugated verbs with NSFetchedResultsController exposing live queries for search, tense-filtered conjugation fetches, and recently conjugated history, ensuring every static screen has a clearly defined data contract ready to be plugged in.
- Implement Swift Codable structs to parse language data following the structure defined in scribe-org/Organization/DATA_CONTRACTS.md, mapping grammatical feature property codes to human-readable labels with Swift optionals handling missing or defective forms via an isDefective: Bool flag on ConjugationForm rather than dropping records.
- ConjugationRepository will be the single source of truth using a local-first strategy all ViewModel-facing queries read exclusively from CoreData via Swift AsyncStream,parsed through the Codable layer and inserted into CoreData inside a single NSManagedObjectContext save() transaction to prevent partial data states, at this point every dot between the static UI and the live data layer is defined and ready to be connected.
- Reuse existing Scribe-iOS language pack download infrastructure, no separate network calls.
- Testing is done using NSPersistentContainer with NSInMemoryStoreType for in-memory CoreData tests with XCTest, testing using locally stored mock data files mirroring the Scribe-Data contracts structure, and XCTestExpectation with async/await for AsyncStream emission assertions.
3.Verb Search UI
- Build the search bar in SwiftUI using TextField with a Combine debounce publisher to reduce the number of CoreData queries fired as the user types, improving performance.
- Display search results in real time showing the verb lemma alongside its detected language tag, supporting simultaneous search across all user-downloaded languages in a single predicate query.
- Handle empty, loading, and no-results states with appropriate SwiftUI feedback views consistent with existing Scribe-iOS UI patterns.
Tests: XCTest ViewModel unit tests verifying correct state transitions, XCUITest UI tests for search input and result display behavior.
4.Autocomplete
- Connect CoreData prefix predicate queries to the ViewModel, surfacing alphabetically ordered autocomplete suggestions in a SwiftUI overlay list below the search bar as the user types.
- Implement suggestion ranking with exact prefix matches shown first, falling back to broader matches, and monitor response time against the same ~3,200 verb dataset benchmark used on Android.
- Technology: CoreData NSPredicate, Combine debounce, optionally SQLite FTS5 via GRDB.swift if CoreData prefix queries prove insufficient for the required response time.
- Tests:
func testAutocompletePerformance() {
measure {
// benchmark code here
}
}- Performance blocks benchmarking autocomplete response time, unit tests verifying correct suggestion ordering.
5.Conjugated History
- Store recently conjugated verbs in the RecentlyConjugated CoreData entity with timestamps and display them in a horizontally scrollable ScrollView with HStack verb chips on the search screen for quick re-access.
- Include a clear history option consistent with Scribe's privacy-first philosophy, removing all records from CoreData in a single context save.
Tests: XCTest CoreData insertion and retrieval tests using in-memory store, XCUITest UI tests verifying chip appearance and clear history behavior.
6.Conjugation Table
- Build the conjugation table using SwiftUI ScrollView with LazyVStack for tense groups and LazyHStack for pronoun-form pairs, with a tense filter chip bar at the top using a custom SwiftUI HStack of toggle buttons bound to @State filter selection.
- Handle linguistically defective verbs with a styled placeholder cell using SwiftUI's conditional rendering rather than crashing or showing blank, mirroring the isDefective flag approach from the data layer.
Tests: XCUITest UI tests verifying correct table rendering for full and partial conjugation sets, performTap tests on tense filter chips verifying correct table filtering behavior.
7.Tap to Copy
- Implement tap-to-copy on each conjugation cell using UIPasteboard.general.string and show a brief SwiftUI overlay toast confirmation using ZStack with withAnimation on successful copy.
- Tests: XCUITest tap interaction tests verifying pasteboard content after cell tap using UIPasteboard assertions.
8.Optimize, Accessibility and Final Release
- Add VoiceOver labels and hints to all interactive SwiftUI elements using .accessibilityLabel and .accessibilityHint, and run Xcode Accessibility Inspector across all screens to catch unlabeled or incorrectly ordered elements.
- Conduct performance profiling using Xcode Instruments to catch slow CoreData fetches, excessive view re-renders, and binary size regressions.
- Prepare contributor documentation covering the CoreData schema, Swift parsing layer, and how to extend support for new languages, then release a TestFlight build within the Scribe community for mentor and community feedback before final submission.
This completes the iOS Conjugate feature and the full Scribe-Conjugate project.
Hurray.
Deliverables
Timeline
| Period | Classification | Tasks |
| Community bonding (May 4 - May 24) | Community & Setup | Sync with mentors on communication cadence. Study Figma designs in depth — conjugation table, autocomplete, scroll/filter behaviour. Trace existing language pack download flow. Review good first issue and help wanted issues to stay active as a contributor. |
| Week 1-2 (May 25 - June 7) | Phase 1: UI Skeleton | Build static versions of all major screens — search bar, autocomplete list, recently conjugated view, conjugation table — using Jetpack Compose with placeholder content reusing existing Scribe-Android components targeting pixel-perfect Figma accuracy. Tests: ComposeTestRule verifying all screens render correctly. |
| Week 3-4(June 8 - June 21) | Phase 1: Data Layer | Design Room schema — Verb, ConjugationForm, RecentlyConjugated entities — with FTS5 virtual table VerbFts and DAOs exposing Kotlin Flow streams. Implement Kotlin DTO. Build Test using`Room.inMemoryDatabaseBuilder` and JUnit4and other mentioned tests. |
| Week 5(June 22 - June 28) | Phase 1: Search & Autocomplete | Build verb search UI with Flow.debounce(), real-time results showing lemma and language tag, and empty/loading/no-results states. Connect FTS5 queries to ViewModel for autocomplete with suggestion ranking. Monitor response time against ~3,200 verb dataset benchmark. |
| Week 6 (June 29 - July 5) | Phase 1: History & Conjugation Table | Implement Recently Conjugated history using RecentlyConjugated Room entity, LazyRow chip display, and ViewModel. Build conjugation table using LazyColumn for tense groups and LazyRow for pronoun-form pairs with tense-based chip filter bar. Handle defective verb forms with styled placeholder cells. Write tests |
| Week 7 (July 6 - July 12) | Midterm Evaluation | Implement tap-to-copy using ClipboardManager with Snackbar confirmation. Wire existing Scribe language download UI into Conjugate tab empty state ensuring Room DB population reflects immediately. Final integration tests and Android Studio Profiler performance check. |
| Week 8 (July 13 - July 19) | Exams | Maintenance, bug fixes, and addressing midterm review feedback only. Fix flaky tests. Minor Android documentation improvements. No new feature development. |
| Week 9 (July 20 - July 26) | Phase 2: iOS UI Skeleton | Beginning of Phase 2:IOS Phase Setup Conjugate tab in Scribe-iOS TabView. Build static SwiftUI versions of all major screens — search bar, autocomplete list, recently conjugated view, conjugation table — reusing existing Scribe-iOS components targeting pixel-perfect Figma accuracy. Write tests using XCUITEST. |
| Week 10 (July 27 - August 2) | Phase 2: iOS Data Layer | Design CoreData schema — Verb, ConjugationForm, RecentlyConjugated. Implement Swift Codable DTOs following scribe-org/Organization/DATA_CONTRACTS.md structure with isDefective flag. Build ConjugationRepository with local-first strategy using AsyncStream, reading exclusively from locally stored Scribe language pack data. No separate network calls introduced. |
| Week 11 (August 3 - August 9) | Phase 2: iOS Search, Autocomplete & History | Build SwiftUI verb search with Combine debounce, real-time results, and empty/loading/no-results states. Connect CoreData NSPredicate queries to ViewModel for autocomplete, optionally using GRDB.swift FTS5 if CoreData proves insufficient. Implement Recently Conjugated history with ScrollView HStack chips and clear history. Tests: XCTest ViewModel unit tests, XCUITest for search and autocomplete. |
| Week 12 (August 10 - August 16) | Phase 2: iOS Conjugation Table & Copy | Build SwiftUI conjugation table using LazyVStack and LazyHStack with tense filter chip bar. Handle defective verb forms with styled placeholder cells. Implement tap-to-copy using UIPasteboard with ZStack overlay toast. Reuse existing Scribe-iOS language pack download UI already built for the keyboard app, wiring it into the Conjugate tab empty state without introducing any new download logic. |
| Week 13 (August 17 - August 25) | Final Cleanup & Release | Add VoiceOver accessibility labels across all screens. Xcode Instruments performance profiling. Release TestFlight build for community feedback. Address final review comments. Prepare contributor documentation covering CoreData schema, Swift parsing layer, and language extension guide. Finalize deliverables and submission. Final Deliverable: Fully functional offline iOS Conjugate feature matching Android parity, tested, documented, and community reviewed. |
Thank you for a wonderful GSoC 2026.
- This roadmap is designed to be flexible. if technical debt or architectural blockers arise, the transition of secondary features can continue beyond the 12-week GSoC period to ensure code quality is never sacrificed for speed.
About Me
- I have experience in both Android and iOS development, though my depth in Android - Kotlin, Jetpack Compose, My android fundamentals is stronger compared to Swift and SwiftUI. This is reflected in the timeline where Phase 1 delivers the complete Android feature before midterm, leveraging my stronger Android foundation, while Phase 2 applies the same architectural patterns - MVVM, local-first data strategy, reactive streams - to iOS where i have the experience, but is comparatively less. This structure ensures the project benefits from my strongest skills early while Phase 2 serves as an opportunity to deepen my iOS knowledge on a real production codebase under mentor guidance.
Tell us about a few
- How did you hear about this program?
X (twitter)
- Will you have any other time commitments, such as school work, another job, planned vacation, etc, during the duration of the program?
Have enrolled in one exam happening July 10 - July 20
- We advise all candidates eligible for Google Summer of Code and Outreachy to apply for both programs. Are you planning to apply to both programs and, if so, with what organization(s)?
Yes, Wikimedia Foundation i don't know why but that's the one organization which i get along well.
- What does making this project happen mean to you?
Means gaining knowledge under guidance of some of the best mentors .Knowledge which will help me improve more Giving to open source, Providing values
Availability
Eligible for Google Summer of Code and Outreachy?
I am eligible for Google Summer of Code and am applying only for GSoC.
Do you plan to submit any other proposal apart from this one?
Yes.
Do you have any other plans this summer?
No I will have an exam which i have enrolled in from July 10 - July 20, during time i will test the app manually for proper working and implement bug fixes, after this my full time is for GSoC .
How many hours per week can you dedicate to this project?
I will dedicate a minimum of 44+ hours per week to this project and am willing to invest additional time if required to meet project goals.
Have you been accepted to GSoC before?
No, this is my first time applying for Google Summer of Code.
Contributions to Scribe
| PR | Task | Status |
| #583 | Move keyboard logic inside keyboard flavour | Open |
Contributions to Wikimedia Commons
Pull request
Link PRs
- Total: 25
- Merged: 13
- Pending: 11
- Draft: 1
| PR | Task | Status |
| #6686 | Updated Commons app to query subclasses | Merged |
| #6721 | reduced the number of subclasses to query to improve performance | Merged |
| #6730 | Feature : Added Depiction selector, pick on map | Merged |
| #6770 | Move dbhelper to SupportSQLiteOpenHelper (Room Migration) | Merged |
| #6774 | created Room based entities and DAOs (Room migration) | Merged |
| #6797 | Added tests for migration legacy to room | Merged |
| #6708 | Fix: crash feedback when no option selected | Merged |
| #6658 | fix: Broken media detail layout | Merged |
| #6664 | fix: Snappy jump of media detail on launch | Merged |
| #6671 | fix : Improve nearby sparql queries to query class | Merged |
| #6673 | Added gas station icon | Merged |
| #6687 | Added bank and hospital icons | Merged |
| #6690 | Recycler view item's text alignment | Merged |
Pull Requests Under Review
| PR | Task | Status |
| #6696 | Fix: alignment bottomsheet header | Open |
| #6705 | Fix: Leaks at Media Detail Fragment | Open |
| #6711 | Fix: Keyboard flash | Open |
| #6713 | Fix: alignment nearby list item | Open |
| #6716 | fix: Leaks contribution fragment | Open |
| #6717 | Fix : paging and explore map leaks | Open |
| #6718 | Fix: Upload MediaDetail Leaks | Open |
| #6719 | Fix: NearbyParentFragment Leaks | Open |
| #6724 | Optimize Nearby labels | open |
| #6754 | Fix: Nearby filter recycler view not rendering proper item | Open |
| #6762 | fix: Autoformatting issues | open |
Draft Pull Requests
| PR | Name | Status |
| #6761 | Searchbar compose migration | Draft |
Issues
Link Issue
- Created: 13
- Closed: 10
- Open: 3
| Issue | Name | Status |
| #4186 | Crash on tapping last item | Closed |
| #6798 | DB Migration copy data from legacyDB to room | Closed |
| #6777 | Write tests for migration to room | Closed |
| #6773 | Create Room based entities and DAOs | Closed |
| #6769 | Move the DBOpenHelper to the more modern androidx.sqlite.db.SupportSQLiteOpenHelper | Closed |
| #6707 | [Bug]: crash at nearby item feedback when no option selected | Closed |
| #6688 | [Bug]: recycler items title not perfectly centered | Closed |
| #6684 | [Bug]: some places show unknown "?" as they are missing classes | Closed |
| #6683 | add missing bank and hospital labels | Closed |
| #6670 | [Bug]: nearby places not being set with the classes | Closed |
| #6668 | [Bug]: missing important labels for major places | Closed |
PR Review
| PR | Name | Status |
| #6742 | Fix: Snackbar overlapping bottom navigation bar on Explore screen | Merged |
Contributions to Other Open Source Projects
Organic Maps
| Issue | Name | Status |
| #12105 | Enabling the copy feature to correctly get the oh details | Merged |
| #12043 | Expand Opening hours to show full-week opening hours | Merged |
| #12034 | pp peek height for openingHours and Transport Stops | Merged |
| #11973 | New Landscape UI for placepage | Merged |
| #11830 | feat(android): Add custom vector splash screen icon to make it not upleasant a bit | Merged |