Back to all writing

I Built an App Behind My App

IPMAT Series•Part 12•12 min read•By Mikhil

I Built an App Behind My App

A student can open the app and see one question.

Four options.

An explanation.

Maybe a hint.

A topic.

A difficulty level.

A timer quietly recording what happened.

Simple.

Behind that question, things had become significantly less simple.

By the time I started thinking seriously about scaling the content inside the app, a question was no longer just:

Question → Answer.

It could have an explanation.

Explanations for individual options.

A topic.

A skill.

Difficulty.

Exam relevance.

Editorial state.

Identifiers.

Different ways the rest of the system could use it.

And eventually, whether the question should be visible to a student at all.

The student-facing experience was getting cleaner.

The machinery behind it was becoming harder to manage.

At some point I realised I had created a slightly ridiculous situation.

I was building an application for studying.

And now I needed to build another application to manage the application for studying.

So I did.

I built a Content Studio.

The hidden side of a learning app

When I started this project, content management barely existed.

The first version had 32 questions.

I could understand almost the entire question bank just by looking through it.

If something was wrong, finding it was not difficult.

There simply wasn't much to search.

That changes when the product grows.

A learning system can only be as trustworthy as the material moving through it.

A beautiful interface does not save a bad question.

Adaptive recommendations do not help if the content being recommended is incorrect.

A mock engine becomes dangerous if the questions inside it are badly classified.

Personal intelligence becomes less intelligent if the evidence feeding it is noisy.

The more systems I built around the questions, the more responsibility each question started carrying.

That meant the content itself needed infrastructure.

Not just storage.

Management.

Raw files stop being fun surprisingly quickly

There is nothing inherently wrong with editing structured content inside files.

For a small project, it is actually convenient.

Open the file.

Find the question.

Change something.

Save.

Done.

Except that "done" becomes questionable once the data has enough structure.

Did I accidentally break an identifier?

Did I forget a field?

Does the question still belong to the same topic?

Does the explanation match the current answer?

Did I update the visible text but forget some related metadata?

Is the question supposed to be a draft?

Has it already been reviewed?

Would the student-facing interface render it correctly?

And perhaps most importantly:

Am I even editing the right item?

None of those problems are exciting.

They also become increasingly annoying as the project grows.

I did not want content maintenance to become a process where I needed to remember the internal shape of every object before changing a comma.

That is the kind of friction that eventually creates mistakes.

So instead of expecting myself to become extremely disciplined at editing raw data forever, I decided to improve the environment in which I was doing the work.

The Content Studio is not part of the student app

This distinction matters.

The Content Studio is not another student feature.

There is no reason someone preparing for an exam needs to see the machinery used to manage the content they are studying.

It exists for the person maintaining the product.

Me.

Its job is much less glamorous.

Let me inspect the content properly.

Let me find things.

Let me understand their current state.

Let me make changes without treating the underlying data structure like a memory test.

Let me catch obvious problems before those problems reach the actual learning experience.

That is it.

But the more I worked on it, the more I realised that internal software can affect the quality of a product almost as much as the software users actually see.

Draft and published stopped meaning the same thing

One of the most important changes in the previous stage of this project was separating:

Content exists

from:

Content is ready for students.

Those are not the same statement.

It sounds absurd when written down.

Of course a draft question should not automatically become a live question.

But software has a funny way of turning bad assumptions into permanent behaviour if you never define the distinction explicitly.

If an item exists inside the database or content files, the easiest implementation is often to let the application use it.

That is convenient.

It is also how unfinished material quietly becomes production material.

So I wanted content to have a lifecycle.

Something can be created.

Inspected.

Reviewed.

Corrected.

Approved.

And only then treated as something the student should encounter.

The exact workflow will probably keep changing as I use it.

The principle matters more than the labels.

Creation is not publication.

That rule gives me somewhere to be uncertain.

A question can exist while I am still checking it.

That is much safer than pretending everything must be either nonexistent or finished.

Reviewing content needed to feel different from creating it

This became another useful distinction.

Making a question and evaluating a question require different mindsets.

When I create something, I naturally understand what I intended.

That makes mistakes surprisingly difficult to notice.

An explanation can feel obvious because I already know what I meant.

A distractor can seem reasonable because I remember why I wrote it.

A classification can look correct because I made the classification.

Reviewing needs a little distance.

The Content Studio gave me a better place to look at an item as an object that needs to justify itself.

Is the answer actually unambiguous?

Are the wrong options convincingly wrong rather than obviously useless?

Does the explanation teach something?

Does the question test the skill it claims to test?

Would I understand this if I had not written it?

Is the difficulty label believable?

Is anything missing?

That does not magically make review perfect.

I can still miss things.

But a dedicated review environment makes it easier to behave like a reviewer instead of the person defending what they just created.

Metadata became part of the content

Earlier in the project, I probably would have described content as:

The question.

The options.

The answer.

The explanation.

Now that definition feels incomplete.

The surrounding information changes how the rest of the application understands the item.

A grammar question and a vocabulary question may look similar on screen while producing different evidence about the student.

Two questions can test the same broad subject while belonging to different subskills.

A question might be useful in more than one exam context.

Difficulty influences how performance should be interpreted.

Editorial state affects whether the question should appear at all.

The text is what the student sees.

The metadata is part of what makes the system capable of using that text intelligently.

That made the Content Studio less like an editor and more like a window into the internal meaning of the question bank.

I wanted mistakes to be visible before students found them

This is probably the least exciting reason I built the studio.

It might also be the most important.

A student should not have to become my quality-control system.

If a question is missing information, I should have a better chance of noticing that before someone encounters it during practice.

If something looks inconsistent, I want that inconsistency to be obvious internally.

If an item is unfinished, the system should know that it is unfinished.

If a field matters, I should not rely entirely on remembering that it exists.

This is the same lesson I have kept learning in different parts of the app.

A system becomes more dependable when correctness does not rely entirely on the person using it remembering everything.

Offline sync needed queues because I should not have to remember whether a network request succeeded.

Exam recovery needs state because the student should not lose everything because a tab disappeared.

Permissions need explicit rules because intention alone is not enough.

Content management has the same problem.

If quality depends only on me being careful every single time, eventually I will make a mistake.

The software should help.

Internal tools need good UX too

This surprised me.

I originally thought internal interfaces could be ugly.

Who cares?

Nobody else is going to use them.

Just put some buttons on a page.

Technically, that works.

But bad internal UX creates real consequences.

If finding a question is annoying, review becomes slower.

If important information is difficult to see, it becomes easier to overlook.

If changing something requires too many manual steps, I become more tempted to take shortcuts.

If the interface makes two states look identical, I can accidentally treat them as identical.

Internal software does not need marketing animations.

It does need clarity.

That made me think differently about what "user experience" means.

Sometimes I am the user.

And if I make my own workflow unnecessarily painful, the student eventually pays for that pain through slower updates or worse content.

This also changed how I think about admin panels

"Admin panel" used to sound like one of those boring things every serious product eventually needs.

A table.

Some edit buttons.

Maybe a delete button if you are feeling adventurous.

Now I understand why internal tools can become products of their own.

The student application answers:

How should someone learn?

The internal system answers a completely different set of questions.

What content exists?

What state is it in?

What needs attention?

How do I inspect it?

How do I correct it safely?

How do I know what the application believes about it?

Those are real workflows.

Treating them as an afterthought would eventually make maintaining the main product harder.

So although the Content Studio is private, I stopped thinking of it as disposable development scaffolding.

It is part of the infrastructure behind the experience.

Not everything should be automated

Building internal tooling also created an obvious temptation.

Once you have a structured content pipeline, it becomes very easy to imagine automating everything.

Create.

Classify.

Review.

Approve.

Publish.

Done.

That sounds efficient.

It is also exactly where I want to be careful.

Some operations are excellent candidates for automation.

Machines are very good at repetitive checks.

They can help surface missing information.

They can make large collections searchable.

They can reduce mechanical work.

But educational content has consequences.

A confidently wrong explanation is still wrong.

A badly written question does not become trustworthy because software processed it quickly.

A classification can look precise while being conceptually wrong.

So the goal of the Content Studio is not:

Remove the human from content.

It is:

Give the human a much better environment for controlling content.

That is a different objective.

Speed matters.

But not enough to make quality optional.

The student should never need to know this exists

There is something satisfying about that.

If the Content Studio works properly, almost nobody using the actual app should care.

They should open practice.

Choose what they want to do.

Answer useful questions.

Understand their mistakes.

Continue studying.

They do not need to know how many internal checks happened first.

They do not need to understand the content schema.

They do not need to know what I use to review an explanation.

They definitely do not need another dashboard explaining the infrastructure behind their dashboard.

Good internal systems are often invisible from the outside.

Their success appears as fewer weird things happening.

This project now has two interfaces

That still feels slightly ridiculous.

There is the application I originally wanted to build because my vocabulary backlog was annoying me.

And behind it, there is now another interface helping me maintain the thing.

One exists so I can study.

The other exists so the first one deserves to be studied with.

I did not plan that when I started with 32 questions.

I did not plan most of this project.

But I like what this milestone represents.

The app is starting to require infrastructure that only becomes necessary when you expect it to keep growing.

Not flashy infrastructure.

Not something I can put in a hero section and pretend it changes education.

Just tooling that makes the product easier to maintain honestly.

The more intelligent the app becomes, the better its inputs need to be

This is the larger lesson.

I have spent a lot of time making the application smarter.

It can remember mistakes.

Track timing.

Understand vocabulary progress.

Run exam simulations.

Look for weak areas.

Recommend repair work.

Estimate where evidence is strong and where it is uncertain.

All of that sits downstream from the content.

If the input is bad, intelligence does not rescue it.

It can actually make the problem worse.

A simple app can show one bad question.

A sophisticated app can show the bad question, record the result, update a skill estimate, alter a recommendation and confidently build more decisions on top of the mistake.

That makes content quality part of the intelligence architecture.

I did not understand that when this was a tiny practice tool.

I do now.

I built an app behind my app

The Content Studio is not the most impressive-looking part of the project.

It probably never will be.

That is fine.

It gives me a place to manage complexity before that complexity leaks into the student experience.

A place where unfinished things can remain unfinished.

A place where content can be inspected before it is trusted.

A place where mistakes are easier to notice.

A place where the growing question bank feels manageable instead of fragile.

The first version of this project needed a question screen.

The current version also needs systems for deciding what deserves to appear on that question screen.

Apparently that means building software for my software.

I wasn't expecting that.

But then again, I wasn't expecting the 32-question vocab app to get this far either.