#Bobby, a new voice assistant and Snowy successor

1 messages Β· Page 8 of 1

wooden wedge
#

you can degoogle the google cube

edgy flame
#

cubium

wooden wedge
#

the remaining hole being google shaped would carry some meaning too I'm sure

karmic lion
#

You can but it'll be very unstable if you do

#

Sounds about right.

#

The pieces also have magnets to stick together so it may be more stable than I'd expect

#

The award for getting things done to ensure the project runs smoothly

#

I miss when organisations gave me prizes all the time.

#

I also made over ten thousand dollars in spot bonuses in 2019, I think

#

Now I just get burnout and forced to use phones I hate instead.

#

This cube came with a free trip to Hawaii

#

The trip was scheduled for April 2020

#

It did not work out.

rough cliff
#

Aww sad

karmic lion
#

The per person budget for the trip was two thousand dollars, so eventually they just let me spend it on whatever I wanted

karmic lion
#

I'm still sad about the maps.

covert ingot
#

Is there a secret maps-but-may-crash build I can run?

#

Because I am also sad about the maps

karmic lion
#

the server won't generate maps for you

#

though I guess I may as well ship that

#

since it has no effect if the client doesn't support them, and involved some other rework to make the maps practical

covert ingot
#

Wonderful

karmic lion
#

I don't know whether I want to ship the wild system where I replaced all memory-allocating calls I could find with my own versions that try to free up some memory if the allocation fails

#

(by throwing away images or the beginning of the conversation)

celest pulsar
#

I was thinking, if the picture size makes debugging hard due to memory limitations, could you do with half-sized images during the bug-hunting process?

#

that only helps if the whole thing fits into memory once any memory leaks are plugged of course

obtuse oriole
#

Would it be any better to have the map view appear as an option if you hold Right instead of automatically? Less convenient maybe, but maybe the conversation view could be unloaded and the map could get the "fullscreen" treatment and not be competing for resources. The conversation and the option to dictate more could just go away for a little while.

shell jetty
#

Alright, I finally found some time to toss together some ideas for how this could work on the Round, in the most basic form.

I was trying to stay as close to the original design as possible in order to minimize the need for code changes β€” with this proposal, widgets could remain more or less unchanged, outside of some metric/alignment changes. Thoughts? @edgy flame @wooden wedge

karmic lion
#

Seems reasonable to me

shell jetty
#

Excellent, if you approve of the general look I can give it a go in the code when I get a chance

#

I explored some more avant garde designs, but IMO those would also necessitate new designs for the other watches, which felt out of scope hah

karmic lion
#

I need to figure out what I want to do with all the code changes I made for maps

#

Which among other things included replacing all logging calls and all memory allocation

#

They will not merge cleanly later.

shell jetty
#

could the refactors be included but with the actual functionality turned off via preprocessor directives?

#

or would that still cause all the memory madness

karmic lion
#

This would require me to decide I like the refactors

shell jetty
#

ah, fair haha

karmic lion
shell jetty
#

oh wow fancy custom memory code...did it affect performance of the non-maps functionality at all?

karmic lion
#

Not that I noticed

#

It doesn't do anything very fancy unless the allocation fails

#

Then there's a system where parts of the app can volunteer to try to free memory and it runs through those until the allocation succeeds

#

the two volunteers were maps - (they'd be tossed out) and the conversation (the oldest parts would be deleted)

shell jetty
#

ah i see

#

it does seem to add a lot of nonstandardness, which to me feels somewhat like a Bad Thingβ„’ -- maybe it could be shuffled into an experimental branch in case it's needed to try and solve a memory issue in the future?

karmic lion
#

Custom allocators are not particularly unusual

#

This one isn't even custom, it just wraps the normal one

shell jetty
#

admittedly my C memory allocation knowledge is exceedingly rudimentary

#

when some guy on github rewrote all of TimeStyle's persistence code and made it load like 5x faster i was amazed haha

#

so i suppose it's best to go with what you think is the cleanest option πŸ€”

karmic lion
#

The custom SDK methods are funkier

#

blayer_create

shell jetty
#

oh i thought that's what you were referring to by custom allocators hah

karmic lion
#

By that I mostly referred to bmalloc

#

Incidentally did you know that allocating a menu layer costs 456 bytes? Fun facts.

#

(on basalt, anyway)

shell jetty
#

ah, memory pressure

#

no one likes dealing with it

karmic lion
#

Life should be better on the core time 2, assuming it inherited Emery's 128k memory limit

#

That's the same amount that the original pebble got for the entire system

shell jetty
#

that plus the touchscreen should make for some interesting CT2 exclusives

karmic lion
#

I forgot about the touchscreen

#

Gotta put in compass support

shell jetty
#

i plan to make an RPN calculator app

karmic lion
#

"bobby, which way am I facing?"

shell jetty
#

"i'm sorry, your watch lacks a compass because eric said no one used the compass"

karmic lion
#

"You are facing despair"

acoustic wolf
#

I want a judgemental Bobby that actively pokes me for my habits

karmic lion
#

The killer feature for bobby is XIP. 512k of code space would be basically unlimited.

acoustic wolf
#

CT2 would probably be 256kB though

shell jetty
#

i guess it would only require a fairly small prompt alteration to make bobby sarcastic and condescending

acoustic wolf
#

"Where is the nearest gas station?"

#

"why don't you look at a map you lazy ass"

shell jetty
karmic lion
#

It's not votable and that doesn't seem very compelling as an argument πŸ˜„

karmic lion
#

Is anything bobby does particularly standard?

#

Not really

#

It's almost all custom layers and stuff anyway

shell jetty
#

true, i am concerned that will make paginating it trickier

#

but hopefully i can get away with lots of preprocessor directives to change margins or whatever

#

PBL IF ROUND ELSE πŸš€

#

i mean it's actually shockingly usable on round right now -- just adding padding would be enough to make it 100% usable (though not compliant with the you-shouldn't-scroll-stuff-on-round guideline)

acoustic wolf
#

I want the sarcastic health insights that pebble once had

#

but with Bobby and LLM magic

#

extra damage dealt to my self esteem

shell jetty
#

i don't really remember the old ones, but i guess they were memorably condescending hah

acoustic wolf
#

I guess it hurt too many people haha

karmic lion
#

I wrote all those release notes so that's basically just my opinion but Official

karmic lion
#

I think I'll probably keep most of the refactors

#

And see if I can ifdef out a minimal amount of the map stuff so it is compiled but then optimised out

#

Keep it building

#

I'll have to fix the behaviour when moving up the last conversation entries though

#

Last time I tried it, the last entry didn't get shifted appropriately

#

Though maybe I should just not shift it up and instead draw a big grey box past the top or something

wooden wedge
#

assuming it's paginated?

karmic lion
#

I think you would have to duplicate it, especially since it's in a different font (which is not, it must be said, minimal code changes)

wooden wedge
#

I don't know how pagination works for scroll layer, can you somehow force page break?

karmic lion
#

Pagination of text and pagination of the scroll layer are independent things

#

Stuff just goes at the specified coordinates on the scroll layer

#

And then it scrolls through in page sized jumps

#

You can't specify break points though.

#

(you could if you built it yourself, the scroll layer pagination is a trivial button behaviour change)

shell jetty
#

My hope is that it will be at least somewhat straightforward

karmic lion
#

This isn't very elegant because during the animation you'd see the text twice

wooden wedge
#

I would opt for full screen widgets myself, since it seems less complex

karmic lion
#

You could do it properly and not duplicate the text, but you'd have to override all the paging and wrapping behaviour

shell jetty
karmic lion
#

(doable; a custom wrapping perimeter is used on the root screen)

#

Reimplementing all the widgets is probably the lesser evil here

#

They all need adjusting anyway.

#

Really all the segment types need work no matter what.

shell jetty
#

I think the animation with paging is mostly a lost cause, and it would need to just not auto-page

#

It would be a weird experience IMO to briefly see a page and then get jumped to the next one

karmic lion
#

I mean when you hit the button it animates the page transition

#

You'll see the duplicate text

shell jetty
#

I was thinking the smaller hint text would disappear on animation start β€” hopefully not too jarring maybe? πŸ€”

wooden wedge
#

you would have more space allowance to make them pretty on round

karmic lion
#

There's also not exactly a large number of segments

shell jetty
#

That is true haha, I don’t actually like most of the way the widgets look now πŸ˜…

karmic lion
#

(there are seven)

#

😠

shell jetty
#

IMO full screen would look better on all the watches, not just round

#

(For the widgets, I mean)

karmic lion
#

I explicitly don't want them to be full screen; I want them to be part of the flow, with conversational elucidation

#

Full screen would be particularly terrible for the timer or number widgets, and also for the info segments

#

And it's unaffordable for map widgets - we don't have that sort of memory

#

I don't like full screen because it removes them from the flow of the conversation

wooden wedge
#

that's fair

karmic lion
#

(consequently I don't like round at all)

wooden wedge
#

most of the screen might be better anyway

#

this is kinda the reason for the left bar ideas, because they ground everything to the conversation

#

I do not know what a map would look like with that design tho

karmic lion
#

I am currently defending my rectangular choices.

#

Full screen widgets are probably the Circle Way

wooden wedge
#

map is gonna be interesting regardless on the round

karmic lion
#

Certainly not shipping over a 180x180 map

shell jetty
#

maybe the left bar approach is the least-bad option actually

karmic lion
#

Good news: there's no room for new features πŸ˜„

#

Adding round is a lifetime commitment to 100% more UI work regardless

#

Maybe 50% more UI work given the impending arrival of Larger Rectangle

#

But for the most part Larger Rectangle is cheap

shell jetty
#

quick left-bar version

#

that could be more in the minimal code changes range? πŸ€”

karmic lion
#

Now put an invisible right bar in and skip the paginating completely

#

Minimal changes achieved

shell jetty
#

tbh it would work -- like i said Bobby is already like 90% usable on round

#

maybe that should be the MVP

karmic lion
#

Also rather departing from Bobby's generally Very Pebble philosophy, mind.

#

Though apparently being Very Pebble requires doing everything from scratch because pebble didn't include most of the tools

shell jetty
#

IMO if bobby wanted to be the most Very Pebble possible it would look like a stack of notification cards πŸ˜…

karmic lion
#

But it isn't notifications.

wooden wedge
#

the notification interface isn't that good for it

#

it is a good source of inspiration

shell jetty
#

it's the same basic idea though -- a list of messages

karmic lion
#

Not related messages, and not necessarily messages

#

Notifications are just a pile of Random Stuff

#

Which is not what Bobby provides

#

I guess a reasonable argument could be made that lots of scrolling is not especially pebble, but I don't think adding artificial breaks would improve that

shell jetty
#

quick notification card concept -- i think it basically functions, though perhaps the lack of a hint as to whats next is disappointing

karmic lion
#

Hey I've seen this one

wooden wedge
#

yeah, we went over this before

karmic lion
#

Mic is a better icon for you

wooden wedge
#

that it is

shell jetty
#

yup, it's pretty similar to some of y'all's earlier sketches

wooden wedge
#

I still like my hand pointing at you

shell jetty
#

another variation that, like your earlier ones, tries to add a visual "what's next" hint:

karmic lion
#

Bobby accuses you

shell jetty
#

but that's just another paging based concept hah

karmic lion
#

Except you can't actually use any of the system support for paging things

#

Now it is high effort to make the animations sane

shell jetty
#

now that it's open source i suppose theoretically one could just copy paste the entire notifications app

#

but i suppose that is complete overkill hah

karmic lion
#

You couldn't, it uses private APIs all over

shell jetty
#

alas

karmic lion
#

The status bar layer has many cool features you aren't allowed to have

#

Someone should package up all the Kino stuff as a pebble package, that'd be handy

#

The animations you'd need for that design are pretty simple though, I think

shell jetty
#

here's a more conversational non-paged concept that i felt looked too much like it belonged on a Moto 360β„’

#

it's very pebble noncompliant

karmic lion
#

Move the circle up while enlarging it and show the text when the enlarging circle is passing over

wooden wedge
#

yeah, that sounds about right

shell jetty
#

yup the notifications app does exactly that i believe

wooden wedge
#

animations weee

shell jetty
#

this conversation has convinced me that we should just add margins to the existing version, then say that real Round support with paging is soon

karmic lion
#

I am just annoyed that any good round implementation will have its own reimplementation of the session window

#

Which is the single most cursed thing in the app

#

Now there can be two of them

#

Maybe the round one is less cursed because instead of calculating heights and offsets everywhere it just starts over for each segment

#

Also probably needs some refactoring to pull the behaviour part away from the layout part

#

Meh

shell jetty
#

exactly! the complexity and maintenance implications of doing a "true" round implementation is so high, and interest is so low, that i am now convinced of the m a r g i n s approach

karmic lion
#

Maybe the soon to be 2% of users who use a round pebble just don't get bobby nrfbutitskatharineasahorse

acoustic wolf
#

i have 4 pebble rounds in shipping that are eagerly waiting to experience the little horse

wooden wedge
#

there's presumably a reason why I don't use round

shell jetty
#

not sure if mauve GColorRichBrilliantLavender is an appropriate margin color for the brand

#

but this would truly support minimal code changes and would, i think, be usable

karmic lion
#

I'm pretty burnt out on Bobby right now but some day I will come back and give it circle support I like

#

Also my month of leave from work is coming to a close and I don't want to spend the remainder of it writing software

#

As I basically did the first two weeks

shell jetty
#

fair enough haha

#

admittedly, i personally would like to use bobby on my round, so i'll still probably add these lovely margins at least for my personal use (and create an MR just in case)

#

behold: m a r g i n s

#

tbh if i were to fill in the left gutter i don't think it would be a terrible experience overall (certainly better than nothing, IMO!)

valid shadow
#

Cooking life saver

wooden wedge
acoustic wolf
#

bobby works on rockwork yay

#

I wonder why it doesn't work on Cobble

#

oh well :D

#

I was hoping Bobby would give me a sarcastic answer

edgy flame
# shell jetty

i think this looks very good! the dot at the end of the thread is a very nice touch, and this is much simpler to actually implement than lcp's and my ideas for tearing everything up and redoing it

#

it fits in with the rect look and it is actually doable

#

im a little disappointed we don't get to shove in art and colors everywhere, alas

shell jetty
#

my personal favorite is probably the notification-cards concept (super similar to your earlier one)

shell jetty
#

either way, it sounds like probably whatever i make isn't likely to get merged, so I'm probably just going to do a custom fork where I add left and right margins so that it's usable πŸ˜… (still holding out some hope that it's mergeable though!)

celest pulsar
#

Call it "Robby"

edgy flame
#

they do look very good though

#

they work really well

shell jetty
#

that's a fair point! my general logic was that each element in the conversation is effectively a "card", much like notifications

#

but i can also see why treating it that way breaks the "flow" of the conversation

edgy flame
#

100% it's a good thought to have - i imagined it'd scroll like notifications do, but I don't want it to look exactly like notifications, if that makes sense

edgy flame
wooden wedge
#

my ideas were mostly just trying to do something sensible with the icons, but I clearly can't get that to work very well

karmic lion
#

It always says that when it thinks you asked something stupid

karmic lion
acoustic wolf
#

I want Bobby to ask me if I'm dumb

rough cliff
#

Generally it's the other way around with LLM's

#

cue "I may be stupid" graphic

shell jetty
#

does Bobby have a "test mode" of some kind where it can show content without interacting with the backend? (testing the layout changes is burning through my quota faster than i'd prefer!)

wooden wedge
rough cliff
shell jetty
#

alas

karmic lion
#
[03:03:15] process_heap.c:17> Double free detected on pointer <0x200246e0>
[03:03:15] ault_handling.c:97> App fault! {1d272bb4-cf00-4e3e-a7f3-7394309e0341} PC: 0x801c1f3 LR: ???
Program Counter (PC)    : 0x801c1f3  ???
Link Register (LR)      : ???        ???

oh dear.

#

absolutely no way to discover what, exactly, was double freed

#

It would be nice if the pebble SDK itself behaved remotely predictibly under low memory conditions

#

dictation especially is a disaster

#

(also 1,744 bytes free should not be "low memory")

#

"I understand, I'm running on a Pebble smartwatch and sometimes the display can be a little glitchy"

#

I'm glad the unreliability of Pebble displays is internalised knowledge of Gemini

fervent steppe
#

I thought you could attach a debugger and break on the fault

karmic lion
#

I probably could if I could reproduce it

fervent steppe
#

or am I hallucinating that there is a way to attach a debugger the long way around

karmic lion
#

also if I could run bobby in an emulator, which it currently hates

#

There is a convenient pebble gdb for this purpose (which comes with a preset break on the fault, IIRC)

fervent steppe
#

running it in an emulator would have some win to the effect of having a special pebblekit that could send it lots of messages and run in the background thrashing it

karmic lion
#

true

urban solstice
karmic lion
#

apparently the websocket implementation is insufficiently correct

#

I don't know how - Bobby only does trivial websocket things

#

I took a break but this is still aggravating:

[03:46:11] malloc.c:32> Out of memory! Need to allocate 3616 bytes; 5652 bytes free.
#

Or the entire sequence:

[03:46:11] malloc.c:32> Out of memory! Need to allocate 3616 bytes; 5652 bytes free.
[03:46:11] pressure.c:70> Memory emergency! Trying to free memory.
[03:46:11] ation_manager.c:402> Memory pressure detected.
[03:46:11] ation_manager.c:410> Deleting oldest entry from conversation.
[03:46:11] segment_layer.c:121> destroying SegmentLayer 0x20025aa8.
[03:46:11] pressure.c:85> Freed some memory!
[03:46:11] malloc.c:41> Freed 452 bytes, heap size is now 6104. Retrying allocation of 3616 bytes.
[03:46:11] pressure.c:70> Memory emergency! Trying to free memory.
[03:46:11] pressure.c:88> No joy.
[03:46:11] malloc.c:37> Failed to allocate memory.
fervent steppe
#

fragmentation indeed

karmic lion
#

apparently creating a dictation session eats 3,660 bytes

#

so that's the mystery of where my extra four kilobytes are going answered

#

(those 3,660 bytes do not, incidentally, include a buffer to store the response)

#

I guess if I wanted to juggle my dictation session I could have those available for use when displaying results, and then throw away old content if necessary when the user goes for the next response

#

additional reason the debugger doesn't help: my crashes don't seem to happen in the emulator

karmic lion
#

Now trying that concept out

#

fragmentation wins again.

#

[04:59:25] malloc.c:33> Out of memory! Need to allocate 2048 bytes; 6028 bytes free.

karmic lion
#

I found the stupid fragmentation

#

which was obviously also a memory leak

#

unfortunately, it is a memory leak that apparently the universe depends on

#

not sure how I built that

#

There is an array of pointers to conversation entries. When the array is full, a new one is made and its contents are copied over.

#

and that's it, the original is never freed.

#

The problem is that many things hold pointers into that array (or some version of the array), so freeing it ruins everything.

#

well that's an exciting problem for another day

hollow rivet
#

Obviously you gotta doubly link the pointers so you can update the pointers to the array when you allocate the new one 😎

karmic lion
#

that's not all the fragmentation, but fixing that (through the cunning temporary approach of just making the original size sufficiently large) makes it at least possible to construct a large contiguous region by freeing old conversation segments

#

this is still not great though:

[05:29:18] malloc.c:25> malloc request: 1830; free: 6428
[05:29:18] malloc.c:25> malloc request: 1830; free: 4592
[05:29:18] malloc.c:25> malloc request: 1024; free: 2768
[05:29:18] malloc.c:25> malloc request: 1024; free: 1740
[05:29:18] malloc.c:33> Out of memory! Need to allocate 1024 bytes; 1740 bytes free.
[05:29:18] ation_manager.c:410> Deleting oldest entry from conversation.
[05:29:18] malloc.c:42> Freed 680 bytes, heap size is now 2420. Retrying allocation of 1024 bytes.
[05:29:18] malloc.c:33> Out of memory! Need to allocate 1024 bytes; 2420 bytes free.
[05:29:18] ation_manager.c:410> Deleting oldest entry from conversation.
[05:29:18] malloc.c:42> Freed 500 bytes, heap size is now 2920. Retrying allocation of 1024 bytes.
[05:29:18] malloc.c:33> Out of memory! Need to allocate 1024 bytes; 2920 bytes free.
[05:29:18] ation_manager.c:410> Deleting oldest entry from conversation.
[05:29:18] malloc.c:42> Freed 444 bytes, heap size is now 3364. Retrying allocation of 1024 bytes.
[05:29:18] malloc.c:33> Out of memory! Need to allocate 1024 bytes; 3364 bytes free.
[05:29:18] ation_manager.c:410> Deleting oldest entry from conversation.
[05:29:18] malloc.c:42> Freed 460 bytes, heap size is now 3824. Retrying allocation of 1024 bytes.
[05:29:18] malloc.c:33> Out of memory! Need to allocate 1024 bytes; 3824 bytes free.
[05:29:18] ation_manager.c:410> Deleting oldest entry from conversation.
[05:29:18] malloc.c:42> Freed 652 bytes, heap size is now 4476. Retrying allocation of 1024 bytes.
success!
#

the fact that starting dictation essentially requires six kilobytes is, incidentally, absurd

#

(4k to be able to create the session at all; 2k for it to not hang on the pulsing dot)

wooden wedge
#

that really sounds like it should also be reserved by the system and not the app

#

also, it should be mentioned in the documentation and not require discovery

hollow rivet
#

Where does persistent storage live? Is it possible to offload stuff there?

karmic lion
#

Not practically

#

I wonder whether I should split the maps into multiple bitmaps, reducing the size of the contiguous memory required.

wooden wedge
#

this feature is really becoming complex

karmic lion
#

Mostly I'm not even doing the maps at the moment

#

The thing runs out of memory without them too

#

Just slower

karmic lion
#

It'd be nice to have a diagram of the heap layout annotated with what, if anything, points to each allocated block

karmic lion
#

Apparently this is an existing feature, but only if the firmware was built with --malloc_instrumentation

fervent steppe
#

ah, and also, you can't replace it with your own allocator because the system calls into the allocator

#

though you could potentially do something slabby with small objects to reduce fragmentation that could prevent you from allocating big blocks?

karmic lion
#

Potentially, yeah

#

Though the majority of my small allocations are promptly followed by system-controlled allocations so the available gain may be minimal

#

Though I guess I could reuse those too

#

I might be able to learn something useful by building the firmware with malloc instrumentation and getting bobby to work sufficiently in the emulator environment to figure out what the current situation actually is

cinder parcel
#

Not sure this is the place to poke
But does the app store (pebble app) bobby require any apps or setup alongside to function? Got a voice prompt to be understood but it just kinda waits on presumably Gemini to proceed further and just... Gets stuck like shown

#

Paired with Motorola Razr 5G, Android 12, Pebble App with WearOS and Gemini installed on the phone

karmic lion
#

Gemini the Google product is unrelated

#

Definitely just have to remove all references to it, everyone is always very confused

#

That said, no, there is no setup required

#

I don't know why it's just sitting there

cinder parcel
#

all good, just was trying to add all the possibly relevant info, just got it working, for some reason the app didnt bind my rebble account

karmic lion
#

Huhh

cinder parcel
#

thanks for the reply super quick lol

karmic lion
cinder parcel
#

Pebble App had the boot.rebble config but didnt jump into the account til i re-ran the config, just odd time-to-time

#

pebble.

karmic lion
#

Ah, that would probably explain it

#

Should definitely error better

#

I thought it did error better

cinder parcel
#

it actually never presented errors which made it odd for me to dig into

karmic lion
#

Why show errors when you can pretend to be loading forever

cinder parcel
#

assuming zero chance it can work on gadgetbridge? just testing on the razr to avoid the whole mess with Play Protect, API and junk

karmic lion
#

Definitely not

#

Gadgetbridge doesn't implement JavaScript at all, and would be morally opposed to Bobby's whole deal anyway

cinder parcel
#

good to know, cant wait for that core app then haha....

karmic lion
#

I wonder whether it'll work there

#

It's very broken under Cobble for reasons nobody really understands

#

I suspect Core will inherit a lot of that

cinder parcel
#

itll at least be a new baseline that runs under A16 (presently beta)

acoustic wolf
#

oh god the mic on my pebble 2 is atrocious

karmic lion
#

Disappointing

acoustic wolf
#

I tried asking a question and it transcripted to "3999 1000"

#

and bobby brought out the calculator

karmic lion
#

What is the answer to 3999 1000?

acoustic wolf
#

4999

#

I should've taken a photo

#

ok let's enable audio debug

#

how did it pull those numbers from this audio

karmic lion
#

Machine Learning

acoustic wolf
#

yeah the mic seems to be screwed

#

that's a shame

rough cliff
#

Surprised it didn't give you the classic ]

acoustic wolf
#

it did!

karmic lion
#

I should probably actually handle the lone ] as an error given how common it is as a transcription of nothing

acoustic wolf
#

I have also noticed ever since the introduction of the auto transcription language, transcription has been awfully slow

#

before it was almost instant

#

now it takes a few seconds

karmic lion
#

You are the first person to point this out

#

Seems plausible though given the pipeline is completely changed

#

Though probably not really fixable

acoustic wolf
#

oh well

karmic lion
#

Aside from turning back to the old system, anyway

#

Which is actually still running, just not actively used

#

(It is also definitely slower if you turn on audio debug mode)

#

(since it uploads your recording before responding)

acoustic wolf
#

I see

#

though it is still slow with audio debug turned off

#

it was much faster before

#

the bar would barely start loading before I would get a response, and now it goes to almost a quarter or halfway before I get a response

karmic lion
#

I still get that behaviour, I think

acoustic wolf
#

pretty much that, yeah

#

I can never get that now

karmic lion
#

Weird, I always get that

#

I don't know what about the model change could've changed the behaviour for you only

chilly moat
#

kinda funny that the big bobby banner at the top of the rebble store shows even if you only use a round

#

but bobby doesn't show in the list of apps or in search

cinder parcel
#

same, but OG/Steel lol

karmic lion
#

I think I was going to look at fixing this and then didn't

#

Currently it's not technically possible to avoid it, we'd have to build things

#

Just think of it as an ad for the good watches nrfbutitskatharineasahorse

#

At some point it might get round support and then it's just the mic-less watches missing out

rough cliff
#

bobby t3 when /s

karmic lion
#

You jest, and yet

#

The problem with that of course is that Bobby has way over 24k of code

sick apex
rough cliff
#

I am mostly joking

rough cliff
karmic lion
#

I could save somewhere north of 7k if I didn't have the session code and the menu code (which are mutually exclusive screens) loaded at the same time

rough cliff
#

Also, not sure how that would work with Pebble's design rules. Would be interesting πŸ˜„

karmic lion
#

Pulling that apart sounds like a really exciting trip into the build system

rough cliff
#

πŸ˜„

#

waf hax incoming...

karmic lion
#

pain

rough cliff
#

indeed. But IMO configuring the wscript (at least in my Pebble apps, YMMV) is much more friendly than CMakeLists or Makefile neither of which I can never get to work right

#

not good, but less terrible and painful

karmic lion
#

I don't know that configuring the wscript would be sufficient here

rough cliff
#

oh! In which case, much more pain I presume?

karmic lion
#

Yes

#

Well, I assume

rough cliff
#

very interesting. Kind of interesting to see the ways you can cram as much as possible into Pebbles πŸ˜…

#

I have never really had to think about these limitations until I started working with Pebbles haha

karmic lion
#

I think at minimum I'd need to get it to use a custom linker script, make sure the relevant parts go into the right sections, pull out the parts that aren't part of the main binary and stuff them into resources, and probably do the same position independent fixups the pebble OS does when loading them in

#

Unfortunately I don't understand any of these things

rough cliff
#

excitement

karmic lion
#

I think hacking this into the build system is more trouble than it is worth. I also think it causes a (strictly speaking unnecessary) circular dependency, since we end up needing to generate resources out of the compiled binary, and the compiled binary depends on all the resources.

#

putting that aside for now.

karmic lion
#

finally got my stupid diagram

fervent steppe
#

I think Heiko did a segmented pebble app at some point

karmic lion
#

He did

karmic lion
#

and some attributions, of a sort:

...
Size:    108, Addr: 0x20024eb0 PC: 0x20021577 /pebble-dev/build/../src/c/util/memory/sdk.c:39
Size:     36, Addr: 0x20024f1c PC: 0x00000000 FREE
Size:     28, Addr: 0x20024f40 PC: 0x2001b03f /pebble-dev/build/../src/c/converse/conversation_manager.c:55
Size:    160, Addr: 0x20024f5c PC: 0x00000000 FREE
Size:     92, Addr: 0x20024ffc PC: 0x2001e455 /pebble-dev/build/../src/c/converse/session_window.c:85
Size:     40, Addr: 0x20025058 PC: 0x08036f79 ??:0
Size:    152, Addr: 0x20025080 PC: 0x00000000 FREE
Size:     64, Addr: 0x20025118 PC: 0x2001a9cd /pebble-dev/build/../src/c/converse/conversation.c:47
Size:     32, Addr: 0x20025158 PC: 0x2001a9df /pebble-dev/build/../src/c/converse/conversation.c:51
Size:     28, Addr: 0x20025178 PC: 0x20022d43 /Users/katharine/projects/pebble-events/build/../src/c/appmessage.c:118
Size:     20, Addr: 0x20025194 PC: 0x20022f6d /Users/matthewtole/Documents/Apps/smallstoneapps/libraries/linked-list/build/../src/c/linked-list.c:167
Size:     20, Addr: 0x200251a8 PC: 0x200213e7 /pebble-dev/build/../src/c/util/memory/pressure.c:49
Size:     20, Addr: 0x200251bc PC: 0x20022f6d /Users/matthewtole/Documents/Apps/smallstoneapps/libraries/linked-list/build/../src/c/linked-list.c:167
Size:     20, Addr: 0x200251d0 PC: 0x2001dc23 /pebble-dev/build/../src/c/converse/session_window.c:142
...
#

Now if Bobby actually ran usefully in an emulator I might be able to figure out what's doing the fragmenting

fervent steppe
#

what is this linked-list.c? is something dropping cons cells around?

karmic lion
#

yes. in this instance I think it is being used to assemble the event listeners

#

IIRC it isn't used any more once the conversation is actually set up, but I may misremember

fervent steppe
#

git grep

#

aha pebble-events uses it, yes

#

it looks like it should not have much traffic after init

karmic lion
#

I assume it does not

#

unfortunately I cannot actually get to the interesting part in the emulator for now

#

we die here

#

I should just hack something up to send random replies

#

tomorrow.

fervent steppe
#

yeah, sending random appmessages back (and lots of them) using a pkjs distinct from what actually runs on a watch seems like a good way to stress test it

#

hm, having kernel-allocated memory in the user heap is pretty good. I should go inspect that and see if chaos can be done with it. as if there weren't already enough ways to crash a watch, I suppose

karmic lion
#

all the _create methods do this

static jackal
karmic lion
#

It is

#

I compiled the firmware with malloc instrumentation enabled and also hacked some fixes to stop it from crashing when I tried to read the results

static jackal
#

Neat! I wish I could just rebble dump-memory-usage hahaha
No clue how to compile the firmware

karmic lion
#

With some difficulty

edgy flame
#

Bobby should probably handle the case of launching the app while disconnected from your phone- right now it just shows this screen

karmic lion
#

It should, though I'd argue it's a firmware bug

#

I told the dictation session to show error messages but it doesn't feel like showing an error message for this

edgy flame
#

huh

acoustic wolf
#

iirc you need to enable confirmation for errors to show up

#

or maybe not

karmic lion
#

All the other errors do show up, it's just this one that's not considered an error

edgy flame
#

do we have room for more resources (specifically the big vector art the fw uses for disconnected phone)?

karmic lion
#

Yes, there's no shortage of space

#

Especially for graphics that are mutually exclusive with actually doing anything

edgy flame
#

right - the big crunch is memory on the conversation screen

karmic lion
#

Aw, Gemini 2.5 flash is a chunk more expensive than 2.0 flash

#

50% more with reasoning disabled

quasi steeple
#

Time to add a pro tier to rebble web services /s

wooden wedge
#

natural cork with silver ptr14

#

for your consideration

#

it is a banger combo in my view

edgy flame
#

oh that is VERY good

#

urghhhhhh

#

I just treated myself to a new strap, though

shell jetty
#

Things that it has so far:

  • Paging for consent screen
  • Extra margins for session screen so that it is readable
#

That's pretty much it but you know it's basically usable hah

#

Probably I was going to tackle the talking horse screen next, since that should just be adjusting coordinates until everything is in the right place

wooden wedge
#

nice, I will have a look

novel fiber
#

I guess I'm doing something really wrong with bobby. I use a Time Steel. And every time I dictate something, the system says that it encountered an error. (The German message is: "Ein Fehler ist aufgetreten") I enabled the audio debug mode - but there are no recordings there. So it seems as if there is a general problem with recording and transmitting the audio. Is this problem known?

edgy flame
#

sanity check - you have an active rebble subscription, right? can you use voice in any other apps?

wooden wedge
#

oh

#

@karmic lion good news, it sometimes works, first time I've seen this one

#

I do love the inverted bubble, it's very funny

hidden plover
#

Cobble has

edgy flame
#

may need a new pony art with some neck and body

#

and right align the clock and bubble

#

neat stuff

wooden wedge
#

you can move bobby to the right still

#

it's not like it's going to reveal its lack of body that way

edgy flame
#

sick

#

we'll need to do emery/G screens but i doubt anyone will care until either emulator websockets work or evt units are in hand

#

can we use 25px icons instead of 18 on the cards? that's the only note I have

wooden wedge
#

I do kinda wish cobble on round was pages still

edgy flame
#

it isn't?

wooden wedge
#

it's scrolling

#

it just has margins

edgy flame
#

I assume the goal would be to have it paged and widgets centered

#

this was just the bare minimum to get it usable

#

can you shoot me that pbw, by the way?

wooden wedge
#

sure

#

also great recording quality where you can barely see the screen because of the lighting

edgy flame
#

spalding moment

wooden wedge
#

it's so much worse than time steel it's shocking

edgy flame
#

if someone were to make a new round I'd rather they not change the screen, just glue it to the glass please please please

novel fiber
edgy flame
#

true

edgy flame
edgy flame
novel fiber
edgy flame
#

hmm

acoustic wolf
#

you need to select language in voice settings iirc

novel fiber
barren raptor
wooden wedge
#

this far developers only had to deal with 2-3 resolutions

#

what's one more

edgy flame
#

youll program your layouts the way youre supposed to or youll drown in adaptation work

#

😀

quasi steeple
karmic lion
#

The error is generated by the OS

#

That whole thing is system UI

quasi steeple
#

But Bobby could have a message saying the language isn't set right?

karmic lion
#

There is no way to know that that's why it didnt get a dictation response

quasi steeple
#

Just an idea. I guess the correct method would be the os showing a pop up if dictation is triggered but no language is set

karmic lion
#

And is probably the least likely answer

#

No language being set isn't possible under the assumptions the OS makes; it's a Rebble artifact.

#

(because we charge for dictation, and if you don't pay us the language list is empty. If you start paying us it doesn't necessarily pick a default.)

quasi steeple
#

Gotcha, appreciate the explanation!

shell jetty
#

i assume there is some way to do it but i was not enthusiastic enough to figure out what it is haha

edgy flame
#

mmm that sounds about right

karmic lion
#

sighhhh.

#

well I rigged up bobby to work in an emulator by playing back prerecorded messages

#

this doesn't really help anything because transcription is also broken in emulators.

#

despite the existence of pebble transcribe, which presumably worked at one point

#

oh actually I assume it's not broken in the emulator, it's broken in the firmware.

#

that would make sense

#

doesn't help me at all but it makes sense.

#

well this is what memory looks like when showing a conversation with a map and some text

#

no way to generate more content though.

#

after a bunch more back and forth, during which it has jettisoned the map image

#

(the text and response are the same every time because I just hardcoded a dictation response in bobby)

#

that's fun, I sent another message and it apparently had to jettison the entire conversation

#

I wonder what that looks like

#

so the obvious question is: what are those stripes ruining my contiguous blocks?

#

instrumentation blames all of them on /pebble-dev/build/../src/c/util/memory/malloc.c:32, which is not very helpful

#

okay, merged my two sets of addresses to resolve that to meaningful output

#
Size:    104, Addr: 0x200261a8 PC: 0x2001a9a3 /pebble-dev/build/../src/c/converse/conversation.c:140
Size:     56, Addr: 0x20026210 PC: 0x00000000 FREE
Size:     88, Addr: 0x20026248 PC: 0x2001a9a3 /pebble-dev/build/../src/c/converse/conversation.c:140
Size:     40, Addr: 0x200262a0 PC: 0x00000000 FREE
Size:     36, Addr: 0x200262c8 PC: 0x2001aacd /pebble-dev/build/../src/c/converse/conversation.c:152
Size:    440, Addr: 0x200262ec PC: 0x00000000 FREE
Size:     96, Addr: 0x200264a4 PC: 0x2001a9a3 /pebble-dev/build/../src/c/converse/conversation.c:140
Size:    676, Addr: 0x20026504 PC: 0x00000000 FREE
Size:    128, Addr: 0x200267a8 PC: 0x2001a9a3 /pebble-dev/build/../src/c/converse/conversation.c:140
Size:     32, Addr: 0x20026828 PC: 0x00000000 FREE
Size:    112, Addr: 0x20026848 PC: 0x2001a9a3 /pebble-dev/build/../src/c/converse/conversation.c:140
Size:     40, Addr: 0x200268b8 PC: 0x2001abff /pebble-dev/build/../src/c/converse/conversation.c:233
Size:     44, Addr: 0x200268e0 PC: 0x2001abff /pebble-dev/build/../src/c/converse/conversation.c:233
Size:    440, Addr: 0x2002690c PC: 0x00000000 FREE
Size:    120, Addr: 0x20026ac4 PC: 0x2001a9a3 /pebble-dev/build/../src/c/converse/conversation.c:140
Size:   2088, Addr: 0x20026b3c PC: 0x00000000 FREE
Size:    136, Addr: 0x20027364 PC: 0x2001a9a3 /pebble-dev/build/../src/c/converse/conversation.c:140
Size:    444, Addr: 0x200273ec PC: 0x00000000 FREE
Size:    144, Addr: 0x200275a8 PC: 0x2001a9a3 /pebble-dev/build/../src/c/converse/conversation.c:140
Size:    580, Addr: 0x20027638 PC: 0x00000000 FREE
Size:    520, Addr: 0x2002787c PC: 0x2001ab4f /pebble-dev/build/../src/c/converse/conversation.c:185
Size:    520, Addr: 0x20027a84 PC: 0x2001ab4f /pebble-dev/build/../src/c/converse/conversation.c:185
Size:    520, Addr: 0x20027c8c PC: 0x2001ab4f /pebble-dev/build/../src/c/converse/conversation.c:185
#

oh it's the stupid leak that I accidentally unhackfixed

#

well that wasn't interesting

#

how about the other ones

#

thought->thought = bmalloc(strlen(thought_text) + 1); is interesting

#

there are no thoughts on screen, that must be a leak

#

I don't know how, though, thought text freed when thought entries are destroyed

#

got it, stale thoughts are never destroyed, they just stop being displayed

#

hm, this shouldn't be quite true, they should still be destroyed when the cleanup process runs past them, which clearly it did in this case.

#

hm.

novel fiber
karmic lion
#

in which app?

#

with some bugfixes(?), after the map has been dumped but before conversation pruning occurs

#

huh, once again it had to discard the entire conversation.

#

sigh.

#

much less stripy, though

#

the tiny stripe in the middle of my big free block is apparently the prompt text

#

well that works, but the question then is why the entire conversation history has to be purged to make enough space.

#

unfortunately I can't easily inspect the state while it's in the middle of doing that

#

and so the circle repeats.

#

this time it only did a partial cleanup, apparently

#

ooh, caught a crash

#
#0  app_crashed () at ../src/fw/kernel/fault_handling.c:191
#1  0x0800b3d8 in prv_kill_user_process (stashed_lr=stashed_lr@entry=0) at ../src/fw/kernel/fault_handling.c:197
#2  0x0800b47a in hardware_fault_landing_zone () at ../src/fw/kernel/fault_handling.c:233
#3  0x2001e240 in prv_conversation_entry_deleted_handler (context=0x20025450, index=<optimized out>)
    at ../src/c/converse/session_window.c:393
#4  prv_conversation_entry_deleted_handler (index=<optimized out>, context=0x20025450)
    at ../src/c/converse/session_window.c:385
#5  0x20024dec in ?? ()
fervent steppe
#

that is quite exciting

#

is that an indication that user code is running with higher privileges than it should??

karmic lion
#

nah, I meant an app crash.

#

into which I dumped the full firmware symbols instead of the usual redacted set because why not

#

I am guessing the cause here is that 0xe4001b is probably not a very good pointer.

fervent steppe
#

it sounds bad

karmic lion
#

not sure how it came to be a pointer, mind

fervent steppe
#

aha I now see the fault_handling bits there.

karmic lion
#
#3  0x2001e240 in prv_conversation_entry_deleted_handler (context=0x20025450, index=<optimized out>) at ../src/c/converse/session_window.c:393
        sw = 0x20025450
        to_delete = 0xe4001b
        removed_height = <optimized out>
        new_offset = {x = 28704, y = 26994}
        new_size = {w = 8313, h = 49}
        current_offset = {x = 26999, y = 26740}
        current_size = {w = 29295, h = 29801}
        index = <optimized out>
        sw = <optimized out>
        to_delete = <optimized out>
        removed_height = <optimized out>
        current_offset = <optimized out>
        new_offset = <optimized out>
        current_size = <optimized out>
        new_size = <optimized out>
        i = <optimized out>
        layer = <optimized out>
        frame = <optimized out>

to the extent any of these are not optimised out, they are clearly all garbage

#

(except for sw, which is probably actually correct.)

celest pulsar
#

Why is it putting the prompt text into the middle of the free space? πŸ€”

karmic lion
#

I am assuming the prompt text is put there before the memory emergency forces it to start cleaning things out

#

Since the prompt text is not eligible to be cleaned out, it stays there

fervent steppe
#

consistently garbage is good news

#

those offsets look like lower case ascii

karmic lion
#

on further thought it's mostly meaningless, because it gets as far as looking up to_delete before it tries to dereference it and promptly crashes

#

so I guess the rest is just whatever was on the stack before.

fervent steppe
#

to_delete does not look like lower case ascii, unfortunately

celest pulsar
#

So if you require a big continuous area, you could also need some defragmentation?

fervent steppe
#

the stack contained "priy 1withorit".

karmic lion
#

my current general hope is that if I don't leave detritus around then cleaning things up will always make large contiguous areas.

fervent steppe
#

well, or preallocation of regions that you know will always be long-lived

karmic lion
#

which does appear to be true except when it crashes before it tries to delete something that is decidedly not a pointer.

#

I tried this, but ran into the new problem of most things never being allocated most of the time

#

and being unable to all exist concurrently.

fervent steppe
#

right.

#

if you know when you are going to be done allocating long-lived things, then you can overallocate a big chunk and just keep bumping a pointer within there, and then realloc it down to size once you are 'done'

#

on this note, I am done and it is bed time

karmic lion
#

a good idea

karmic lion
#

I guess I am fairly content with how this behaves now.

#

although if an alarm goes off in a low memory condition apparently it silently fails to render the appropriate animation

#
ld: /pebble-dev/build/diorite/pebble-app.elf section `.text' will not fit in region `APP'
ld: region `APP' overflowed by 2860 bytes

oh.

weary ether
#

Bobby continues to be a work horse!

#

I will say that recently I noticed you introduced an app timeout

#

I think this is something I suggested way back but now I actually prefer to have to timeout

#

Sometimes I was pleasantly surprised to find Bobby still on my wrist with the info I had looked up

#

And I could continue the conversation

#

Although sometimes after too long the session expired

#

Anyway, having Bobby stay on wrist is good

#

Also, did the map stuff get shipped?

#

Oh yay you accounted for timeout in settings!

#

@wooden wedge you did such a good job with the character

#

So clean and expressive

wooden wedge
#

I designed it 2.5 years ago or something like that

#

bobby was in development for a while

weary ether
#

You refined it over that time

#

Very prestige, much prancing

wooden wedge
#

well the icon is pretty much the same as it was

#

all the icons that are related to the store and locker are the original asset too

#

to be fair I should probably improve them a bit, but they work for now

edgy flame
weary ether
#

only checked the settings page after I rambled xD

edgy flame
#

i like the timeout a lot

#

it's very nice to fire off a timer or reminder and then just go back to what I was doing

#

silk has a good enough mic that I don't usually need to double check it

karmic lion
#

It's basically there except when I exit the conversation view it crashes now

karmic lion
#

found that one, the map widget thought it owned the map bitmap but it doesn't

karmic lion
#

I think I have just about dug myself out of this two week long hole

south edgeBOT
wooden wedge
#

yay!

karmic lion
#

also it's now possible to run in an emulator, though it'll just give you some prerecorded responses

south edgeBOT
karmic lion
#

my watch's mic is so bad

#

it's somehow worse when I'm actually wearing it

wooden wedge
#

yeah, wearing mine also makes it slightly worse

#

I don't see how that works exactly, but it does

south edgeBOT
karmic lion
#

"I'm going to go to the bathroom", according to asr.

wooden wedge
#

that doesn't sound right

karmic lion
#

I'm not sure what it says

#

It was something about testing the confirmation feature

karmic lion
#

anyway Pebble can't render those

wooden wedge
#

that's annoying

#

why do we need a narrow nbsp exactly?

karmic lion
#

I dunno, the model used it when I asked about opening times.

wooden wedge
#

I do get using nbsp there

karmic lion
wooden wedge
#

I'm just confused about narrow

karmic lion
#

I guess nnbsp makes sense given that an entire space between the AM and the PM is overkill

wooden wedge
#

fair

karmic lion
#

can pebble render normal non-breaking spaces?

wooden wedge
#

great question

karmic lion
#

after some arguing, apparently yes

wooden wedge
#

cool stuff

#

nnbsp is old enough that pebble could have known about it

#

tho its purpose is Mongolian

karmic lion
#

I guess I will replace narrow non breaking spaces with regular non breaking spaces

wooden wedge
#

this should be a firmware bug too presumably

karmic lion
#

Perhaps

south edgeBOT
karmic lion
#

I have shipped a new bobby

#

with maps!

#

I should update the screenshots again

wooden wedge
#

round support is becoming more and more interesting

karmic lion
#

especially since it'll try to send a 180x100 map on round

wooden wedge
#

yeah

karmic lion
#

that's an extra 900 bytes!

#

which is probably workable

wooden wedge
#

for your consideration: Uber

#

map: βœ…
fullscreen: ❌

karmic lion
#

maps are easy if you don't have forty kilobytes of other code

wooden wedge
#

yeah, no doubt

#

uber app does sound relatively easier

#

since the content is generally not long text output with various widgets

karmic lion
#

the new state of memory management probabls means round can actually afford to put a big map on

#

the problem you will end up with instead is that the pins might be cropped off because circular maps are another problem

wooden wedge
#

yeah, realistically you have a small area in the middle square that ends up being where the points can be

#

which does make the big map kinda pointless

karmic lion
#

currently I actually let google figure out how to scale the map given the points

#

but I cannot express "don't use the corners"

wooden wedge
#

yeah

karmic lion
#

on the plus side if I did the calculation myself I'd actually know where on the map the points should go

#

which would mean I could just draw the location in on top instead of relying on Google putting a special pixel on the map to mark it

#

the pixel is a problem because if another marker hides it I can't recover from that

wooden wedge
#

hmm, yeah

karmic lion
#
if userLocation != nil {
    mapMarkers = append(mapMarkers, gmaps.Marker{
        Location: []gmaps.LatLng{{
            Lat: userLocation.Latitude,
            Lng: userLocation.Longitude,
        }},
        CustomIcon: gmaps.CustomIcon{
            // This is a single blue pixel with the magic 16-bit colour rgb(2827, 5911, 56540)
            IconURL: "https://storage.googleapis.com/bobby-assets/user-location-pixel.png",
            Anchor:  "center",
        },
    })
}

very advanced

#

thanks discord

edgy flame
#

maps are ridiculously cool this is amazing

karmic lion
#

the maps are a pile of ridiculous hacks

#

my hand-drawn google logo that I stamp over the provided one that dies horribly in the quantisation process

#

also this ugly 1-bit version

#

diorite edition

edgy flame
#

map is surprisingly not bad on diorite

#

thin lines are awful but dithering covers a lot of rough spots

#

it's shockingly good for what it is

karmic lion
#

the 2-bit version snowy gets is much better.

#

I actually have a 6-bit version but I've never even tried it on a watch because it wouldn't fit

#

maybe the core time 2 can get 6-bit maps

#

it's sort of frustrating, I actually have Google give me a pure black and white map

#

but I can't stop them from antialiasing it

#

which is workable on snowy but basically just has to be undone on silk

#

it is not very effectively undone.

edgy flame
karmic lion
#

18 kilobytes, give or take

#

maybe a bit more actually

#

23?

#

it'd be a bunch

#

but with 128k of app memory that's not wholly implausible

#

functionally, on basalt bobby has 20k of memory after code space. on emery it'd have 85k

#

or maybe someone will implement xip on snowy and save me from my problems

#

oh right, 6-bit is also not actually a thing, so a bit more than that

#

(it jumps from 4 to 8)

#

Β―_(ツ)_/Β―

#

maybe they'll give us more than 128k to play with.

#

surely we could at least have 4-bit

#

though two of those bits are used for shades of grey

#

new appstore image

edgy flame
#

is that your actual location in those images?

karmic lion
#

it is, in fact, my actual location.

edgy flame
#

all right

karmic lion
#

though my residence in Redwood City is no secret

karmic lion
#

There are three ways to get apps on your platform:

  • be big enough that they don't have a choice
  • pay them
  • convince them to let you do it yourself
#

the first never applied to Pebble, so it was between the latter two

#

and I think in basically every case, the last one

edgy flame
#

the last option does get you the nice in-house ui and art style

#

which i view as a plus

#

pebble is a weird platform in terms of making an app good to use

karmic lion
#
-------------------------------------------------------
EMERY APP MEMORY USAGE
Total size of resources:        21635 bytes / 256KB
Total footprint in RAM:         42824 bytes / 128KB
Free RAM available (heap):      88248 bytes
------------------------------------------------------- 

look at all that free memory

fervent steppe
karmic lion
urban solstice
#

Way too cool πŸ˜†
Great work @karmic lion 😊

karmic lion
#

likes like B, C, and D got lost. Whatever they are.

#

I'm guessing that's this:

bobby-5c9fd7cb7b-fvqrq bobby 2025/04/20 00:01:56 Error parsing index  1: strconv.Atoi: parsing " 1": invalid syntax
bobby-5c9fd7cb7b-fvqrq bobby 2025/04/20 00:01:56 Error parsing index  8: strconv.Atoi: parsing " 8": invalid syntax
bobby-5c9fd7cb7b-fvqrq bobby 2025/04/20 00:01:56 Error parsing index  9: strconv.Atoi: parsing " 9": invalid syntax
urban solstice
#

I'm all yours if you need more test cases πŸ˜†

south edgeBOT
urban solstice
#

Well, that's looking better, heh
(Especially with the language pack)

karmic lion
#

yup. though "nearby" seems like maybe a fail

urban solstice
#

I was asking "Show me a map of the immediate area", if that helps

karmic lion
#

ah

#

yeah, it can't actually do that, so it fudges when asked

edgy flame
#

it probably doesn't know that it can just show a map? like, divorced from the POI feature

karmic lion
#

looks up some places so it can plot them on a map

urban solstice
#

This is certainly more helpful

karmic lion
#

It used to be able to show maps but the results were occasionally very bad

edgy flame
#

same way that timeline is abstracted behind the reminders tool

karmic lion
#

in this case it literally can't show a map unless it plots a previous POI result on it

#

otherwise occasionally it would screw up and just plot a map of the whole earth

#

taking the control away seemed like the way to go

urban solstice
#

I think that's a reasonable outcome

#

Absolutely loving this update!

karmic lion
#

that 180x100 map looks pretty decent

#

will probably run with that whenever I get to round properly

edgy flame
urban solstice
#

Not that this would specifically be a Bobby feature, but displaying Japanese hiragana and katakana as romaji would be a huge QoL improvement for me
|| so that I can further postpone getting good ||

edgy flame
#

kana are easy enough

#

learning to actually write them was the killer memorization thing for me

#

it helps a ton with differentiating ones like ま and γ‚‚ or お and γ‚€

#

kanji though, woof

urban solstice
#

That's a universal mood, from what I've heard

#

@karmic lion Just reported a conversation that claimed to show a map but did not

karmic lion
#

yeah, it does that sometimes, I have not figured out how to make that more reliable

#

you can prod it by saying "you forgot the map" or something and it'll show up

urban solstice
#

Made me crack up TBH

karmic lion
#

amazing.

#

for good measure it's false, it does get given back the same content from before.

#

I have had some stupid arguments with this thing.

urban solstice
#

Not sure if this is a "round dev build thing", but scroll height calculation seems to be off/inconsistent
Sometimes I've got a huge crimson-chin-esque whitespace at the end of the scroll layer, other times, only a pixel or two

karmic lion
#

that is a bug across all platforms

urban solstice
#

Gotcha, figured it was worth raising

#

Sounds like a fun task to fix

karmic lion
#

yeah I have no idea what's up with it

#

The calculation of segment heights (and therefore overall height) is definitely some of the most terrifying code in there.

#

It's never too short so I have not considered it that high-priority

#

But it's not very polished.

#

actually thinking about it maybe it's caused by the snap-to-size of an underestimated text segment to its final, correct size

urban solstice
#

It'd be overestimated, no?

karmic lion
#

I am curious whether using 2.5 flash instead of 2.0 flash would reuslt in any noticeable improvements to general response quality

#

No, I think text segment size is only ever underestimated

#

But when that segment is completed the real size is measured and it gets adjusted

#

I could imagine that the handling of that adjustment at the level above is wrong and inadvertently applies it twice, or something

#

The height isn't measured the easy way on every received fragment because the performance cost is awful

#

So instead it does a running estimate until the text stops showing up

urban solstice
#

Ahhh

#

Interesting.

#

I've just been trying to create a "fail case" by getting a very long list of names as output, the response hung after a snippy back-and-forth πŸ˜†

urban solstice
karmic lion
#

50% higher cost

#

(with thinking disabled. it's more complicated with thinking enabled)

#

For the most part, LLM quota usage isn't a major issue anyway; more is spent on other things

#

But when an entire wikipedia article gets dumped in, that's not true

#

gonna give it a go myself and see whether it's any good to start with

urban solstice
#

Okay that's adorable, but didn't hang?

karmic lion
#

interesting

#

I can't reproduce it hanging

urban solstice
#

So strange... It's hung every time I've tried

#

I'm cackling
No idea what's going on here but it's not that specific of a case

#

I'll stop posting these now, but I want you to know I'm having a great time

karmic lion
#

I wonder whether it's some sort of unicode thing. somehow.

#

The server-side logs show nothing wrong - whatever is breaking is apparently breaking on your phone

#

or watch

#

can you report the thread? (is that even permitted while it's hanging?)

urban solstice
#

Can't report when it's hanging sadly

karmic lion
#

alas

#

maybe I should allow that.

#

although it wouldn't be meaningful

urban solstice
#

I did get one success

karmic lion
#

The report can't be generated until it has a whole response because it gets the ID it needs to use at the end

#

I have a flash 2.5 version on my watch now.

#

let's see how this goes

#

interestingly I am seeing it hang after it responds

#

which appears to be because google is having problems

#
2025/04/19 17:53:10 find lies failed: Error 503, Message: The model is overloaded. Please try again later., Status: UNAVAILABLE, Details: []
#

ooh, I crashed my watch again

#

I have now had it hang

#

but in this case it's due to a fun bug where if the watch crashes and then you launch the same app again, you get attched to the previous instance of it

#

and it doesn't like the state loss

urban solstice
#

I reckon the conversation shouldn't timeout if it's not idle; this change, to me, feels a little on the "hacky patch" side, but also I don't have any concrete objection. What say you?

static void prv_timed_out(SessionWindow* sw) {
  if (!conversation_is_idle(conversation_manager_get_conversation(sw->manager))) {
    return;
  }
  BOBBY_LOG(APP_LOG_LEVEL_DEBUG, "Timed out");
  window_stack_pop(true);
}
karmic lion
#

This is true, though a response also shouldn't take sixty seconds

urban solstice
#

Agreed πŸ˜†
Happy to leave the point be, just finding excuses to prod and poke for best practices in the codebase

novel fiber
# karmic lion in which app?

It could be in Bobby. And on the Rebble account page it might be an idea to add some information when you are subscribing.

south edgeBOT
south edgeBOT
karmic lion
#

Weirdly, when I run bobby locally, the lie detector is getting UNAVAILABLE errors from Google

#

but when I run it in production, it's fine

#

anyway now it won't spend more than 1.5 seconds waiting for a verdict on whether it lied

#

(the P99 response time is 600ms)

urban solstice
karmic lion
#

Hm

#

Double quotes seem okay

#

And single quotes I guess.

#

If you can get bobby's logs that'd be helpful

#

I assume you can given you have screenshots

#

(make sure you redact the logged query URL, which has both your authentication token and your exact location in it)

urban solstice
# karmic lion If you can get bobby's logs that'd be helpful

|| Not too bothered about my location, I'm leaving Japan tomorrow 😒 ||

[15:46:50] pkjs> Bobby:392 loadScript /data/user/0/com.getpebble.android.basalt/app_js_app_files/1d272bb4-cf00-4e3e-a7f3-7394309e0341/pebble-js-app.js
[15:46:50] pkjs> Bobby:372 signalLoaded
[15:46:50] pkjs> Bobby:374 inside try-bridge-active
[15:46:50] pkjs> Bobby:383 signalLoaded (finalized)
[15:46:50] pkjs> Bobby:177 Bobby 1.3.0
[15:46:50] pkjs> Bobby:185 Entering real mode.
[15:46:50] pkjs> Bobby:1865 Fetching quota from https://bobby-api.rebble.io/quota?token=heeheehoohoo
[15:46:50] pkjs> Bobby:225 Cached location restored: (35.6648153, 139.7559956)
[15:46:51] pkjs> Bobby:1871 Got quota response: {"hasSubscription":true,"remaining":72719327,"used":7280673}
[15:46:52] pkjs> Bobby:231 position updated: (35.6647929, 139.7560164)
[15:47:01] pkjs> Bobby:236 failed to JSON.parse data passed in
[15:47:01] pkjs> Bobby:129 Inbound app message!
[15:47:01] pkjs> Bobby:130 {"isTrusted":false,"payload":{},"data":{}}
#

Bobby:236 failed to JSON.parse data passed in
is confusing; there's no console log (or relevant other cause) at that location in pebble-js-app.js yet the other mentioned lines do correlate

karmic lion
#

Oh is this going to be another stupid android app JavaScript bridge bug

urban solstice
#

Yeaaaah sure looks like it

karmic lion
#

What is on that line?

urban solstice
#

Prompt is just missing in the "Spell "Tokyo" ..." case

karmic lion
#

I feel like I've run into this already actually

urban solstice
#

Pretty sure it's some internal js library, not bobby

karmic lion
#

Yeah

#

Ohh

#

Right

#

#1345564272289120296 message

urban solstice
#

Ooo! Lovely.

karmic lion
#

I proceeded to ignore it because I'd never seen the transcription generate quotes anyway

#

(I ran into it making the example queries)

urban solstice
#

Man, that's a really, really annoying bug

karmic lion
#

The android app's JS bridge is super jank

urban solstice
#

It's clearly genuinely on another thread, too (which shouldn't be possible for JS [of that era])

karmic lion
#

And also constructs JSON by string concatenation for some reason

#

I don't think it's on another thread, it's just happening elsewhere and in further jank the android app doesn't report the filenames

#

It's actually just loaded into a browser so it shouldn't have magic

#

(now pypkjs actually did inadvertently multithread JavaScript until I added a proper event loop)

urban solstice
acoustic wolf
#

can you force transcription to generate double quotes somehow?

karmic lion
#

I suspect Steffan is not using Rebble asr

#

I probably have to completely ridiculously escape the double quotes in C

#

Which will break on all other implementations

#

Grr.

acoustic wolf
#

wait I need to try this

urban solstice
#

I was literally about to implement a real dirty "replace " with β€œ" fix

#

I think sending a "double-quote lookalike" to the backend might be an acceptable bodge

#

Though pretty sure the transcription response is a plain C string isn't it

karmic lion
#

It is

urban solstice
#

Womp womp

karmic lion
#

For your sanity and also to avoid reallocations you'd probably want to replace them with something that fits in a single byte

urban solstice
#

Yeah exactly

karmic lion
#

Single quotes are probably fine

#

The LLM can deal with the ambiguity

urban solstice
#

Yeah

urban solstice
karmic lion
#

I would probably put it in util/strings.c or something

#

strings_fixup_double_quotes?

urban solstice
#

strings_fix_android_bridge_bodge? (I was going to call it strings_replace_all_char but if you prefer a business-logic-oriented name this is more pleasing to my tongue xD)

#

Love a good bodge with spinning lights on it

karmic lion
#

Sure

#

Actually calling it will be fun

#

Probably have to allocate something anyway, it's const char* all the way down

#

(and sometimes it has string literals passed in)

urban solstice
#

Delightful

karmic lion
#

Maybe have the method return a new string, call it from conversation_manager_add_input, pass it to the appmessage, then free it

#

As a bonus, the user still sees the prettier one.

urban solstice
#

That's what I was thinking too! I assumed there's no β€œ glyph; but it would never matter 'cause it's just for transmit (still doing ' now tho)

#

I'll add the Google copyright header to strings

karmic lion
#

You should probably add your own unless you're assigning your copyright to Google.

urban solstice
#

I can just free() the pointer from bmalloc(), yeah?

acoustic wolf
#

I cannot make transcription generate a response with double quotes

#

meh

#

oh wait do I need to get Gemini to create a response with quotes?

urban solstice
acoustic wolf
karmic lion
#

Hurrah

acoustic wolf
#

why is it doing this to me

karmic lion
#

Yeah it does that

#

I don't understand why, it's the most useless possible way to handle spoken punctuation

#

I can't postprocess it to turn it into real punctuation because I don't know where the spaces should go

acoustic wolf
#

Gemini seems to repeat everything even if you start a new instance apparently

#

fun

karmic lion
#

Yes

acoustic wolf
#

anyway quotes work here apparently, that's fun

#

or maybe I'm testing it wrong

#

now the transcription is pissing me off

#

how do you have quotes in transcription

urban solstice
#

No idea! Maybe it's my speech cadence and/or accent.

acoustic wolf
#

I should try changing language

karmic lion
#

You also missed the license header on the implementation

#

Probably there should be a linter for this sort of thing.

urban solstice
#

Sure, can do. Was following similar examples in the codebase WRT impl. header!

karmic lion
#

Where those are there it is an error πŸ˜„

#

All the files should have an Apache 2 header

#

The "created by" is my IDE's default

urban solstice
#

Alright, done! Force-pushed because that's a lesser sin than fixup commits πŸ‘Ό

south edgeBOT
karmic lion
#

hurrah

urban solstice
#

πŸ₯³

#

Ah, just as I was packing up - realised I should probably check for other instances of transcription -> phone

#

It's a two line change, I can make have made a pull request but I figure less faff if you do it. Bonus, in this case no alloc πŸ˜†

barren raptor
karmic lion
#

Sadly it remains the case that I'm basically out of space

acoustic wolf
#

I wonder how much the rodata and text segments contribute to your app space

wooden wedge
#

time to do streaming of content of the view from the phone

#

to avoid storing all the conversation all the time

acoustic wolf
#

remove the disclaimers on first app start and send them from the phone

karmic lion
#

Way ahead of you

#

All nontrivial text blocks are read in from resources when needed

south edgeBOT
blazing verge
#

Hi everyone! I tried to use Bobby in Russian, but after a voice request, the app freezes every time and the watch reboots. Just so you know

karmic lion
#

I think it has previously been mentioned that the Russian language pack causes the watch to crash here

#

Unfortunately there is probably nothing we can do about it

blazing verge
#

I thought as much. in any case, you are great guys. thanks for the answer πŸ™‚

wooden wedge
#

I am still very interested why that is, it seems so random

karmic lion
#

These emails are always fun.

urban solstice
#

Just, flawless presentation, truly
I especially love the automatic hyperlinks

karmic lion
#

Is Bobby working for anyone else?

#

I get server errors.

#

Oh I probably have a build pointing at my desktop

acoustic wolf
#

works here

barren raptor
#

for some reason when I ask Bobby a question in german it seems to get stuck on the 3 dots loading thingy

#

it doesn't crash, but it just never seems to get a response

obtuse oriole
#

Working here.

karmic lion
#

Yeah I figured

#

Sadly I have no good way to install the production version

#

Once you sideload an app you had installed from the appstore you then can't install it from the appstore again because it doesn't know you uninstalled it (this is android specific; iOS does remove it from your locker when you do this)

#

So I can't add it from the store without database prodding

#

I can't sideload it by opening the pbw because that's broken in modern Android

#

Oh well, a problem for later

karmic lion
wooden wedge
#

apkmirror should have it

karmic lion
#

But sideloading phone apps is also forbidden

wooden wedge
#

didn't you have to sideload the pebble app?

karmic lion
#

I can do it with adb but that is more hoop jumping than I'm up for.

wooden wedge
#

fair

karmic lion
#

If I were in a position to use adb I'd also be in a position to use the pebble tool

wooden wedge
#

fair

karmic lion
#

Also why is this still a problem

wooden wedge
#

nobody resolved it on play store side

#

I think it can only be done by admins there

#

which is annoying

karmic lion
#

I think it requires a) being a play store admin, and also b) probably being a member of the entity Google wants to verify

#

Since I am neither a nor b this is beyond my capabilities.

#

I do enjoy the implication that if we had ever shipped cobble it would probably have ceased to exist after a year because nobody filled out the existing paperwork

wooden wedge
#

yeah, I think lav tried getting it fixed, but was unable to for both reasons

#

and admins seem too busy for it

karmic lion
#

Who even are they?

#

Is it just ishotjr?

wooden wedge
#

ishotjr I think

#

I'm unaware of anyone else

karmic lion
edgy flame
#

yeah it has to specifically be the owner of the google developer account

#

so him

shell jetty
karmic lion
#

I generally agree actually - I think apps are mostly the wrong thing for pebbles. Certainly apps that take more than one button input.

#

with occasional exceptions like long-running control tasks (e.g. music)

#

(I also think this about other smartwatches)

edgy flame
#

i largely agree

shell jetty
#

yeah i think that was what apple eventually learned as well, watch apps are typically not super useful

karmic lion
#

also whenever I do launch an app I'm annoyed when I look at my watch half an hour later and it's still there

#

"I stopped caring about this half an hour ago, what time is it?"

shell jetty
#

apple has an option for that, i guess pebbles never did (i think it's called "return to clock" and can be set to 30min, 1hr, or never)

edgy flame
#

wear os I feel is a little too aggressive about returning to the watch face

shell jetty
#

i actually turned it off, if i started an app i want it to stay there until i explicitly quit

edgy flame
#

it would be a good default behavior for pebble

karmic lion
#

Wear OS doesn't actually return to the watch face

#

it just shows an overlay of the clock over the app

#

but the app is still there when you activate the watch again

#

I mostly find this annoying.

#

for the opposite reason

shell jetty
#

time to DEMAND that product copy the return to clock function

karmic lion
#

the watch should just read my mind and figure out when I forget about the task I started

edgy flame
#

ah yeah i was wrong about that

karmic lion
#

(apps can actually supersede that overlay, it's just the default ambient mode experience)

#

you get that when the watch is saving power by not running the main CPU.

edgy flame
#

OnePlus has a dumb behavior that is much more annoying: it doesn't blur or dim the app you're using, it instead has a generic blur-looking color effect that is the same every time