Model Library is fully implemented now!
Model Library is fully implemented now!
Now model choosing is available
Multi-model downloading now enabled!
Did some algorithm efficienticising for a more balanced algorithm! More details to come…
Model suggestions are ready!
Tried to use WebLLM; reverted. Coding binge
Error handling and basic chat finalised
Major updates to Astilbe! More info to come when core functionality is implemented and I have time to start recordign detailed devlogs.
Updates to come when my devlogs are formatted properly in ~3 days
More updates to come soon
(I definitely did not rewrite the entire architecture)
I added an inspirational message at the start.
Also i realised that app.js was so messy and approaching 2000 lines so I did major reformatting and restructuring.
Nothing much else was added, but I did do some stylistic edits to make the UI more approachable and remove the dumb gradients and stuff like that.
Hello everybody! @yf here with the third devlog. Thankfully, there was not much change to the project purpose (phew) so I can jump straight into what I did. A quick snapshot: I implemented a working settings panel that allows users to customise their experience and saves it to a temp file in the app via tauri-plugin-store.
I:
temperature (float, 0.0-1.0)top_p (float, 0.0-1.0)top_k (int, 1-100)streaming (bool, true/false)thinking (bool, true/false)theme (string, not implemented yet)options structured in the following way:{
"temperature": 0.7,
"top_p": 0.9,
"top_k": 40,
"streaming": true,
"thinking": true,
"theme": "default",
"model": "Qwen3.5:0.8/2/4B"
}
(i.e.)
Then, I ditched yet again the rust backend message structure to make way for this new chat structure. I basically added a new key-value pair to the ChatMessage struct, which is options: ChatOptions, and fed it into ollama by flattening it using serde’s flatten attribute, structured the same way as the json above. Models cannot be changed as of the moment.
Made the settings panel collapsible via the simple classList toggling.
Implemented a simple tauri-plugin-store to save the settings to a temp file in the app, and then read it back on app start. This allows users to have their settings persist across sessions.
Of course, to truly streamline the user experience, I will have to install Ollama with the application. My next priorities are:
Hello everybody! I’m back very quickly with the second devlog. As promised, Oh! Chat is:
IN THE MODERN DIGITAL AGE, it has become increasingly difficult to control one’s exposure to the internet, regardless of how reserved one may be or what precautions one may take. With the advent of the large language model era, where people could discuss confidential information with chatbots, this problem - our inability to control the flow of our own data, relying on vague promises of ‘privacy’ that cloud-based services claim but never prove - has become more relevant than ever. Oh! Chat aims to combat this by giving users the premium UX that one experiences on existing AI chatbot applications and interfaces, retaining as much AI functionality as possible, while facilitating user operation, installation, and guaranteeing data privacy. (from a readme draft)
Anyhow, let’s get to the point. Since we want everyday users to feel comfortable, we want to replicate the experience of existing AI chatbots. An important part of this is the text streaming feature, which allows users to see the response as it is being generated: a typing-like effect, and it is also a good method to verify that the model is working. This is what I did in this devlog.
I:
match request.await. This is because the await means we have to WAIT for the entire response to output before continued function execution (which is unideal).reqwest::Client to send a POST request to the Ollama instance, and then we use response.bytes_stream() to get a stream of bytes from the response. We then iterate over the stream using while let Some(chunk) = stream.next().await, and each chunk we convert it to a string and send it back to the frontend using emit_all("chunk", chunk_str). And the client gets it in real time via the listen("chunk", (event) => { ... }) function as an initialised await in main.js. Finally, at the end of the response, a rust event response_end is emitted, and the frontend can accordingly adjust. A very simple implementation, but it works effectively.readme.I plan on:
Anyhow, thanks for reading! Watch for the next devlog.
Hello everybody! This is the very first devlog for Oh! Chat.
Well, we have to begin somewhere, right? And for us, we begin in this devlog. For the first entry, I can’t really expect not to do all the dirty work of setting up, dependency checking, and all the other mess that comes with starting. A quick overview: I built the initial bridge between front/backend, and established communication with the local Ollama instance.
Also, a personal goal for me: maintain a level of professionalism when logging devlogs (so no more heavy slang, etc.).
(Due to word limits please refer to the next devlog)
Let’s first talk about what we needed to finish before we could even start.
Qwen3.5:0.8/2/4B models for testing, as excellent edge models for testing.We now pivot to what I did in the first devlog:
Environment & Project Initialization
Frontend Layout & Boilerplate Architecture
main.js to the backend via invoke and listen commands.Local IPC & The Ollama Localhost Bridge
localhost:11434 (the Ollama api server address for the local instance) to talk directly to the local Ollama instance running on the host machine with reqwest and tokio async libraries.:
check_status: checks status (obviously)send_msg(message: ChatMessage): sends a message to the Ollama instance and sends the response back directly using match request.await to handle the response as a single coherent string. (This is temporary for the moment as I will be implementing streaming soon).role: String, message: String. We use serde to serialize and deserialize the JSON data sent to and from the Ollama instance.Well, there’s a lot to do. I have not yet done a lot of stuff, and I have many priorities with respect to this application, so I won’t be able to describe to you what I will do next; I guess you can just wait for the next devlog. But I can say that the following will definitely be likely to be done in the next update:
readme.Anyhow, thanks for reading and I hope you are eager for the next devlog (Cause I am!)
(new features)
(Bug fixes)
(to fix)
(added)
(new bugs)
No bug fixes for this update unfortunately. I know in the last one I said there would be an intermediate minor update for bug fixes but I guess I made this instead. Next time, I probably (?) will fix the bugs.
(added):
(Bug fixes)
(new bugs)
Sorry for the long delay, but I think it was worth it. I aim to improve the gas giant shader by adding localised spiral storms and etc. and fix the above bugs for the next devlog and minor update. Heck, I have plans for this to become a game now, given its satisfactory results: stay tuned!
(Bug fixes)
Next step: more planet typessss, for the next big update. I will begin versioning now and I have edited my previous devlogs to reflect this.
C y’all very soon!