{"id":15091005,"url":"https://github.com/chylex/tweetduck","last_synced_at":"2025-10-06T10:30:49.414Z","repository":{"id":40533535,"uuid":"55844366","full_name":"chylex/TweetDuck","owner":"chylex","description":"A Windows Client for TweetDeck. Not affiliated with Twitter.","archived":true,"fork":false,"pushed_at":"2023-07-17T10:58:49.000Z","size":13460,"stargazers_count":192,"open_issues_count":0,"forks_count":25,"subscribers_count":16,"default_branch":"master","last_synced_at":"2024-10-01T06:41:12.890Z","etag":null,"topics":["app","cef","cefsharp","csharp","desktop","tweetdeck","twitter","winforms"],"latest_commit_sha":null,"homepage":"https://tweetduck.chylex.com","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chylex.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":"chylex","patreon":"chylex","ko_fi":"chylex"}},"created_at":"2016-04-09T12:58:23.000Z","updated_at":"2024-09-06T15:58:45.000Z","dependencies_parsed_at":"2023-01-22T11:16:25.863Z","dependency_job_id":null,"html_url":"https://github.com/chylex/TweetDuck","commit_stats":null,"previous_names":[],"tags_count":117,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chylex%2FTweetDuck","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chylex%2FTweetDuck/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chylex%2FTweetDuck/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chylex%2FTweetDuck/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chylex","download_url":"https://codeload.github.com/chylex/TweetDuck/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":235519936,"owners_count":19003201,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["app","cef","cefsharp","csharp","desktop","tweetdeck","twitter","winforms"],"created_at":"2024-09-25T10:35:04.412Z","updated_at":"2025-10-06T10:30:43.816Z","avatar_url":"https://github.com/chylex.png","language":"C#","funding_links":["https://github.com/sponsors/chylex","https://patreon.com/chylex","https://ko-fi.com/chylex","https://www.patreon.com/chylex"],"categories":[],"sub_categories":[],"readme":"[Follow TweetDuck on Twitter](https://twitter.com/TryMyAwesomeApp) \u0026nbsp;|\u0026nbsp; [Support via Ko-fi](https://ko-fi.com/chylex) \u0026nbsp;|\u0026nbsp; [Support via Patreon](https://www.patreon.com/chylex)\n\n# Table of Contents\n\n1. [Installation](#installation)\n2. [Source Code](#source-code)\n    * [Requirements](#requirements)\n        + [Editors](#editors)\n        + [Installers](#installers)\n    * [Solution Overview](#solution-overview)\n        + [Core Libraries](#core-libraries)\n            - [TweetLib.Core](#tweetlibcore)\n            - [TweetLib.Browser](#tweetlibbrowser)\n            - [TweetLib.Browser.CEF](#tweetlibbrowsercef)\n        + [Windows Projects](#windows-projects)\n            - [TweetDuck](#tweetduck)\n            - [TweetDuck.Browser](#tweetduckbrowser)\n            - [TweetDuck.Video](#tweetduckvideo)\n            - [TweetImpl.CefSharp](#tweetimplcefsharp)\n        + [Linux Projects](#linux-projects)\n            - [TweetDuck](#tweetduck-1)\n            - [TweetImpl.CefGlue](#tweetimplcefglue)\n        + [Miscellaneous](#miscellaneous)\n            - [TweetLib.Communication](#tweetlibcommunication)\n            - [TweetLib.Utils](#tweetlibutils)\n            - [TweetTest.*](#tweettest)\n3. [Development (Windows)](#development-windows)\n    * [Building](#building)\n    * [Debugging](#debugging)\n    * [Release](#release)\n        + [Installers](#installers-1)\n4. [Development (Linux)](#development-linux)\n    * [Building](#building-1)\n    * [Release](#release-1)\n\n# Installation\n\nDownload links and system requirements are on the [official website](https://tweetduck.chylex.com).\n\n# Source Code\n\n## Requirements\n\nBuilding TweetDuck for Windows requires at minimum [Visual Studio 2019](https://visualstudio.microsoft.com/downloads) and Windows 7. Before opening the solution, open Visual Studio Installer and make sure you have the following Visual Studio workloads and components installed:\n* **.NET desktop development**\n  * .NET SDK\n  * F# desktop language support\n* **Desktop development with C++**\n  * MSVC v142 - VS 2019 C++ x64/x86 build tools (v14.20 / Latest)\n\nIn the **Installation details** panel, you can expand the workloads you selected, and uncheck any components that are not listed above to save space. You may uncheck the .NET SDK component if you installed the [.NET 6 SDK](https://dotnet.microsoft.com/en-us/download/dotnet/6.0) directly.\n\nBuilding TweetDuck for Linux requires [.NET 6 SDK](https://docs.microsoft.com/en-us/dotnet/core/install/linux). The Linux project has its own solution file in the `linux/` folder.\n\n### Editors\n\nFor editing code, I recommend either:\n\n* [Visual Studio](https://visualstudio.microsoft.com/downloads/) for C# / F# + [VS Code](https://code.visualstudio.com/) for the rest (free when using the Community edition of Visual Studio)\n* [Rider](https://www.jetbrains.com/rider/) for all languages (paid)\n\nIcons and logos were designed in [Affinity Designer](https://affinity.serif.com/en-us/designer/) (paid). The original design projects are in the `resources/Design/` folder (`.afdesign` extension).\n\n### Installers\n\n\u003e If you don't want to build installers using the existing foundations, you can skip this section.\n\nOfficial Windows installers are built using [InnoSetup](https://jrsoftware.org/isinfo.php) and [Inno Download Plugin](https://mitrichsoftware.wordpress.com/inno-setup-tools/inno-download-plugin/), specifically:\n* [InnoSetup 6.2.1](https://files.jrsoftware.org/is/6/innosetup-6.2.1.exe)\n* [Inno Download Plugin 1.5.1](https://drive.google.com/folderview?id=0Bzw1xBVt0mokSXZrUEFIanV4azA\u0026usp=sharing#list)\n\nDuring installation, the download plugin will ask whether to add its include path to `ISPPBuiltins.iss`. Note that this option does not work with InnoSetup 6, so TweetDuck installers don't need it.\n\nScripts for building installers require the `PATH` environment variable to include the InnoSetup installation folder. You can either edit `PATH` manually, or use a program like [Rapid Environment Editor](https://www.rapidee.com/en/about) to simplify the process. For example, this is the installation folder I added to `PATH` under **User variables**:\n* `C:\\Program Files (x86)\\Inno Setup 6`\n\nYou may need to restart Visual Studio or Rider after changing `PATH` for the change to take place.\n\n## Solution Overview\n\nOpen the solution file `TweetDuck.sln` (or `linux/TweetDuck.Linux.sln`) in an IDE, and use the **Restore NuGet Packages** option in your IDE to install dependencies.\n\nOn Windows, TweetDuck uses the [CefSharp](https://github.com/cefsharp/CefSharp/) library for the browser component, and Windows Forms for the GUI.\n\nOn Linux, TweetDuck uses the [ChromiumGtk](https://github.com/lunixo/ChromiumGtk) library, which combines [CefGlue](https://gitlab.com/xiliumhq/chromiumembedded/cefglue) for the browser component and [GtkSharp](https://github.com/GtkSharp/GtkSharp) for the GUI.\n\nThe solution contains several C# projects for executables and libraries, and F# projects for automated tests. All projects target `.NET 6` and either `C# 10` or `F#`.\n\nProjects are organized into folders:\n* Windows projects are in the `windows/` folder\n* Linux projects are in the `linux/` folder\n* Libraries (`TweetLib.*`) are in the `lib/` folder\n* Tests (`TweetTest.*`) are also in the `lib/` folder\n\nHere are a few things to keep in mind:\n* Executable projects have their entry points in `Program.cs`\n* Library projects targeting `.NET Standard` have their assembly information in `Lib.cs`\n* All non-test projects include a link to the `Version.cs` file in the root of the repository, which allows changing the version of all executables and library files in one place\n\nWeb resource files (HTML, CSS, JS) are in the `Resources/` folder:\n* `Resources/Content/` contains all the core features of TweetDuck injected into the browser components\n* `Resources/Guide/` contains the official TweetDuck guide that opens as a popup\n* `Resources/Plugins/` contains all official plugins, and a `.debug` plugin for testing\n\nThese resource folders are linked as part of the `TweetLib.Core` project so they can be edited directly within an IDE. Alternatively, you can edit them using [VS Code](https://code.visualstudio.com/) by opening the workspace file `Resources/..code-workspace`.\n\n### Core Libraries\n\n#### TweetLib.Core\n\nThis library contains the core TweetDuck application and browser logic. It is built around simple dependency injection that makes it independent of any concrete OS, GUI framework, or browser implementation.\n\nTo simplify porting to other systems, it is not necessary to implement all interfaces, but some functionality will be missing (for ex. if clipboard-related interfaces are not implemented, then context menus will not contain options to copy text or images to clipboard).\n\n#### TweetLib.Browser\n\nThis library provides a zero-dependency abstraction of browser components and logic. It defines interfaces, events, and container objects that are used by the `TweetLib.Core` library to describe how a browser should behave, while making as few assumptions about the actual browser implementation as possible.\n\n#### TweetLib.Browser.CEF\n\nThis library is a partial implementation of `TweetLib.Browser` based on [CEF](https://bitbucket.org/chromiumembedded/cef/) interfaces and conventions.\n\nWhile `TweetLib.Browser` is highly generic, most browser libraries are likely to be using some form of [CEF](https://bitbucket.org/chromiumembedded/cef/), so this library significantly reduces the amount of work required to swap between browser libraries that are based on [CEF](https://bitbucket.org/chromiumembedded/cef/).\n\n### Windows Projects\n\n#### TweetDuck\n\nMain Windows executable. It has a dependency on [CefSharp](https://github.com/cefsharp/CefSharp/) and Windows Forms. Here you will find the entry point that bootstraps the main application, as well as code for GUIs and Windows-specific functionality.\n\n#### TweetDuck.Browser\n\nWindows executable that hosts various Chromium processes. It has a dependency on [CefSharp](https://github.com/cefsharp/CefSharp/).\n\n#### TweetDuck.Video\n\nWindows executable that hosts a video player, which is based on the WMPLib ActiveX component responsible for integrating Windows Media Player into .NET Framework.\n\nBy default, [CefSharp](https://github.com/cefsharp/CefSharp/) is not built with support for H.264 video playback due to software patent nonsense, and even though TweetDuck could be moved entirely to Europe where MPEG LA's patent means nothing, it would require building a custom version of Chromium which requires too many resources. Instead, when a Twitter video played, TweetDuck launches this video player process, which uses Windows Media Player to play H.264 videos.\n\n#### TweetImpl.CefSharp\n\nWindows library that implements `TweetLib.Browser.CEF` using the [CefSharp](https://github.com/cefsharp/CefSharp/) library and Windows Forms.\n\n#### TweetLib.WinForms.Legacy\n\nWindows library that re-adds some legacy Windows Forms components that were removed in .NET Core 3.1. The sources were taken from the [.NET Core 3.0 sources of Windows Forms](https://github.com/dotnet/winforms/tree/v3.0.2), and edited to remove unnecessary features.\n\n### Linux Projects\n\n#### TweetDuck\n\nMain Linux executable. It has a transitive dependency on [ChromiumGtk](https://github.com/lunixo/ChromiumGtk). Here you will find the entry point that bootstraps the main application, as well as code for GUIs and Linux-specific functionality.\n\n#### TweetImpl.CefGlue\n\nLinux library that implements `TweetLib.Browser.CEF` using [ChromiumGtk](https://github.com/lunixo/ChromiumGtk), which is based on [CefGlue](https://gitlab.com/xiliumhq/chromiumembedded/cefglue) and [GtkSharp](https://github.com/GtkSharp/GtkSharp).\n\n### Miscellaneous\n\n#### TweetLib.Communication\n\nThis library provides a `DuplexPipe` class for two-way communication between processes.\n\n#### TweetLib.Utils\n\nThis library contains various utilities that fill some very specific holes in the .NET standard library.\n\n#### TweetTest.*\n\nThese are F# projects with automated tests.\n\n# Development (Windows)\n\nWhen developing with [Rider](https://www.jetbrains.com/rider/), it must be configured to use MSBuild from Visual Studio, and the `DevEnvDir` property must be set to the full path to the `Common7\\IDE` folder which is inside Visual Studio's installation folder. You can set both in **File | Settings | Build, Execution, Deployment | Toolset and Build**:\n\n1. Click the `MSBuild version` drop-down, and select the path that includes the Visual Studio installation folder.\n2. Click the Edit button next to `MSBuild global properties`.\n3. Add a new property named `DevEnvDir`, and set its value to the full path to `Common7\\IDE`. For example:\n   - `VS 2019 Community` - `C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Community\\Common7\\IDE`\n   - `VS 2022 Community` - `C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\Common7\\IDE`\n\n## Building\n\nThe `windows/TweetDuck/TweetDuck.csproj` project file has several tasks (targets) that run before and after a build:\n* `PreBuildEvent` runs a PowerShell script that kills `TweetDuck.Browser` processes, in case they got stuck\n* `CopyResources` copies resource files into the build folder, and patches and validates them using the `PostBuild.ps1` PowerShell script\n* `FinalizeDebug` copies a debug plugin (`Resources/Plugins/.debug`) into the build folder (Debug only)\n* `FinalizeRelease` prepares the build folder for publishing, and if InnoSetup is installed, regenerates the [update installer](#installers-1) (Release only)\n\nIf the build fails, usually with an error like `The command (...) exited with code 1`, open the **Output** tab for detailed logs. A possible cause is the `PostBuild.ps1` script's file validation:\n* `Resources/Plugins/emoji-keyboard/emoji-ordering.txt` line endings must be LF (line feed); if the file contains any CR (carriage return) characters, the build will fail\n\n## Debugging\n\nThe `Debug` configuration uses a separate data folder by default (`%LOCALAPPDATA%\\TweetDuckDebug`) to avoid affecting an existing installation of TweetDuck. You can modify this by opening **TweetDuck Properties** in Visual Studio, clicking the **Debug** tab, and changing the **Command line arguments** field.\n\nWhile debugging, opening the main menu and clicking **Reload browser** automatically applies all changes to HTML/CSS/JS files in the `Resources/` folder. This allows editing and testing resource files without restarting the program, but it will cause a short delay between browser reloads.\n\n## Release\n\nOpen **Batch Build**, tick all `Release` configurations with `x86` platform, and click **Rebuild**. Check the status bar to make sure it says **Rebuild All succeeded**; if not, see the end of the [Building](#building) section.\n\nIf the build succeeds, the `windows/TweetDuck/bin/x86/Release` folder will contain files intended for distribution (no debug symbols or other unnecessary files). You may package these files yourself, or see the [Installers](#installers-1) section for automated installer generation.\n\nIf you decide to publicly release a custom version, please change all references to the TweetDuck name, website, and other links such as the issue tracker. The source files contain several constants and references to the official website and this repository, so don't forget to search all files for `chylex.com` and `github.com` in all files and replace them appropriately.\n\n### Installers\n\nIf you have all the requirements for building [installers](#installers), you can generate them by running `bld/GEN INSTALLERS.bat`. Note that this will only package the files, you still need to create a [release build](#release) in Visual Studio first!\n\nAfter the window closes, three installers will be generated inside the `bld/Output/` folder:\n* **TweetDuck.exe**\n  * This is the main installer that creates entries in the Start Menu \u0026 Programs and Features, and an optional desktop icon\n* **TweetDuck.Update.exe**\n  * This is a lightweight update installer that only contains the most important files that usually change across releases\n  * It will automatically download and apply the full installer if the user's current version of CEF does not match\n* **TweetDuck.Portable.exe**\n  * This is a portable installer that does not need administrator privileges\n  * It automatically creates a `makeportable` file in the program folder, which forces TweetDuck to run in portable mode\n\nIf you plan to distribute your own installers, you can change the variables in the `.iss` installer files and in the update system to point to your own repository, and use the power of the existing update system.\n\n\u003e There is a small chance running `GEN INSTALLERS.bat` immediately shows a resource error. If that happens, close the console window (which terminates all Inno Setup processes and leaves corrupted installers in the output folder), and run it again.\n\n\u003e Running `GEN INSTALLERS.bat` uses about 400 MB of RAM due to high compression. You can lower this to about 140 MB by opening `gen_full.iss` and `gen_port.iss`, and changing `LZMADictionarySize=15360` to `LZMADictionarySize=4096`.\n\n# Development (Linux)\n\nUnfortunately the development experience on Linux is terrible, likely due to mixed C# and native code. The .NET debugger seems to crash the moment it enters native code, so the only way to run the app is without the debugger attached. If any C# code throws an exception, it will crash the whole application with no usable stack trace or error message. Please let me know if you find a way to make this better.\n\n## Building\n\nThe `linux/TweetDuck/TweetDuck.csproj` project file has several tasks (targets) that run after a build:\n\n* `CopyResources` copies resource files into the build folder, and patches and validates them using the `build.sh` Bash script\n* `FinalizeDebug` copies a debug plugin (`Resources/Plugins/.debug`) into the build folder (Debug only)\n* `FinalizeRelease` prepares the build folder for publishing (Release only)\n\n## Release\n\nTo change the application version before a release, search for the `\u003cVersion\u003e` tag in every `.csproj` file in the `linux/` folder and modify it.\n\nTo build the application, execute the `linux/publish.sh` Bash script. This will build the Release configuration for the `linux-x64` runtime platform, and create a tarball in the `linux/bld/` folder.\n\nIf you decide to publicly release a custom version, please change all references to the TweetDuck name, website, and other links such as the issue tracker. The source files contain several constants and references to the official website and this repository, so don't forget to search all files for `chylex.com` and `github.com` in all files and replace them appropriately.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchylex%2Ftweetduck","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchylex%2Ftweetduck","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchylex%2Ftweetduck/lists"}