✦ BFF’S AUDIO DREAM READER ✦
Good evening
Margie
You are so welcome here.
How are you feeling right now?
Tap how you feel ✦
Aria
your companion
Speak or type to Aria, Margie.
"Play" • "Set medicine reminder 8am daily" • "Write a mystery novel" • "Find 1984"
⏰ Reminders
Add New Reminder
Your Reminders
No reminders yet. Add one above!
Clock & Timers
Set alarms & countdowns
12:00
AM
⏳ Session: 0s
🔔 Set an Alarm
⏰ Countdown Timer
🌙 Auto-Stop (Sleep Timer)
Aria stops reading automatically after this time, so you can drift off to sleep.
🎙 Say to Aria:
✦ "Set a timer for 20 minutes"
✦ "Set an alarm for 8am"
✦ "What time is it"
✦ "Cancel my timer"
✦ "Set medicine reminder 9am daily"
📚 Add to Library
🔍
Find a Book
Aria searches everywhere for you
Search for a book above ✦
Create a Story
Tell Aria what you’d like
What would you like Aria to create?
🎤
Your Voice Studio
Record, clone and customise your reading voice
🔴 Record Your Own Voice

Reading in your own familiar voice helps with memory and understanding. Record a sample — Aria will use your voice profile to narrate!

"The stars were out in force tonight, scattered like diamonds across the velvet sky. I sat by the window, book in hand, and felt the whole world grow quiet and kind."
🎼 Voice Customisation
Quick Presets
Speed
0.88x
Pitch
1.05
Volume
100%
Device Voice (loading)
🎹 Emotion Engine

Aria automatically shifts her voice to match the story — louder and faster in excitement, softer and slower in sadness, whispery in mystery.

Auto Emotion Mode
Voice adapts to the story automatically
Manual Emotion Override
How it works: Aria scans the story text for emotional keywords. Fear → slower, quieter. Joy → brighter, faster. Romance → warm and soft. Action → urgent and louder. Sadness → gentle and slow.
🎵
Background Sounds
No sound playing
Background Volume
40%
🔥 Cosy & Peaceful
🏠 Nature & Outdoors
🌏 Adventure & Dramatic
🌙 Sleep & Relax
🔒 Fully offline & private
All sounds generated locally using the Web Audio API — no downloads needed, works without internet.
/* ── UNIVERSAL BOOK PHOTO SEARCH ── Works with: book cover, spine, barcode, ISBN, product photo, screenshot, handwritten title, photo of a shelf, magazine, any image with a book */ async function handleBarcodePhoto(input){ searchBookFromPhoto(input, 'isbn-stat', null); } async function searchBookFromPhoto(input, statusId, resultId){ var f=input&&input.files&&input.files[0];if(!f)return; var st=statusId?document.getElementById(statusId):null; var res=resultId?document.getElementById(resultId):null; if(st){st.style.display='block';st.innerHTML='
Aria is looking at your photo...
';} var reader=new FileReader(); reader.onload=async function(e){ var b64=e.target.result.split(',')[1]; var mime=f.type||'image/jpeg'; try{ /* Step 1: Ask Claude to identify what book(s) it sees */ var r=await fetch('https://api.anthropic.com/v1/messages',{ method:'POST', headers:aiHeaders(), body:JSON.stringify({ model:'claude-sonnet-4-20250514', max_tokens:800, messages:[{role:'user',content:[ {type:'image',source:{type:'base64',media_type:mime,data:b64}}, {type:'text',text:'Look carefully at this image. Identify any book or books you can see. Look for: book covers, book spines, ISBN barcodes, titles, author names, product labels, screenshots of book listings. Return ONLY a JSON object (no other text): {"found":true/false,"books":[{"title":"exact title","author":"exact author","isbn":"if visible or empty","confidence":"high/medium/low","description":"one sentence about the book"}],"what_i_see":"brief description of what the image shows"}. If multiple books visible, include all. If no books found, return {"found":false,"books":[],"what_i_see":"description"}.'} ]}] }) }); var d=await r.json(); var raw=d.content&&d.content[0]&&d.content[0].text?d.content[0].text.trim():'{"found":false,"books":[]}'; raw=raw.replace(/```json|```/g,'').trim(); var arrStart=raw.indexOf('{');var arrEnd=raw.lastIndexOf('}'); if(arrStart>=0&&arrEnd>arrStart)raw=raw.slice(arrStart,arrEnd+1); var info=JSON.parse(raw); if(!info.found||!info.books||info.books.length===0){ if(st)st.innerHTML='
⚠ I could not identify a book in that photo. I saw: '+(info.what_i_see||'unclear image')+'.

Try: a clear photo of the front cover, back cover barcode, or book spine.
'; ariaSpeak('I could not find a book in that photo, '+S.userName+'. Could you try a clearer photo of the book cover or the barcode on the back?'); return; } /* Step 2: Show what was found */ var book=info.books[0]; if(st)st.innerHTML='
✓ Book identified!
'+ '
'+ '
'+book.title+'
'+ '
by '+(book.author||'Unknown author')+(book.isbn?' • ISBN: '+book.isbn:'')+'
'+ (book.description?'
'+book.description+'
':'')+ (info.books.length>1?'
+'+(info.books.length-1)+' more book(s) found in image
':'')+ '
'+ '
'+ ''+ ''+ '
'; /* Also handle multiple books on a shelf */ if(info.books.length>1&&res){ res.style.display='block'; res.innerHTML='
All books found in photo:
'+ info.books.map(function(b,i){ return '
'+ '
'+b.title+'
'+( b.author||'')+'
'+ ''+ '
'; }).join(''); } ariaSpeak('I found "'+book.title+'"'+(book.author?' by '+book.author:'')+'. Shall I search for it and add it to your library, '+S.userName+'?'); }catch(e){ if(st)st.innerHTML='
Could not read the photo. Please check your connection and try again.
'; } }; reader.readAsDataURL(f); } function searchBookByTitle(encTitle, encAuthor){ var title=decodeURIComponent(encTitle); var author=decodeURIComponent(encAuthor); var q=title+(author?' '+author:''); closeImp(); document.getElementById('bs-ov').classList.add('open'); var bi=document.getElementById('bs-inp');if(bi)bi.value=q; searchBooks(); ariaSpeak('Searching for "'+title+'" now, '+S.userName+'!'); } function addBookDirectFromPhoto(enc){ var b=JSON.parse(decodeURIComponent(enc)); var book={ id:Date.now(), title:b.title||'Unknown Title', author:b.author||'Unknown Author', cover:'📚', text:b.title+(b.author?' by '+b.author:'')+'. '+(b.description||'')+' [This book was added from a photo. Search for more content in the Library.]', genre:'Book',progress:0,chapter:'Chapter 1' }; S.books.push(book);buildLib(); closeImp(); ariaSpeak('"'+book.title+'" added to your library, '+S.userName+'! I will search for the full book content now.'); showToast('📚 "'+book.title+'" added!',3000); /* Auto-search for full book */ setTimeout(function(){ document.getElementById('bs-ov').classList.add('open'); var bi=document.getElementById('bs-inp');if(bi)bi.value=book.title+' '+book.author; searchBooks(); },1500); } function addScannedBook(enc){ var text=decodeURIComponent(enc); var book={id:Date.now(),title:'Scanned Document',author:'Scanned by Aria',cover:'📷',text:text,genre:'Document',progress:0,chapter:'Beginning'}; S.books.push(book);buildLib(); closeImp();S.currentBook=book;S.progress=0;goToPlayer(); ariaSpeak('I have saved your scanned text to the library, '+S.userName+'. Opening it now.'); } /* ── STARTUP ── */ /* Speaker mode is default — always start with speaker on */ S.audioOut='speaker'; applyTheme('Midnight'); /* Pre-warm the TTS engine immediately */ setTimeout(function(){initAll();},100); /* On first user gesture — ensure synth is ready */ document.addEventListener('touchstart',function(){ initAll(); /* Unlock audio context for background sounds */ if(bgAudioCtx&&bgAudioCtx.state==='suspended')try{bgAudioCtx.resume();}catch(e){} },{passive:true,once:true}); document.addEventListener('click',function(){ initAll(); if(bgAudioCtx&&bgAudioCtx.state==='suspended')try{bgAudioCtx.resume();}catch(e){} },{passive:true,once:true});
🎤
Your Voice Studio
Record, clone and customise your reading voice
🔴 Record Your Own Voice

Reading in your own familiar voice helps with memory and understanding. Record a sample — Aria will use your voice profile to narrate!

"The stars were out in force tonight, scattered like diamonds across the velvet sky. I sat by the window, book in hand, and felt the whole world grow quiet and kind."
🎼 Voice Customisation
Quick Presets
Speed
0.88x
Pitch
1.05
Volume
100%
Device Voice (loading)
🎹 Emotion Engine

Aria automatically shifts her voice to match the story — louder and faster in excitement, softer and slower in sadness, whispery in mystery.

Auto Emotion Mode
Voice adapts to the story automatically
Manual Emotion Override
How it works: Aria scans the story text for emotional keywords. Fear → slower, quieter. Joy → brighter, faster. Romance → warm and soft. Action → urgent and louder. Sadness → gentle and slow.
🎵
Background Sounds
No sound playing
Background Volume
40%
🔥 Cosy & Peaceful
🏠 Nature & Outdoors
🌏 Adventure & Dramatic
🌙 Sleep & Relax
🔒 Fully offline & private
All sounds generated locally using the Web Audio API — no downloads needed, works without internet.