Skip to content

🎨 Enhanced Visual Diff System for Card Description Changes (Resolves #7201)#7212

Open
LexioJ wants to merge 5 commits into
nextcloud:mainfrom
LexioJ:feature/visual-diff-7201-v1.15.2
Open

🎨 Enhanced Visual Diff System for Card Description Changes (Resolves #7201)#7212
LexioJ wants to merge 5 commits into
nextcloud:mainfrom
LexioJ:feature/visual-diff-7201-v1.15.2

Conversation

@LexioJ

@LexioJ LexioJ commented Sep 6, 2025

Copy link
Copy Markdown

🎯 Overview

This PR introduces a comprehensive visual diff system that transforms how card description changes are displayed in the activity feed, making it easier for users to understand what exactly changed in their content.

Resolves #7201

✨ Features

🔍 Smart Change Detection

  • Intelligent Move Detection (🚚): Identifies when lines are relocated without modification
  • Word-Level Modifications (✏️): Highlights specific word changes within lines using combined <del>/<ins> HTML tags for cleaner output
  • Clean Additions/Deletions (✨/🗑️): Clear indicators for new or removed content
  • Checkbox State Tracking: Special handling for task list changes with visual emoji transitions
  • Quote Line Handling: Properly formats blockquotes with ❞ emoji (fixes &gt; display issues)
  • Callout Block Transitions: Shows emoji transitions for callout type changes (ℹ️→❗, ✅→⚠️, etc.)
  • Code Block Indicators: Displays code block markers with ‹› symbol

🎭 Professional Visual Indicators

  • 🚚 Move operations: "🚚5 Line content (from 2)"
  • ✏️ Modifications with combined tags: "✏️3 Old contentNew content"
  • Additions: "✨2 New content"
  • 🗑️ Deletions: "🗑️4 Removed content"
  • Special Line Types:
    • Checkboxes: "☑️→🔲" or "🔲→☑️"
    • Callouts: "ℹ️→❗" (info to error)
    • Quotes: "→❞ Quoted text"
    • Code blocks: "→‹›"

🧠 Intelligent Filtering & Optimization

  • Filters out unchanged content to reduce noise
  • Ignores empty line operations that don't add value
  • Combines consecutive <ins> and <del> tags to reduce visual clutter
  • Merges whitespace between tags for cleaner output (e.g., <del>text 1 text 2</del> instead of <del>text 1</del> <del>text 2</del>)
  • Provides line number context for better orientation
  • Activity feed compatible: Uses plain text formatting that displays correctly without HTML escaping issues

🛠 Technical Implementation

Core Components

  1. DiffService: Service implementing LCS-based diff algorithm with multi-pass detection
  2. Enhanced DeckProvider: Updated activity provider with dependency injection for DiffService
  3. Smart Algorithm Flow:
    • Pass 1: Content analysis and operation extraction
    • Pass 2: Move detection (exact matches at different positions)
    • Pass 3: Modification detection with special line handling:
      • Checkbox state changes
      • Callout block type changes
      • Quote line changes (prevents &gt; issues)
    • Pass 4: Word-level diff with combined HTML tags
    • Pass 5: Remaining operations (pure adds/deletes)

Algorithm Highlights

  • Longest Common Subsequence (LCS) for optimal diff detection
  • Similarity scoring system for intelligent operation pairing
  • Multi-pass processing ensures accurate classification
  • Tag combination logic merges consecutive <ins>/<del> tags and whitespace-only keep operations
  • HTML-safe output compatible with Nextcloud's activity feed constraints

Activity Feed Compatibility Fixes

  • Removed reliance on HTML rendering in activity feed
  • Special handling for > character to prevent &gt; display issues
  • Quote lines detected and formatted with emoji before HTML escaping
  • All special patterns handled with plain text + emoji approach

📸 Visual Examples

Word-Level Changes

Before: John Doe changed the description
After: ✏️2 Update <del>deadline</del><ins>timeline</ins>

Checkbox Changes

Before: John Doe changed the description
After: ✏️1 🔲→☑️ Task completed

Callout Block Changes

Before: John Doe changed the description
After: ✏️5 ℹ️→❗

Quote Changes

Before: John Doe changed the description (displayed as &gt; text)
After: ✏️3 →❞ Important note

Combined Tags (Cleaner Output)

Before: ✏️5 <del>```</del><ins>-</ins><ins> </ins><ins>[x]</ins><ins> </ins><ins>ToDo</ins><ins> </ins><ins>1</ins>
After: ✏️5 <del>```</del><ins>- [x] ToDo 1</ins>

🧪 Testing

Extensively tested with various scenarios:

  • ✅ Simple line moves and modifications
  • ✅ Complex multi-operation changes
  • ✅ Checkbox state transitions
  • ✅ Callout block type changes (info, success, warn, error)
  • ✅ Quote line handling and &gt; fix
  • ✅ Code block markers
  • ✅ Empty content and edge cases
  • ✅ Large content blocks and performance
  • ✅ HTML tag combination and whitespace merging
  • ✅ Activity feed compatibility (no more escaped HTML)

🚀 Benefits

For Users

  • Clear Understanding: See exactly what changed in card descriptions
  • Reduced Cognitive Load: Filter out noise, focus on meaningful changes
  • Better Context: Line numbers and move tracking provide better orientation
  • Professional Presentation: Clean, modern emoji-based indicators
  • Proper Quote Display: No more &gt; characters in activity feed
  • Cleaner Diff Output: Combined HTML tags reduce visual clutter

For Developers

  • Maintainable Code: Clean service architecture with separation of concerns
  • Dependency Injection: Proper DI container registration for DiffService
  • Extensible Design: Easy to extend for other content types
  • Performance Optimized: Efficient algorithms with minimal overhead
  • Backward Compatible: Existing functionality remains unchanged
  • Activity Feed Safe: Handles all HTML escaping edge cases

🔧 Configuration

No configuration required - the feature works out of the box with existing Deck installations.

📋 Changelog

Latest Updates

  • Quote Line Handling: Fixed &gt; display issues in activity feed for quote lines
  • Combined HTML Tags: Reduced visual clutter by merging consecutive <ins>/<del> tags
  • Whitespace Merging: Improved tag combination to include whitespace between add/remove operations
  • Updated Emojis:
    • Error callout: 🔴 → ❗ (better matches UI)
    • Quote blocks: 💬 → ❞ (quotation mark)
    • Code blocks: 📝 → ‹› (guillemets)
  • Dependency Injection: Proper DI registration for DiffService

Code Review Feedback Addressed

  • Copyright year updated to 2025
  • Checkbox pattern extracted as class constant
  • Unused parameters removed
  • DiffService properly registered in DI container
  • Consistent line numbering (shows actual line numbers from content)
  • Activity feed compatibility verified and fixed

🤝 Contributing

This implementation focuses on card description changes but the DiffService architecture is designed to be extensible for other content types in the future.


This PR represents a significant enhancement to user experience by providing clear, actionable insights into content changes while maintaining the professional quality expected from Nextcloud applications.

@LexioJ LexioJ force-pushed the feature/visual-diff-7201-v1.15.2 branch 2 times, most recently from f83b4b9 to 8b42605 Compare September 6, 2025 18:16
@putt1ck

putt1ck commented Sep 7, 2025

Copy link
Copy Markdown

Looks interesting. Does it also address #7058?

@LexioJ

LexioJ commented Sep 7, 2025

Copy link
Copy Markdown
Author

Looks interesting. Does it also address #7058?

Hard to tell as issue #7058 seems to discuss the overall appearance within the activity app and a wrong description notification when only comments were made.

This PR indeed addresses the need to reduce bloating the activity log, but only within the activity tab of the corresponding card. It focuses on the deck app itself.

@marcoambrosini marcoambrosini self-requested a review September 12, 2025 10:33
@LexioJ LexioJ force-pushed the feature/visual-diff-7201-v1.15.2 branch 7 times, most recently from b5f9e4b to 86df615 Compare September 19, 2025 14:09
@LexioJ LexioJ force-pushed the feature/visual-diff-7201-v1.15.2 branch from 86df615 to e8b1112 Compare September 20, 2025 05:24
@github-actions

Copy link
Copy Markdown
Contributor

Hello there,
Thank you so much for taking the time and effort to create a pull request to our Nextcloud project.

We hope that the review process is going smooth and is helpful for you. We want to ensure your pull request is reviewed to your satisfaction. If you have a moment, our community management team would very much appreciate your feedback on your experience with this PR review process.

Your feedback is valuable to us as we continuously strive to improve our community developer experience. Please take a moment to complete our short survey by clicking on the following link: https://cloud.nextcloud.com/apps/forms/s/i9Ago4EQRZ7TWxjfmeEpPkf6

Thank you for contributing to Nextcloud and we hope to hear from you soon!

(If you believe you should not receive this message, you can add yourself to the blocklist.)

@LexioJ LexioJ force-pushed the feature/visual-diff-7201-v1.15.2 branch 8 times, most recently from 2a58b7c to 40315b9 Compare September 28, 2025 05:36
@LexioJ LexioJ force-pushed the feature/visual-diff-7201-v1.15.2 branch from 40315b9 to 0f5ec86 Compare September 29, 2025 21:34

@luka-nextcloud luka-nextcloud left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for your contribution. The line number seems incorrect.

image image

Comment thread lib/Activity/DeckProvider.php Outdated
$this->l10nFactory = $l10n;
$this->config = $config;
$this->cardService = $cardService;
$this->diffService = new DiffService();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The DiffService can be inject via the constructor instead of instantiating it directly

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Year in copyright text should be 2025

Comment thread lib/Service/DiffService.php Outdated
*/
private function isCheckboxChange(string $oldLine, string $newLine): bool {
// Pattern for markdown checkboxes: - [ ] or - [x] or - [X]
$checkboxPattern = '/^(\s*-\s*)\[([ xX])\](.*)/i';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The checkbox pattern can be defined as a constant to avoid duplicate code

Comment thread lib/Service/DiffService.php Outdated
* @return string
*/
private function generateCheckboxDiff(string $oldLine, string $newLine): string {
$checkboxPattern = '/^(\s*-\s*)\[([ xX])\](.*)/i';

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The checkbox pattern can be defined as a constant to avoid duplicate code

Comment thread lib/Service/DiffService.php Outdated
* @param array $newLines
* @return string
*/
private function enhanceWithWordLevelDiff(string $html, array $operations, array $oldLines, array $newLines): string {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The $html is not used anywhere

}

// Add remaining unused remove operations (not involved in moves or modifications)
foreach ($removes as $removeIndex => $removeOp) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The $removeIndex is not used

@LexioJ LexioJ force-pushed the feature/visual-diff-7201-v1.15.2 branch from 5cca5d9 to bdd5fe0 Compare October 4, 2025 22:25
@LexioJ LexioJ requested a review from luka-nextcloud October 4, 2025 22:26
@LexioJ LexioJ force-pushed the feature/visual-diff-7201-v1.15.2 branch 2 times, most recently from 314af8a to 57c59a5 Compare October 17, 2025 20:10
@LexioJ LexioJ force-pushed the feature/visual-diff-7201-v1.15.2 branch 3 times, most recently from c1c3510 to 420cc89 Compare October 24, 2025 05:05
@luka-nextcloud

Copy link
Copy Markdown
Contributor

@LexioJ Let me know if this PR is ready for review.

@LexioJ LexioJ force-pushed the feature/visual-diff-7201-v1.15.2 branch from 420cc89 to afb4821 Compare October 31, 2025 21:17
@LexioJ

LexioJ commented Oct 31, 2025

Copy link
Copy Markdown
Author

@LexioJ Let me know if this PR is ready for review.

Actually it is, I addressed all your remarks, improved the code & style further and being excited if this proposal will find its way to Deck for imho everyone’s benefit

'new_line' => $bestMatch['new_line']
];
$usedAdds[] = $bestAddIndex;
$usedRemoves[] = $removeIndex;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It can be moved to outside of if statement.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am sorry but I am not able to add you recommendations as I no longer understand the branches in this repo - seems I messed up my fork and local repo. If you like to use/integrate this feature I ask the nextcloud team to adapt/use the code I contributed

} else {
// No good match, keep as remove
$enhancedOps[] = $removeOp;
$usedRemoves[] = $removeIndex;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It can be moved to outside of if statement.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am sorry but I am not able to add you recommendations as I no longer understand the branches in this repo - seems I messed up my fork and local repo. If you like to use/integrate this feature I ask the nextcloud team to adapt/use the code I contributed

Comment on lines +638 to +643
case 'remove':
$word = $oldWords[$operation['old_line']] ?? '';
break;
case 'keep':
$word = $oldWords[$operation['old_line']] ?? '';
break;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Case remove and keep can be merged since they have same result

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am sorry but I am not able to add you recommendations as I no longer understand the branches in this repo - seems I messed up my fork and local repo. If you like to use/integrate this feature I ask the nextcloud team to adapt/use the code I contributed

@marcoambrosini marcoambrosini left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey @LexioJ, thank you for your contribution! Would it be possible to show insertions and additions with strikethrough and highlighted style respectively?

A bit like:
Screenshot 2025-12-08 at 15 41 20

In this reference from notion, "cleaning" was deleted and the "shower" was added

@LexioJ LexioJ force-pushed the feature/visual-diff-7201-v1.15.2 branch from afb4821 to 4381b10 Compare December 8, 2025 16:47
@LexioJ

LexioJ commented Dec 8, 2025

Copy link
Copy Markdown
Author

Hey @LexioJ, thank you for your contribution! Would it be possible to show insertions and additions with strikethrough and highlighted style respectively?

A bit like: Screenshot 2025-12-08 at 15 41 20

In this reference from notion, "cleaning" was deleted and the "shower" was added

It was my origin intent. But then I realized the limitations given by the activity app (which is responsible for rendering). I am using ins and del tags which underline or strikes-out on most common browsers.

This commit introduces a sophisticated visual diff system that enhances
the activity feed with intelligent change detection and professional
presentation. Resolves issue nextcloud#7201.

Features:
• Smart diff rendering with emoji indicators (➕✏️🗑️🚚)
• Word-level diffing for modifications with <del>/<ins> HTML tags
• Intelligent move detection for relocated unchanged content
• Special handling for checkbox state transitions (☐ ↔ ☑)
• Line number context preservation for better readability
• Noise filtering (empty lines, unchanged content)

Technical Implementation:
• New DiffService with LCS-based diff algorithm
• Enhanced activity provider with diff integration
• Multi-pass detection: moves → modifications → additions/deletions
• Similarity scoring system for optimal operation pairing
• HTML-safe output compatible with activity feed constraints

Benefits:
• Clear visualization of content changes in activity timeline
• Reduced cognitive load with filtered, relevant changes only
• Professional emoji-based change indicators
• Maintains backward compatibility with existing activity system

The system intelligently distinguishes between:
- Line moves (🚚): Exact content relocated to different position
- Modifications (✏️): Content changes with word-level highlighting
- Additions (➕): New content inserted
- Deletions (🗑️): Content removed

Tested extensively with various scenarios including complex multi-operation
changes, edge cases, and performance considerations.

Signed-off-by: Alexander Askin <lexioj@gmail.com>
- Apply PHP-CS-Fixer formatting to DiffService.php
  - Fix tab indentation and control structure braces
  - Align with Nextcloud coding standards
- Update test expectation for visual diff feature
  - Adjust DeckProviderTest to expect new diff output format
  - Test now expects '✏️1 <del>ABC</del>→<ins>BCD</ins>' instead of 'BCD'

Fixes failing php-cs and phpunit checks in CI

Signed-off-by: Alexander Askin <lexioj@gmail.com>
- Fix line numbering to consistently show positions in NEW text
- Use dependency injection for DiffService in DeckProvider
- Update copyright year to 2025
- Extract checkbox pattern as class constant
- Remove unused $html parameter and $removeIndex variable
- Fix duplicate remove operations tracking
- Enhance checkbox change detection to handle text modifications
- Add special line formatting for code blocks, callouts, and quotes
- Improve visual presentation with emojis and separators
- Shorten move notation from "(moved from line X)" to "(from X)"

Signed-off-by: Alexander Askin <lexioj@gmail.com>
- Remove HTML tags (<ins>, <del>) from diff output for activity feed compatibility
- Add callout block emoji transitions (e.g., ℹ️→🔴 for ::: info → ::: error)
- Use plain text with arrows (→) to show changes instead of HTML formatting

The activity feed doesn't support HTML tags properly, causing them to appear
as escaped text. This change uses plain text formatting that displays correctly.

Signed-off-by: Alexander Askin <lexioj@gmail.com>
- Add quote line detection and formatting for MODIFY operations to prevent &gt; display issues
- Combine consecutive <ins> and <del> tags to reduce visual clutter
- Merge whitespace-only keep operations between add/remove tags for cleaner output
- Update emoji symbols for better visual representation:
  - Error callout: 🔴 → ❗ (exclamation mark)
  - Quote blocks: 💬 → ❞ (quotation mark)
  - Code blocks: 📝 → ‹› (guillemets)

Signed-off-by: Alexander Askin <lexioj@gmail.com>
@LexioJ LexioJ force-pushed the feature/visual-diff-7201-v1.15.2 branch from 4381b10 to a03dfdc Compare December 10, 2025 22:46
LexioJ pushed a commit to LexioJ/deck that referenced this pull request Dec 10, 2025
- Move $usedRemoves assignment outside if-else block to reduce duplication
- Merge remove/keep switch cases in renderWordLevelHtml as they have identical logic

Addresses code review comments from @luka-nextcloud
@marcoambrosini

Copy link
Copy Markdown
Member

@nickvergessen would there be a way to achieve something like this or to add support for it?

@nickvergessen

Copy link
Copy Markdown
Member

It would need implementing/support in all mobile apps and desktop clients that show activity entries.

Could either use highlight https://github.com/nextcloud/server/blob/master/lib/public/RichObjectStrings/Definitions.php#L430

Or you add a new one, which has only the new text as name (which is shown when clients don't know the type) and has a diff parameter using ins and del. Then here in the deck app rendering we can show fancy html, and in generic clients we save the space and only show the new description?

@marcoambrosini

marcoambrosini commented Dec 15, 2025

Copy link
Copy Markdown
Member

Sounds like a good compromise to me! Or all other places could actually just link to the deck activity tab without detailing the exact changes.
What do you think @LexioJ ?

@LexioJ

LexioJ commented Dec 23, 2025

Copy link
Copy Markdown
Author

Sounds like a good compromise to me! Or all other places could actually just link to the deck activity tab without detailing the exact changes. What do you think @LexioJ ?

I created a screenshot with annotations to illustrate what this code aims to achieve - if there are better ideas or suggestions, would be happy to read them 😀 - overall goal is to make it easier to understand what actually changed on a given modification within the description field.
2025-12-15_22-12-41

  • Intelligent Move Detection (🚚): Identifies when lines are relocated without modification
  • Word-Level Modifications (✏️): Highlights specific word changes within lines using combined <del>/<ins>HTML tags for cleaner output (something added or something deleted)
  • Clean Additions/Deletions (✨/🗑️): Clear indicators for new or removed content
  • Checkbox State Tracking: Special handling for task list changes with visual emoji transitions ("☑️→🔲" or "🔲→☑️")
  • Quote Line Handling: Properly formats blockquotes with ❞ emoji (fixes > display issues)
  • Callout Block Transitions: Shows emoji transitions for callout type changes (ℹ️→❗, ✅→⚠️, etc.)
  • Code Block Indicators: Displays code block markers with ‹› symbol

@nickvergessen

Copy link
Copy Markdown
Member

In all honesty, not sure this is only me, but as a heavy deck user apart from:

Checkbox State Tracking: Special handling for task list changes with visual emoji transitions ("☑️→🔲" or "🔲→☑️")

And maybe but less sure on this one:

Callout Block Transitions: Shows emoji transitions for callout type changes (ℹ️→❗, ✅→⚠️, etc.)

I don't find any of the other things useful and it just adds noise to the activity stream.
Especially because line numbers, paragraphs or anything else is not something one would remember anyway. Even more so if a follow up edit moved them around.

Maybe this could therefore be limited to the in deck card panel view, but render with the subject and no message?

@marcoambrosini

Copy link
Copy Markdown
Member

A few comments from my side

  • I also think we should not reference lines for these changes. Line numbers are not a reference point for normal users
  • Relying on emojis to show the type of change makes it a bit confusing. Especially if there are emojis in the text. I would avoid it
  • I would limit the entries to addition (highlighted), deletions (strikethroughs) and checked, and .
    For checked I'd rather use a sentence instead:
    • Alice marked ☑️ Task as checked

@juliusknorr do you have some thoughts here?

@LexioJ

LexioJ commented Jan 14, 2026

Copy link
Copy Markdown
Author

Proposed Improvements Based on Feedback

Thank you @marcoambrosini, @nickvergessen, and @luka-nextcloud for the detailed feedback. I've heard your concerns about noise and complexity. Here's a revised approach that addresses these issues:

Key Changes

  1. Remove all line numbers - they're not meaningful reference points for users
  2. Replace emoji indicators with semantic HTML - use <ins> and <del> tags only
  3. Natural language for checkbox changes - readable sentences instead of emoji transitions
  4. Smart grouping and summarization - reduce noise for bulk changes
  5. Threshold for large changes - avoid overwhelming the activity feed

Visual Examples

Checkbox Changes (Simple & Clear)

Before:

<full description content>

After:

marked 'Complete security audit' as complete
unmarked 'Review documentation'

Text Modifications (Focused on What Changed)

Before:

<full description content>

After:

changed: <del>deadline March</del><ins>timeline April</ins>
added: Security form link required

Small Additions/Deletions

Before:

<full description content>

After:

added: Please fill out the security check form

Or for deletions:

removed: <del>outdated procedure reference</del>

Combined Changes (Multiple Operations)

Before:

<full description content>

After:

marked 'Security Check' as complete
changed: <del>due Friday</del><ins>due Monday</ins>
added: Link to form: https://...

Large Changes (Noise Reduction)

When someone rewrites substantial portions (10+ lines changed):

Instead of showing every detail:

updated description (15 lines changed)

This prevents the activity feed from being overwhelmed while still indicating significant work happened.

Callout Block Changes (Simplified)

Before:

Changed callout: ℹ️→❗

After:

changed info callout to error

Or simply include it in the text diff:

changed: <del>::: info</del><ins>::: error</ins>

Implementation Strategy

The core algorithm remains the same (LCS-based diff detection), but the presentation layer becomes much cleaner:

  1. Group operations by type (checkboxes, modifications, additions, deletions)
  2. Prioritize checkboxes - show these first as they're most actionable
  3. Limit detail - show actual text for small changes (1-3 items), summarize for bulk changes
  4. Use semantic HTML - let the browser render <ins> and <del> naturally with styling
  5. Natural language - "marked X as complete" instead of "☑️→🔲"

Addressing Specific Concerns

@nickvergessen's concern about noise:

  • Line numbers removed entirely
  • Large changes show summary only ("updated description (X lines changed)")
  • Focus on semantic changes users care about

@marcoambrosini's preferences:

  • Checkbox changes: ✅ Natural language sentences
  • No line references: ✅ Removed
  • Semantic HTML only: ✅ <ins> and <del> tags
  • No emoji indicators: ✅ Except in the actual task text if user wrote it

What Stays Hidden

To keep activity clean, these won't generate entries:

  • Empty line changes
  • Pure whitespace modifications
  • Unchanged content (obvious, but worth stating)
  • Move operations (unless specifically meaningful)

Open Questions

  1. Should callout transitions be shown at all? Or is this still too niche?
  2. What's the ideal threshold for "large change"? Currently proposing 10+ lines
  3. Should there be a "Show full diff" expandable section for power users who want details?

I believe this approach balances the need for clarity (which my users are requesting) with the maintainers' valid concerns about noise. The activity feed stays clean for typical use, while still providing actionable information when descriptions change.

Happy to implement these changes if this direction looks good to you!

@nickvergessen

nickvergessen commented Jan 14, 2026

Copy link
Copy Markdown
Member

Semantic HTML only: ✅ and tags

🤷 HTML is not allowed in descriptions and messages of activity

Should there be a "Show full diff" expandable section for power users who want details?

Same here, activity entries don't have any logic. The entries are shown in iOS, Android and Desktop apps. We can not add JS/HTML code, as they are shown unrendered

@marcoambrosini

Copy link
Copy Markdown
Member

HTML is not allowed in descriptions and messages of activity

To clarify here @nickvergessen, does this limitation apply for the activity app only, or also for the activity tab of the deck card?

@nickvergessen

Copy link
Copy Markdown
Member

or also for the activity tab of the deck card?

It's using the same API

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Feature request: Visual diff-style output for card description changes

5 participants