Welcome to the TinyEnginy take‑home! This exercise is a condensed version of our product and day‑to‑day work. Please treat the codebase as if it were the one you ship to production.
These tasks are independent — tackle them in whatever order you consider most important or impactful.
- Bug fix: CSV import displays invalid country codes.
- Bug fix: Email verification hangs indefinitely with no feedback.
- Feature: Add new lead data fields (phone number, years at company, LinkedIn).
- Feature: Implement an enrich phone workflow using Temporal.
- PR Review: Review an open pull request from a teammate.
- Analysis: Propose codebase improvements and a technical roadmap.
Please record your screen (and, if possible, your voice) while you work on this task (opensource tool). We want to see how you collaborate with AI tools, how you reason through trade-offs, and how far you can get within the timebox. Feel free to get comfortable with the project first — set things up, explore the codebase, and understand how it all fits together before you start recording.
The expected work time is around 1 hour. Do not worry if you cannot complete every part of the task. Work in the repository as you see fit, and when you are done, just ping us. We value the time you invest in this task, and we commit to spending a similar amount reviewing it thoroughly. Regardless of the outcome, we’ll provide constructive feedback so you can benefit from the evaluation.
-
Node.js (use the version in .nvmrc).
-
pnpm package manager.
-
SQLite (bundled; no separate install required).
-
Temporal — Workflow management system.
-
Claude Code installed locally, with the provided
ANTHROPIC_API_KEYconfigured. If you are more comfortable, you can use any other AI coding tool you have access to.
Install tools:
-
Node via nvm: https://github.com/nvm-sh/nvm#installing-and-updating
-
pnpm: https://pnpm.io/installation#using-other-package-managers
-
Temporal: https://docs.temporal.io/develop/typescript/set-up-your-local-typescript
-
Claude Code: https://docs.anthropic.com/en/docs/claude-code/overview
Set the provided ANTHROPIC_API_KEY in your shell before running the project:
export ANTHROPIC_API_KEY="your-provided-key"Backend (one‑time)
cd backend
nvm use # Ensure the Node version from .nvmrc
pnpm install # Install dependencies
pnpm migrate:dev # Sync local SQLite with Prisma schema
pnpm gen:prisma # Generate Prisma client
temporal server start-dev # Starts Temporal serverBackend (develop)
cd backend
pnpm run dev # Starts the API serverWhen you change the Prisma schema:
pnpm migrate:devFrontend (one‑time)
cd frontend
nvm use # Ensure the Node version from .nvmrc
pnpm installFrontend (develop)
cd frontend
pnpm run dev # Starts the dev serverWhen importing leads from CSV using the example file, the country column displays garbled characters instead of valid country codes.
The email verification process hangs indefinitely for some leads and never reports a success or failure outcome.
Add three new data points for leads: phone number, years at current company, and LinkedIn profile URL.
Users should be able to:
- See these fields in the leads table
- Set them via CSV import
- Use them in message composition
Since the field list will keep growing, the message composition UX needs to scale accordingly (no design provided).
Implement a Temporal workflow that finds a lead's phone number by querying three providers in sequence:
- Call Provider One → if no phone found,
- Call Provider Two → if no phone found,
- Call Provider Three → if no phone found, mark as No data found.
- Each provider call is an activity with:
- Short timeout
- Retry policy (e.g. 3 attempts, exponential backoff)
- Stop early when a phone is found.
- Idempotent workflow (only one per lead).
- Abstraction layer to handle different provider inputs.
- Show process feedback to the user
- Update frontend accordingly
Take into account provider rate limits, right now they have unlimited RPS/RPM, however they told us they will add rate limits to their endpoints.
Orion Connect
Provider with the best data in the market, but slow and fails sometimes
Base URL:
https://api.enginy.ai/api/tmp/orionConnectRequest:
{ "fullName": "Ada Lovelace", "companyWebsite": "example.com" }Authentication:
Request header 'x-auth-me' with key 'mySecretKey123'Response:
POST { "phone": string | null }
Astra Dialer
Provider with the worst data in the market, but is the fastest one
Base URL:
https://api.enginy.ai/api/tmp/astraDialerRequest:
POST { "email": "john.doe@example.com" }Authentication:
Request header 'apiKey' with key '1234jhgf'Response:
{ "phoneNmbr": string | null | undefined }
Nimbus Lookup
New provider in the market
Base URL:
https://api.enginy.ai/api/tmp/numbusLookupRequest:
POST { "email": "john.doe@example.com", jobTitle: "CTO" }Authentication:
Get parameter 'api' with key '000099998888'Response:
{ "number": number, "countryCode": "string" }
Review the open PR as if it were from a teammate. Leave inline comments where relevant and provide a summary with a clear approve or request-changes decision.
Create an IMPROVEMENTS.md file as if it were a document in our project management tool.
You won’t be evaluated on producing a single predefined correct solution, but rather on your problem-solving skills, the product mindset you showcase, your ability to reason and explain your thought process, the trade-offs behind your decisions, and how you managed to use AI tools.