Keeping Reviewer Drafts Across Polling, Versions and Tabs
Selected versions and mounted panels protected local review work across polling and tabs, while explicit version changes and reloads retained clear limits
Reviewed by Dmytro Nasyrov on October 22, 2026.
A background update can change the active source version while a reviewer is editing another version. If the workspace follows the latest server value automatically, it can move the reviewer away from their draft without any navigation action.
Our frontend work evolved from an editable contents panel into a version-aware workspace. The common responsibility was preserving the person's current work while still showing fresh service state. Backend build and approval consistency remained a separate contribution.
A server result and a dirty draft were different objects
The contents editor retained local entries separately from the newest server result. When a rebuilt result arrived over unsaved edits, the UI showed a conflict and offered an explicit Discard my changes action. It did not silently replace the draft. The final amendment allowed editing in PENDING and made BUILDING read-only. An earlier version of the design treated both as read-only. The amended rule governs the implemented case. Repeating the first rule would describe the wrong review experience.
| Event | Workspace policy |
|---|---|
| New result arrives over dirty contents | Expose the conflict and an explicit discard choice |
| Polling changes the active version | Keep the reviewer's selected version |
| Switch tab within one version | Retain mounted panel state after its first open |
| Deliberately choose another version | Start that version's workspace |
| Reload the page | No durable draft guarantee from this slice |
The later workspace separated selected from active
The selected version did not move when polling or Make active changed the active status. Active described a service lifecycle role. Selected described where the reviewer was currently working. Keeping them separate prevented server freshness from becoming an unintended navigation command. Choosing a version pushed browser history. Choosing a tab replaced the current entry. Back therefore restored the previous version rather than replaying every tab inspection. Those policies made navigation history follow the scale of the user's context change.
Mount lazily, then retain the panel
A panel mounted on first opening and remained mounted, hidden afterward. Its draft and generation state could survive moving to another tab and back. Scanned pages were never automatically opened, avoiding an unnecessary data-heavy panel just because the workspace existed.
React's state-preservation documentation explains why component lifetime and identity affect local state. Our product decision was narrower: keep panels alive within a selected version, but intentionally create a new workspace when that version changes.
The component identity made the lifetime visible
In the source page, the version workspace was keyed by the selected version identifier. Within that workspace, an opened set tracked panels visited so far. Rendering filtered to that set, forced those panels to remain mounted and hid every panel except the current one. The essential relationship is visible in this reduced extract:
<VersionWorkspace key={reviewed.id} version={reviewed} />
// Within one version workspace:
tabs.filter((shown) => opened.has(shown)).map((shown) => (
<TabsContent forceMount hidden={shown !== current}>
{panel(shown)}
</TabsContent>
))
Surrounding props and stable tab keys are omitted from the excerpt. The distinction is the lifecycle: a tab change hides a visited panel, while a version change replaces the keyed workspace. Keeping every panel mounted from the beginning would also preserve state, but would start data-heavy panels before the reviewer asked for them. Unmounting on every tab switch would avoid that eager work while discarding local drafts. The opened set expressed the chosen middle policy.
A default tab had another lifetime. The workspace remembered the first useful tab when one became available and did not let later polling choose a new default just because the version advanced. If only scanned pages were available, no panel automatically opened. The reviewer had to request that surface.
Active status was allowed to refresh without taking selection
The source page remembered the version on which it landed when the address did not explicitly choose one. Later active-version changes used that remembered selection. A background poll could therefore refresh the active badge without replacing the workspace key or discarding the current panel state.
Explicit version selection used a pushed history entry and cleared the tab request. A tab selection replaced the current history entry. The page also listened for browser Back and Forward and reconciled the address with its local selection. That last step matters because changing the URL with the history API does not itself prove that the mounted editor followed it.
The contents conflict remains a different layer. Keeping a component mounted does not decide whether a new server result should overwrite dirty rows. The explicit discard interaction protects that draft inside the panel. The version and tab policy protects the panel's existence.
Range semantics still belonged to the source contract
The contents editor computed end ranges in reading order and retained the service's boundary semantics. A valid negative PDF page offset remained accepted. A familiar positive offset could not become an accidental validation rule for every source.
Browser checking also led to presentation corrections: an edit and approval by the same person within a minute could share one line, and the open toggle appeared selected. These are recorded UI details, not evidence that the frontend solved every backend approval race.
Chronology and limits
The contents work preceded the later tabbed workspace. We do not attribute the later version-selection behavior to the earlier release. Likewise, surviving a tab change did not establish persistence across reloads or future sessions.
Ihnatov's backend consistency work and Rysin's frontend state lifetime were separate contributions. No reduction in reviewer error rate or task time was measured.
The transition matrix lets a reviewer inspect the intended lifetime directly: server updates may refresh facts, while only an explicit context change should choose a different place to work.
FAQ
Quick answers to common questions about custom software development, pricing, process and technology.
Type to filter questions and answers. Use Topic to narrow the list.
Showing all 14
No matches
Try a different keyword, change the topic or clear filters
-
How long have you been in business?
Pharos Production has been in business since 2013, with over 13 years of experience in custom software development. During this time, we have delivered over 110 applications for 200+ clients across 28 industries, including FinTech, healthcare, crypto and e-commerce. We are rated 5/5 on Clutch based on 107 verified reviews (2026).
-
What services do you provide?
Pharos Production provides six core service categories: AI Development (LLM applications, AI agents, machine learning and computer vision), Blockchain and Web3 (smart contracts, DeFi, tokenization on Ethereum, Solana, TON and other chains), FinTech Development (payment platforms, digital banking, KYC and AML integration), Software Development (mobile apps, web platforms, database design, UI/UX), Security and QA (code audits, penetration testing, smart contract audits, manual and automated testing) and Consulting (architecture design, MVP validation, startup consulting).
-
Where is Pharos Production located?
Pharos Production is headquartered in Las Vegas, Nevada, USA (5348 Vegas Dr, Las Vegas, NV 89108), with an engineering office in Kyiv, Ukraine (44-B Eugene Konovalets Str. Suite 201, Kyiv 01133). We work with clients worldwide and provide remote collaboration across all time zones. Visit our contact page for directions and scheduling options.
-
How big is your team?
Pharos Production has a team of 90+ engineers, including software developers, blockchain specialists, QA engineers, DevOps experts, UI/UX designers, project managers and solution architects. Our founder, Dr. Dmytro Nasyrov, holds a PhD in Artificial Intelligence and leads the technical direction of all projects.
-
What types of customers do you serve?
We serve a wide range of clients, from startups and product companies to mid-sized enterprises and large institutions. Our clients include crypto exchanges, FinTech providers (like Pleenk), healthcare organizations, sportsbook operators (like Pro Gambling), e-commerce platforms and SaaS companies. Pharos Production has worked with 200+ clients across 28 industries since 2013, adapting engagement models to match each client's stage, whether it is MVP validation for a startup or enterprise-scale development for an established business.
-
How is a custom software development company different from an agency?
A custom software development company like Pharos Production assigns one dedicated engineering team that owns your product across multiple release cycles, instead of handing it off once a contract ends. Agencies more often rotate staff between clients and optimize for fast delivery over long-term product ownership.
Pharos Production keeps the same team on your codebase through 2-week sprints, so there is no re-onboarding cost each time you request a new feature.
-
How much does custom software development cost?
Custom software development costs vary based on project scope and complexity. At Pharos Production, typical project ranges are: MVP development ($10,000-$25,000), suitable for startups validating a product idea; full-fledged production ($25,000-$50,000), for established businesses scaling a proven concept; and full-cycle development ($50,000-$80,000+), for complex enterprise-grade systems. These ranges include architecture design, development, QA testing and deployment. Hourly rates range from $50 to $99 depending on role and seniority. Final pricing depends on technology stack, number of integrations and engagement model (staff augmentation, dedicated team or project outsourcing).
-
How long does it take to develop a custom software application?
Development timelines depend on scope and complexity. At Pharos Production, a typical MVP takes 2-4 months, a production-ready application takes 4-8 months and a complex enterprise system can take 8-12+ months. We use an agile methodology with 2-week sprints, delivering working increments after each sprint. Every sprint includes a retrospective, progress report and planning session for the next iteration. This approach ensures transparency and allows businesses to launch faster by prioritizing high-impact features first. Get a timeline estimate for your project.
-
What industries does Pharos Production serve?
Pharos Production serves 28 industries: FinTech, MiCA Compliance, Banking, Insurance, Crypto, Healthcare, Fitness, E-Commerce, Food & Restaurant, On-Demand, Manufacturing, Automotive, Energy, Oil & Gas, Supply Chain, Construction, Real Estate, Gaming, Streaming, Media, Telecom, Education, Aviation, Travel, Logistics, Marketing, Agriculture and Recommender Systems. Our deepest expertise is in FinTech, blockchain and healthcare, where we have delivered compliance-ready platforms (HIPAA, PCI DSS, GDPR) and high-load systems handling thousands of concurrent users. For the latest industry insights, read our guides on FinTech trends in 2026 and the Web3 technology stack.
-
Why hire a software development company instead of building in-house?
Hiring a software development company offers faster time-to-market, lower upfront costs and access to specialized expertise without long-term employment commitments. According to Deloitte's 2024 Global Outsourcing Survey, 57% of companies outsource software development to access skills they cannot hire internally.
Factor In-house team Software development company Time to assemble 3-6 months (recruiting + onboarding) 1-2 weeks Upfront cost High (salaries, benefits, equipment) Lower (project-based pricing) Specialized expertise Limited to who you can hire locally Access to 90+ engineers across blockchain, AI, FinTech Scalability Slow (each new hire takes months) Fast (scale up or down per sprint) Long-term commitment Full-time employment contracts Flexible engagement models Risk High if key engineers leave Company ensures continuity and knowledge transfer For businesses that need blockchain, AI or high-load architecture expertise, outsourcing to a specialized firm like Pharos Production reduces risk and accelerates delivery.
-
What projects does Pharos Production not take on?
Pharos Production focuses on mid-to-large custom software projects with budgets starting at $10,000. We do not take on template-based websites, WordPress theme customization or short-term contracts under one month. We also do not provide non-technical staffing (marketing, sales or design-only roles). Our strongest fit is blockchain, FinTech and healthcare projects where security, compliance and high-load architecture are critical. For smaller projects or MVPs under $10,000, we recommend exploring freelance platforms or no-code tools as a more cost-effective starting point.
-
Why does Pharos Production use agile methodology?
We use agile with 2-week sprints because it reduces the risk of building features that miss the mark. Each sprint ends with a working demo, a retrospective and a plan for the next iteration.
This means clients see progress every 14 days and can adjust priorities based on real results, not assumptions. We chose this approach after years of experience showing that rigid, fixed-scope contracts lead to scope creep, missed deadlines and products that do not match market needs by launch day.
-
When should you NOT hire a custom software development company?
Custom development is not the right choice in every situation. You should not hire a custom software company if: your problem is fully solved by an existing SaaS product (e.g. Shopify for e-commerce, Salesforce for CRM); your budget is under $10,000 and timeline is under 4 weeks; you need a simple landing page or marketing website (WordPress or Webflow is faster and cheaper); or you are still validating the idea and have not spoken to potential users yet.
In these cases, off-the-shelf tools or no-code platforms offer better ROI. Custom development makes sense when you need unique workflows, regulatory compliance, high-load architecture or competitive differentiation that packaged software cannot provide.
-
What kind of projects has Pharos Production delivered?
Here are three anonymized examples from our recent delivery history:
FinTech startup - payment platform (MVP)
Scope: mobile app + backend API with bank-grade encryption. Team: 4 engineers, 1 QA. Timeline: 10 weeks. Budget: $38,000. Result: launched on schedule, processed $2M+ in transactions within the first quarter.Healthcare provider - patient portal (Full product)
Scope: HIPAA-aligned web platform with EHR integration, appointment scheduling and telemedicine. Team: 6 engineers, 1 DevOps, 2 QA. Timeline: 6 months. Budget: $120,000. Result: 15,000+ active patients, zero compliance violations in two annual audits.Crypto exchange - trading engine (Complex)
Scope: high-load matching engine handling 50,000+ orders per second, multi-chain wallet infrastructure on Ethereum and Solana. Team: 8 engineers, 2 QA, 1 security auditor. Timeline: 11 months. Budget: $340,000. Result: 99.97% uptime, passed three independent security audits.See more projects: NoMoreBets, Pulse, Sagas, Gambit Stream and Pleenk. For the full portfolio, visit our case studies. Learn more about the technology behind these projects in our guide to stablecoins and crypto infrastructure.
Dmytro Ihnatov is the Lead Backend Developer at Pharos Production. He documents backend architecture and research experiments from the team's work on a professional learning platform for aesthetic medicine.