📦 Liis17/BarkFluff [dev]
👤 Liis17
📂 Windows
└ BarkFluff.Client.Core ✅5 ✏️2
👤 Liis17
feat(winui): port the message markdown dialect to the Core layer
Android and the web client both render message text as markdown, while
WinUI shows the raw source. Port the same dialect into BarkFluff.Client.Core
as a UI-free parser so the WinUI renderer and the plain-text previews can
share it.
Rules and their order follow MarkdownRenderer.kt: inline code is protected
first, then html tags, bold, strike, italic, links and bare-url autolinking.
Bold with stars takes the web variant of the pattern, because the Android
...
📂 Windows
└ BarkFluff.Client.Core ✅5 ✏️2
📦 Liis17/BarkFluff [dev]
👤 Liis17
📂 /
├ .editorconfig ✅1
└ .gitignore ✏️1
📂 Backend
└ BarkFluff.Web ✅9 ✏️10
📂 .github
└ workflows ✏️1
📂 Obsidian
└ ClaudeVault ✏️1
👤 Liis17
Merge branch 'dev' of Liis17/BarkFluff into dev
📂 /
├ .editorconfig ✅1
└ .gitignore ✏️1
📂 Backend
└ BarkFluff.Web ✅9 ✏️10
📂 .github
└ workflows ✏️1
📂 Obsidian
└ ClaudeVault ✏️1
📦 Liis17/BarkFluff [dev]
👤 Liis17
📂 Windows
├ BarkFluff.Client.WinUI ✅1 ✏️1
└ BarkFluff.Client.Core ✏️1
👤 Liis17
feat(winui): render message markdown in the chat bubble
MarkdownTextBlock turns the parsed document into a visual tree: headings,
lists and rules go into RichTextBlock, while quotes, code blocks, tables
and html images need their own containers, the same way the Android
renderer builds separate views.
Each line is its own RichTextBlock so the inline-code highlight ranges are
counted within a single paragraph. Plain messages skip the tree entirely
and get a single TextBlock, which keeps the virtualized feed cheap.
...
📂 Windows
├ BarkFluff.Client.WinUI ✅1 ✏️1
└ BarkFluff.Client.Core ✏️1
📦 Liis17/BarkFluff [dev]
👤 Liis17
📂 Obsidian
└ ClaudeVault ✏️1
👤 Liis17
docs(obsidian): describe markdown rendering in the WinUI bubbles
📂 Obsidian
└ ClaudeVault ✏️1
📦 Liis17/BarkFluff [dev]
👤 Liis17
📂 Windows
└ BarkFluff.Client.WinUI ✏️1
👤 Liis17
fix(winui): scale html image height when its width is clamped
📂 Windows
└ BarkFluff.Client.WinUI ✏️1
📦 Liis17/BarkFluff [dev]
👤 Liis17
📂 Android
└ core ✅6 ✏️1
👤 Liis17
Add variant-aware TLS transport foundation
📂 Android
└ core ✅6 ✏️1
📦 Liis17/BarkFluff [dev]
👤 Liis17
📂 Android
├ Barkfluff.Client.Android ✅3 ✏️10
└ core ✏️3
👤 Liis17
Route Android clients through TLS policy
📂 Android
├ Barkfluff.Client.Android ✅3 ✏️10
└ core ✏️3
📦 Liis17/BarkFluff [dev]
👤 Liis17
📂 Android
├ core ✅1 ✏️2
└ Barkfluff.Client.Android ✏️7
👤 Liis17
Add self-signed node certificate approval
📂 Android
├ core ✅1 ✏️2
└ Barkfluff.Client.Android ✏️7
📦 Liis17/BarkFluff [dev]
👤 Liis17
📂 Android
└ Barkfluff.Client.Android ✏️1
📂 Obsidian
└ ClaudeVault ✏️1
👤 Liis17
Document Android TLS trust policy
📂 Android
└ Barkfluff.Client.Android ✏️1
📂 Obsidian
└ ClaudeVault ✏️1
📦 Liis17/BarkFluff [dev]
👤 Liis17
📂 Android
├ Barkfluff.Client.Android ✅1 ✏️4
└ core ✅4 ✏️5
📂 Obsidian
└ ClaudeVault ✏️1
👤 Liis17
Harden TLS endpoint refresh and coverage
📂 Android
├ Barkfluff.Client.Android ✅1 ✏️4
└ core ✅4 ✏️5
📂 Obsidian
└ ClaudeVault ✏️1
📦 Liis17/BarkFluff [dev]
👤 Liis17
📂 Android
└ core ✏️3
👤 Liis17
Isolate cleartext gRPC to debug policy
📂 Android
└ core ✏️3
📦 Liis17/BarkFluff [dev]
👤 Liis17
📂 Android
├ core ✅2 ✏️5 ❌2
└ Barkfluff.Client.Android ✏️9
📂 Obsidian
└ ClaudeVault ✏️1
👤 Liis17
Cover TLS variants and bound node refresh
📂 Android
├ core ✅2 ✏️5 ❌2
└ Barkfluff.Client.Android ✏️9
📂 Obsidian
└ ClaudeVault ✏️1
📦 Liis17/BarkFluff [dev]
👤 Liis17
📂 Windows
├ BarkFluff.Client.Core ✅5 ✏️2
└ BarkFluff.Client.WinUI ✅1 ✏️1
📂 Obsidian
└ ClaudeVault ✏️1
👤 Liis17
Merge branch 'dev' of Liis17/BarkFluff into dev
📂 Windows
├ BarkFluff.Client.Core ✅5 ✏️2
└ BarkFluff.Client.WinUI ✅1 ✏️1
📂 Obsidian
└ ClaudeVault ✏️1
✅ Сборка успешна
📱 Android Client v0.0.114 beta
📌 Ветка:
🔗 Коммит:
👤 Автор: Liis17
📱 Android Client v0.0.114 beta
📌 Ветка:
dev🔗 Коммит:
09b4a8b2c05829c702d67225fda030e262afc686👤 Автор: Liis17
📦 Liis17/BarkFluff [claude/message-forward-reply-2qiobx]
👤 claude
📂 Backend
└ BarkFluff.Messages ✅2 ✏️3
📂 Android
└ core ✏️2
📂 Shared
└ BarkFluff.Proto ✏️2
👤 claude
feat(messages): separate reply from forward in schema and contracts
Reply and forward were the same thing on the backend: both travelled through
OutgoingMessage.forwarded_message_id and were stored as a ForwardedMessage
attachment holding a snapshot of the original. Clients told them apart with a
heuristic ("is the original in the currently loaded page?"), which misrenders a
reply as a forward once the history scrolls away.
Introduce the schema and contracts for a real split:
...
📂 Backend
└ BarkFluff.Messages ✅2 ✏️3
📂 Android
└ core ✏️2
📂 Shared
└ BarkFluff.Proto ✏️2
📦 Liis17/BarkFluff [claude/message-forward-reply-2qiobx]
👤 claude
📂 Backend
└ BarkFluff.Messages ✅2 ✏️5
📂 Shared
└ BarkFluff.Shared.Exceptions ✅2
👤 claude
feat(messages): send replies by reference and forward several messages at once
SendMessage now distinguishes the two actions instead of funnelling both through
one field:
- reply_to_message_id is validated and stored on Message.ReplyToMessageId. No
snapshot is taken, so the quote stays live.
- forwarded_message_ids accepts up to 20 originals and keeps the client's order
in ForwardedOrder. Each snapshot now records the original's chat, sender and
send time.
...
📂 Backend
└ BarkFluff.Messages ✅2 ✏️5
📂 Shared
└ BarkFluff.Shared.Exceptions ✅2
📦 Liis17/BarkFluff [claude/message-forward-reply-2qiobx]
👤 claude
📂 Backend
└ BarkFluff.Messages ✅1 ✏️10
📂 Tests
└ BarkFluff.Messages.Tests ✏️6
👤 claude
feat(messages): resolve reply previews on read instead of snapshotting them
A reply now carries only a reference, so the quote has to be built when the
message is read. ReplyPreviewResolver does that for a whole page at once: one
database query for the originals and one Users batch for the names, regardless
of how many replies the page contains.
This is what the split buys. Editing the original updates every quote of it, and
deleting the original hides its text — previously the snapshot inside the
replying message outlived the deletion and kept the content visible.
...
📂 Backend
└ BarkFluff.Messages ✅1 ✏️10
📂 Tests
└ BarkFluff.Messages.Tests ✏️6
📦 Liis17/BarkFluff [claude/message-forward-reply-2qiobx]
👤 claude
📂 Backend
├ BarkFluff.Federation ✅1 ✏️2
└ BarkFluff.Messages ✅1 ✏️4
📂 Shared
├ BarkFluff.Shared.Exceptions ✅1
├ BarkFluff.Proto ✏️2
└ BarkFluff.Shared.Queue ✏️1
👤 claude
feat(federation): replicate replies and forwards across nodes
NewMessagePayload carried only text and attachments, so a reply or a forward
sent in a federated DM arrived on the partner node as a bare message with the
quote silently dropped.
A reply travels as the origin's federated uuid, not the local id — each node
assigns its own Messages.Id to its copy. On import the uuid is resolved back to
a local id. If the original has not been imported yet, the message is stored
without the quote rather than retried: a gap in the history is for catch-up to
...
📂 Backend
├ BarkFluff.Federation ✅1 ✏️2
└ BarkFluff.Messages ✅1 ✏️4
📂 Shared
├ BarkFluff.Shared.Exceptions ✅1
├ BarkFluff.Proto ✏️2
└ BarkFluff.Shared.Queue ✏️1
📦 Liis17/BarkFluff [claude/message-forward-reply-2qiobx]
👤 claude
📂 Tests
└ BarkFluff.Messages.Tests ✅4 ✏️1
👤 claude
test(messages): cover the reply/forward split
The forward branch of SendMessage had no direct coverage before this change, so
the split went in on top of untested code. These tests pin both the new
behaviour and the compatibility promise.
- Reply stores a reference: no snapshot attachment is produced.
- Replying across chats or to a deleted message is rejected, indistinguishably,
so message ids cannot be probed.
- The preview follows the original: it shows edited text, and a deleted original
...
📂 Tests
└ BarkFluff.Messages.Tests ✅4 ✏️1
📦 Liis17/BarkFluff [claude/message-forward-reply-2qiobx]
👤 claude
📂 Android
├ Barkfluff.Client.Android ✏️5
└ core ✏️1
👤 claude
feat(android): render replies from the server field, forward in batches
MessageAdapter decided whether a quote was a reply or a forward by asking
whether the original happened to be in the currently loaded page. Scrolling the
history away turned a reply into a forward, and forwarding inside the same chat
looked like a reply. That guess is gone: the server now says which it is.
- MessageItem carries replyTo; the quote is bound from it.
- A deleted original renders as "message deleted" with no text, no author and no
jump target, matching what the server withholds.
...
📂 Android
├ Barkfluff.Client.Android ✏️5
└ core ✏️1
📦 Liis17/BarkFluff [claude/message-forward-reply-2qiobx]
👤 claude
📂 Backend
└ BarkFluff.Web ✏️6
👤 claude
feat(web): render replies from the server field, forward in batches
messages.js decided reply-vs-forward by asking whether the original was in the
set of currently loaded message ids, so a reply became a forward once the
history scrolled away. The renderer now reads msg.replyTo.
- api.js maps ReplyInfo and the enriched forward snapshot, and sends
reply_to_message_id / forwarded_message_ids instead of the old single field.
- A deleted original renders as "message deleted" with no text and no jump
target, matching what the server withholds.
...
📂 Backend
└ BarkFluff.Web ✏️6