Lisa Lin had long worked alongside coders. When she had her son, she tried it for herself.
The 33-year-old has worked in operations roles at a variety of tech companies, including Uber. But she was “non-technical,” as her industry would call it; she couldn’t code.
Then came the AI revolution, and her baby. Lin moved from a full-time operations role to a contractor while taking on the new job of stay-at-home mom.
She’d heard horror stories about those early months, but has been pleasantly surprised. “He’s a happy baby,” she said.
When her baby was about 5 months old, she began testing out nutritional apps to introduce solid foods and identify allergens. She tried a popular nutrition app but found it overwhelming. “Day to day, it’s a lot of information to digest,” she said.
‘
).join(”);
root.innerHTML = `
`;
const msgsEl = document.getElementById(‘messages’);
(cfg.messages || []).forEach((m, i) => {
if (m.role === ‘divider’) {
const d = document.createElement(‘div’);
d.className=”divider”;
d.style.transitionDelay = (Math.min(i, 6) * 80) + ‘ms’;
d.innerHTML = m.label ? ‘‘ + esc(m.label) + ‘‘ : ”;
msgsEl.appendChild(d);
return;
}
const row = document.createElement(‘div’);
row.className=”msg-row”;
row.style.transitionDelay = (Math.min(i, 6) * 80) + ‘ms’;
row.dataset.index = i;
const msgDiv = document.createElement(‘div’);
msgDiv.className=”msg ” + (m.role === ‘user’ ? ‘user’ : ‘assistant’);
const markerHtml = m._noteNum
? ‘‘ + m._noteNum + ‘‘
: ”;
if (m.image) {
const cap = m.caption ? ‘
‘ + esc(m.caption) + ‘
‘ : ”;
if (m.role === ‘user’) {
msgDiv.innerHTML =
‘
‘
cap +
‘
‘ + markerHtml;
} else {
msgDiv.innerHTML =
markerHtml +
‘
‘
cap +
‘
‘;
}
} else {
const bodyHtml = renderText(m.text || ”);
if (m.role === ‘user’) {
msgDiv.innerHTML = ‘
‘ + bodyHtml + ‘
‘ + markerHtml;
} else {
msgDiv.innerHTML = markerHtml + ‘
‘ + bodyHtml + ‘
‘;
}
}
row.appendChild(msgDiv);
// Inline note for mobile — placed before the annotated message
if (m.note) {
const inlineNote = document.createElement(‘div’);
inlineNote.className=”note-inline msg-row”;
inlineNote.style.transitionDelay = (Math.min(i, 6) * 80) + ‘ms’;
inlineNote.innerHTML = esc(m.note);
msgsEl.appendChild(inlineNote);
}
msgsEl.appendChild(row);
});
// Animate in
const items = msgsEl.querySelectorAll(‘.msg-row, .divider’);
const sideNotes = document.querySelectorAll(‘.note-sidebar’);
if (‘IntersectionObserver’ in window) {
const io = new IntersectionObserver((entries) => {
entries.forEach(e => {
if (e.isIntersecting) {
e.target.classList.add(‘in’);
// Also reveal matching sidebar note
const idx = e.target.dataset && e.target.dataset.index;
if (idx !== undefined) {
const sn = document.querySelector(‘.note-sidebar[data-for=”‘ + idx + ‘”]’);
if (sn) sn.classList.add(‘in’);
}
io.unobserve(e.target);
}
});
}, { root: msgsEl, threshold: 0.15, rootMargin: ‘0px 0px -20px 0px’ });
items.forEach(el => io.observe(el));
requestAnimationFrame(() => {
const cr = msgsEl.getBoundingClientRect();
items.forEach(el => {
const r = el.getBoundingClientRect();
if (r.top < cr.bottom && r.bottom > cr.top) {
el.classList.add(‘in’);
const idx = el.dataset && el.dataset.index;
if (idx !== undefined) {
const sn = document.querySelector(‘.note-sidebar[data-for=”‘ + idx + ‘”]’);
if (sn) sn.classList.add(‘in’);
}
io.unobserve(el);
}
});
});
} else {
items.forEach(el => el.classList.add(‘in’));
sideNotes.forEach(el => el.classList.add(‘in’));
}
// Show sidebar notes after a short delay
setTimeout(() => {
document.querySelectorAll(‘.note-sidebar’).forEach(el => el.classList.add(‘in’));
}, 600);
function esc(s) {
return String(s).replace(/[&<>”‘]/g, c => ({
‘&’:’&’,'<‘:'<‘,’>’:’>’,'”‘:'”‘,”‘”:”’
}[c]));
}
// Render text with hanging indent on bulleted lines
function renderText(s) {
const lines = String(s).split(‘n’);
return lines.map(line => {
if (line.trim() === ”) {
return ‘ ‘;
}
// Detect leading whitespace and bullet character
const m = line.match(/^(s*)([•◦●○-*])s+(.*)$/);
if (m) {
const ws = m[1].length;
const depth = ws >= 8 ? 2 : 1;
return ‘‘ + esc(m[2] + ‘ ‘ + m[3]) + ‘‘;
}
// Indented non-bullet line
const indentMatch = line.match(/^(s+)(.*)$/);
if (indentMatch && indentMatch[2]) {
return ‘‘ + esc(indentMatch[2]) + ‘‘;
}
return ‘‘ + esc(line) + ‘‘;
}).join(”);
}
})();
All Lin wanted was an app that would “tell me what I should do today,” she said.
“I’m huge on nutrition,” Lin said. “I want to make sure I’m doing this right because, honestly, my pediatrician didn’t tell me anything. They just handed me a paper.”
So, she got out Lovable, an AI app builder, and started tinkering. She joined the growing class of “vibe coders” who construct apps and sites with little-to-no engineering knowledge. All they need is an AI tool, some good prompts, a vision of what could help make their lives better, and a willingness to experiment.
Lin gathered data on which 50-100 foods to first introduce to your baby. Her information came primarily from the Department of Agriculture’s database, with assistance from ChatGPT and some online articles. She then built a daily checklist with the goal of making sure her baby was eating the right foods at the right time — and named it Nutribabe.
For many vibe coders, the thrill of prompting leads to hours and hours of work. Lin couldn’t do that with a five-month-old; she rarely got an hour uninterrupted.
“I don’t get to sit down at the computer for three hours and vibe code everything,” Lin said. “I don’t have the luxury to do that.”
Lin would often spend thirty minutes with Lovable before returning to her baby when he cried or needed feeding. Her peak hours were in the morning, and it took about one month to build the first iteration.
The most challenging task was building the app’s internal infrastructure. Nutribabe includes a recommendation engine based on the baby’s age and preferences.
Having a techie husband helps. Lin met her partner in San Francisco, where she moved after living in China and Singapore. They matched on Coffee Meets Bagel and stayed in San Francisco before moving to Las Vegas.
Her husband is a machine learning engineer. “He’s an expert on everything AI,” Lin said. “Sometimes, I get tips.”
That also helped inform her biggest piece of advice.
“When it comes to building as a non-technical person, the most important thing is getting tips,” Lin said. She could easily vibe code a shoddy app, she said, but wouldn’t know whether there were bugs or security concerns without asking for help from someone in the know.
Once the app was built, Lin started using it every day.
“I definitely felt more organized,” she said. “I felt more confident and more calm.”
Lin’s next challenge: converting the web app into a mobile platform. She wants to open it to the public, but is planning to get in a bit more user testing first.
“I still want to validate some specific product features with my mom friend,” she said.
Read the full article here















