{"id":19363863,"url":"https://github.com/jvaclavik/kiwi-t9","last_synced_at":"2026-04-28T16:02:16.160Z","repository":{"id":146471661,"uuid":"153803019","full_name":"jvaclavik/kiwi-t9","owner":"jvaclavik","description":"Kiwi.com full-stack task (React Native, NodeJS)","archived":false,"fork":false,"pushed_at":"2018-10-27T19:48:35.000Z","size":320,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-06T20:47:40.530Z","etag":null,"topics":["nodejs","react","react-native"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jvaclavik.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-10-19T15:18:34.000Z","updated_at":"2022-05-27T19:16:04.000Z","dependencies_parsed_at":null,"dependency_job_id":"9e96162c-6b00-4bd7-bf79-eb1a32568f75","html_url":"https://github.com/jvaclavik/kiwi-t9","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jvaclavik%2Fkiwi-t9","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jvaclavik%2Fkiwi-t9/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jvaclavik%2Fkiwi-t9/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jvaclavik%2Fkiwi-t9/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jvaclavik","download_url":"https://codeload.github.com/jvaclavik/kiwi-t9/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240483761,"owners_count":19808635,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["nodejs","react","react-native"],"created_at":"2024-11-10T07:35:41.606Z","updated_at":"2026-04-28T16:02:11.128Z","avatar_url":"https://github.com/jvaclavik.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Kiwi T9\n\n## Assignment\n\nImplement a number to word list converter as a Node backend and React fronted.\nThe backend should provide a rest endpoint that converts a given numeric string into a list of corresponding words in the style of [T9](\u003chttps://en.wikipedia.org/wiki/T9_(predictive_text)\u003e) or [Phonewords](https://en.wikipedia.org/wiki/Phoneword). For example, given the input 23 the output should be: `ad, ae, af, bd, be, bf, cd, ce, cf`\nThe frontend should allow the user to enter a number, query the backend for the corresponding expansions, and display them.\n\nThe solution should be shared with us in a git repository with real history included.\nIt's OK not to deliver 100%, but the more working parts the better. For example if you\nstruggle with the backend, focus on frontend and just mock the API calls.\n\nTake this task as a chance to present your skills. If you are good in UI, let us see that. If you are more into the backend, it's OK to have simple FE.\n\nIf you know what tests are for, don't keep it for yourself, show it in the code.\n\nWays to go beyond the minimal solution could include for example:\n\n- phone keyboard -like UI\n- great project setup\n- mobile app in React Native\n- filtering to include only real words based on a suitable word list\n\nThe task should contain unit tests.\n\n## Demo\n\n\u003cimg src=\"./demo.gif\" width=\"300\"\u003e\n\n## Installation and run\n\n### Prerequisites\n\nInstall:\n\n- NodeJS: https://nodejs.org\n- Expo: https://docs.expo.io/versions/v30.0.0/introduction/installation\n- Yarn: https://yarnpkg.com/lang/en/docs/install/#mac-stable\n\nClone repository:\n\n```\ngit clone https://github.com/jvaclavik/kiwi-t9\ncd kiwi-t9\n```\n\n### Install Server\n\n```\ncd server       # List proper directory\nyarn            # Install dependencies\nyarn start      # Start NodeJS server\n```\n\nServer will run on: http://localhost:3000\n\n### Install Client\n\n```\ncd client       # List proper directory\nyarn            # Install dependencies\nexpo start      # Start Expo\n```\n\nScan QR code or click on `Run on iOS simulator`\n\n## Project structure\n\n- **Server** is based on NodeJS, Express, Nodemon and Supertest\n- **Client** is a mobile app based on React Native, Expo, Jest and Flow.\n\n```\n├── README.md\n├── client\n│   ├── App.js              # Mobile app entry point\n│   ├── app.json            # Expo app configuration\n│   ├── assets              # Icon and Splash screen assets\n│   ├── package.json\n│   ├── src                 # Mobile app source code\n│   │   ├── components      # Components\n│   │   ├── config          # Basic app configs\n│   │   ├── containers      # Contains RootContainer (main screen)\n│   │   ├── services        # Defines API\n│   │   ├── themes          # Defines colors, metrics and fonts\n│   │   ├── types\n│   │   └── utils           # Component independent utils\n│   └── yarn.lock\n├── demo.gif\n└── server\n    ├── __tests__\n    ├── app.js              # Server entry point\n    ├── bin\n    ├── package.json\n    ├── public\n    ├── routes              # Defines routes and main logic\n    ├── utils               # Custom utils\n    ├── views\n    └── yarn.lock\n```\n\n## Testing\n\n### Run server tests\n\n```\ncd server\nyarn test\n```\n\n### Run client tests\n\n```\ncd client\nyarn test\n```\n\n## API docs\n\n### Words [`/words`]\n\n#### Retrieve words [`GET`]\n\nRetrieves words based on T9 number combination.\n\n- Parameters\n  - input: (number) - T9 number combination (`^[23456789]{1,11}$`)\n\n* Response 200 (application/json)\n\n  - Body\n\n            [\n                \"ad\",\n                \"ae\",\n                \"af\",\n                \"bd\",\n                \"be\",\n                \"bf\",\n                \"cd\",\n                \"ce\",\n                \"cf\"\n            ]\n\n- Response 400 (application/json)\n\n  - Body\n\n            {\n                \"errors\": [\n                    \"Bad input. Allowed pattern is: ^[23456789]{1,11}$\"\n                ]\n            }\n\n- Response 400 (application/json)\n\n  - Body\n\n            {\n                \"errors\": [\n                    \"No input.\"\n                ]\n            }\n\n## Future improvements\n\n- Use real word dictionary\n- Use frequency analysis to mark proper word relevance\n- Solve upper case characters, diacritic and special characters\n- Think about better UX\n- Test app on Android phones\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjvaclavik%2Fkiwi-t9","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjvaclavik%2Fkiwi-t9","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjvaclavik%2Fkiwi-t9/lists"}