You are so welcome here. How are you feeling right now?
Tap how you feel ✦
✦
✦
✦
✦
✦
✦ BFF’S AUDIO DREAM READER ✦
12:00
AM
Loading...
⏳ Session: 0s
🔥 7 day streak
Your Companion
Aria — tap to talk ✦
🌙
🔊
✦
Continue Listening
🪐
Dune
Frank Herbert
34% complete
▶
7🔥
Streak
0m
Today
3📚
Finished
Today’s Reading Goal60%
✦ Just say anything to Aria...
"Play my book""What time is it""Set a timer 20 minutes""Set medicine reminder 8am""Find me a cosy mystery""Write a bedtime story""Stop""Open Library"
My Library
4 books in orbit
Add or Create
🪐
Dune
Frank Herbert
Chapter 4
⏳ 0m this session
📚 Reading: 0m today
61m3h 00m
🔊80%
Aria’s Voice & Mood
Reading Mood
Speed
0.88x
Pitch
1.05
Device Voice (loading)
Narrator Voice
🙂
Calm reading mode
Auto emotion engine active
🌙
Sleep Monitor
Aria listens while you sleep and reports in the morning
Keep phone face-down near your pillow
Aria writes and reads a soothing story
What Aria listens for
😤
Snoring
Repetitive breathing sounds
😮
Gasping
Sudden sharp breath sounds
🔊
Disruptions
Loud movements or noises
🔒 Audio processed locally. Nothing stored or sent.
5
Get comfortable... 🌙
🌙
Aria is listening...
0m 0s
Live Events
All quiet... rest well ✦
0
Snores
0
Gasps
0
Noises
Accessibility
Built for every reader
Paste or Type Any Text
Display & Audio
Text Size (16px)
⚠
Can’t see the screen?
Tap the glowing orb (bottom-right). Tell Aria what you need.
Settings
🎯 API Key (for AI features)
Free at console.anthropic.com → API Keys
Settings
Your Name
Audio Output
Colour Theme
Text Size
16px
Sleep Timer
Your Stats
14.5
Hours
5
Started
3
Finished
7🔥
Streak
🌐
Fully Offline
No internet needed once installed
✦
Aria
your companion
✦
Speak or type to Aria, Margie.
"Play" • "Set medicine reminder 8am daily" • "Write a mystery novel" • "Find 1984"
LISTENING
⏰ 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
00:00
Timer running
🌙 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?
Customise your story
Your Story
🎤
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."
0:00
✓ Voice recorded! How does it sound?
🎼 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."
0:00
✓ Voice recorded! How does it sound?
🎼 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.