{"id":31544559,"url":"https://github.com/endjin/stacker","last_synced_at":"2025-10-04T13:48:05.737Z","repository":{"id":40369750,"uuid":"238634799","full_name":"endjin/Stacker","owner":"endjin","description":"A .NET Global Tool for automating marketing content across social channels.","archived":false,"fork":false,"pushed_at":"2025-09-10T23:05:38.000Z","size":291,"stargazers_count":12,"open_issues_count":3,"forks_count":0,"subscribers_count":10,"default_branch":"main","last_synced_at":"2025-09-27T20:30:19.924Z","etag":null,"topics":["linkedin","twitter","wordpress"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/endjin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-02-06T07:49:45.000Z","updated_at":"2025-07-23T02:49:43.000Z","dependencies_parsed_at":"2023-09-25T05:29:09.269Z","dependency_job_id":"52614c10-ef87-4c91-9b48-9f92cb2a219f","html_url":"https://github.com/endjin/Stacker","commit_stats":null,"previous_names":[],"tags_count":32,"template":false,"template_full_name":null,"purl":"pkg:github/endjin/Stacker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/endjin%2FStacker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/endjin%2FStacker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/endjin%2FStacker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/endjin%2FStacker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/endjin","download_url":"https://codeload.github.com/endjin/Stacker/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/endjin%2FStacker/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278322187,"owners_count":25967873,"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","status":"online","status_checked_at":"2025-10-04T02:00:05.491Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["linkedin","twitter","wordpress"],"created_at":"2025-10-04T13:48:02.351Z","updated_at":"2025-10-04T13:48:05.732Z","avatar_url":"https://github.com/endjin.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Stacker\n\nA .NET Global Tool for automating marketing content across social channels. It supports extracting content from Vellum and then republishing via Buffer to Twitter, Mastodon, Facebook \u0026 LinkedIn, with automatically generated leader copy.\n\n## Prerequisites\n\n`stacker` uses Pandoc for WordPress export functionality, to convert from wordpress to markdown. You will need to install [Pandoc](https://pandoc.org/installing.html) and add it to the `PATH` or use `winget install JohnMacFarlane.Pandoc`.\n\n## Installation\n\n`stacker` is a [.NET global tool](https://docs.microsoft.com/en-us/dotnet/core/tools/global-tools), which means once installed, it's available on the PATH of your machine. \n\nTo list all the global tools installed on your machine, open a command prompt and type:\n\n`dotnet tool list -g`\n\nTo install the `stacker` global tool use the following command:\n\n`dotnet tool install -g stacker`\n\nThen use `stacker environment init` to create a default `StackerSettings.json` file with placeholder values in `%%UserProfile%%\\AppData\\Roaming\\endjin\\stacker\\configuration`.\n\nTo install a specific version, use:\n\n`dotnet tool install -g stacker --version \u003cversion-number\u003e`\n\nTo update to the latest version of the tool, use:\n\n`dotnet tool update -g stacker`\n\nTo uninstall the tool, use:\n\n`dotnet tool uninstall -g stacker`\n\n## Commands\n\nHere are some usage examples:\n\n```PowerShell\nUSAGE:\n    stacker [OPTIONS] \u003cCOMMAND\u003e\n\nEXAMPLES:\n    stacker bluesky buffer create -c c:\\temp\\content.json -n azureweekly\n    stacker bluesky buffer shuffle -n azureweekly\n    stacker mastodon buffer create -c c:\\temp\\content.json -n azureweekly\n    stacker mastodon buffer shuffle -n azureweekly\n    stacker linkedin buffer create -c c:\\temp\\content.json -n endjin\n    stacker linkedin buffer shuffle -n endjin\n    stacker facebook buffer create -c c:\\temp\\content.json -n endjin\n    stacker facebook buffer shuffle -n endjin\n    stacker twitter buffer create -c c:\\temp\\content.json -n endjin\n    stacker twitter buffer create -c c:\\temp\\content.json -n endjin --item-count 10\n    stacker twitter buffer create -c c:\\temp\\content.json -n endjin --publication-period ThisMonth\n    stacker twitter buffer create -c c:\\temp\\content.json -n endjin --filter-by-tag MicrosoftFabric --what-if\n    stacker twitter buffer create -c c:\\temp\\content.json -n endjin --filter-by-tag MicrosoftFabric --item-count 10 --randomise --what-if\n    stacker twitter buffer create -c c:\\temp\\content.json -n endjin --from-date 2023/06/01 --to-date 2023/06/30\n    stacker twitter buffer create -c c:\\temp\\content.json -n endjin --filter-by-tag PowerBI --from-date 2023/06/01 --to-date 2023/06/30\n    stacker twitter buffer create -h https://localhost/stacker-export.json -n endjin --filter-by-tag MicrosoftFabric --what-if\n    stacker twitter buffer shuffle -n endjin\n    stacker environment init\n    stacker wordpress export markdown -w C:\\temp\\wordpress-export.xml -o C:\\Temp\\Blog\n    stacker wordpress export universal -w C:\\temp\\wordpress-export.xml -o C:\\Temp\\Blog\\export.json\n\nOPTIONS:\n    -h, --help    Prints help information\n\nCOMMANDS:\n    bluesky        Bluesky functionality\n    facebook       Facebook functionality\n    linkedin       LinkedIn functionality\n    mastodon       Mastodon functionality\n    twitter        Twitter functionality\n    environment    Manipulate the stacker environment\n    wordpress      WordPress functionality\n```\n\n### Buffer commands\n\n`stacker twitter buffer create` - Upload content items into buffer for the specified Twitter profile.\n\n`stacker linkedin buffer create` - Upload content items into buffer for the specified LinkedIn profile.\n\n`stacker facebook buffer create` - Upload content items into buffer for the specified Facebook profile.\n\nThe `buffer create` command also takes the following options to filter the content items to be buffered.\n\n```\nOPTIONS:\n    -h, --help                  Prints help information\n    -c, --content-file-path     Content file path\n    -n, --profile-name          Buffer channel profile (e.g. twitter, linkedin, facebook) name (e.g. endjin, azureweekly, powerbiweekly)\n    -g, --filter-by-tag         Tag to filter the content items by\n    -i, --item-count            Number of content items to buffer. If omitted all content is buffered\n    -p, --publication-period    Publication period to filter content items by. \u003cLastMonth|LastWeek|LastYear|None|ThisMonth|ThisWeek|ThisYear\u003e If specified --from-date and --to-date are ignored\n    -f, --from-date             Include content items published on, or after this date. Use YYYY/MM/DD Format. If omitted DateTime.MinValue is used\n    -t, --to-date               Include content items published on, or before this date. Use YYYY/MM/DD Format. If omitted DateTime.MaxValue is used\n    -w, --what-if               See what the command would do without submitting the content to Buffer\n```\n\nYou can also shuffle items already in the buffer queue (useful if you're inserting content into and existing queue and need to mix it up).\n\n`stacker bluesky buffer shuffle` - Shuffle the content items in the buffer for the specified Bluesky profile.\n`stacker twitter buffer shuffle` - Shuffle the content items in the buffer for the specified Twitter profile.\n`stacker linkedin buffer shuffle` - Shuffle the content items in the buffer for the specified LinkedIn profile.\n`stacker facebook buffer shuffle` - Shuffle the content items in the buffer for the specified Facebook profile.\n`stacker mastodon buffer shuffle` - Shuffle the content items in the buffer for the specified Mastodon profile.\n\n### WordPress commands\n\n`stacker wordpress` - Interact with WordPress. Root command for WordPress operations. Will list available sub-commands.\n\n`stacker wordpress export universal` - Exports blog posts from WordPress into a reusable format suitable for publishing across social channels.\n\n`wordpress export markdown` - Exports blog posts from WordPress and converts them into Markdown. Various clean up routes are also run.\n\n### Environment commands\n\n`stacker environment` - Manipulate the stacker environment. Root command for environment operations. Will list available sub-commands.\n\n`stacker environment init` - Initialises the `stacker` environment. Writes a default `StackerSettings.json` file with placeholder values to `%%UserProfile%%\\AppData\\Roaming\\endjin\\stacker\\configuration`\n\n## System Details\n\nAn application profile folder is created in:\n\n`%%UserProfile%%\\AppData\\Roaming\\endjin\\stacker`\n\nConfiguration is stored in:\n\n`%%UserProfile%%\\AppData\\Roaming\\endjin\\stacker\\configuration\\`\n\n## DevOps\n\nThe project is [built using GitHub Actions](https://github.com/endjin/Stacker/actions) using [Endjin.RecommendedPractices.Build](https://www.powershellgallery.com/packages/Endjin.RecommendedPractices.Build/) and [Endjin.RecommendedPractices.GitHubActions](https://github.com/endjin/Endjin.RecommendedPractices.GitHubActions). Solution-level Engineering Practices are enforced using [Endjin.RecommendedPractices.NuGet](https://github.com/endjin/Endjin.RecommendedPractices.NuGet).\n\n## Packages\n\nThe NuGet packages for the project, hosted on NuGet.org are:\n\n- [stacker](https://www.nuget.org/packages/stacker)\n\n## WordPress\n\nStacker supports filtering of blog posts via WordPress Custom Fields.\n\n`stacker_promote` `true` | `false` - states whether Stacker should promote. If this field is missing, Stacker will automatically include it.\n\n`stacker_promote_until` YYYY-MM-DD - states the date at which Stacker should stop including the post. This is for use cases around events which have no re-posting value.\n\nHastags are generated from WordPress Tags associated with each post.\n\nThe `Excerpt` custom field is used to provide the content summary when publishing to Facebook or LinkedIn.\n\n## Licenses\n\n[![GitHub license](https://img.shields.io/badge/License-Apache%202-blue.svg)](https://raw.githubusercontent.com/endjin/Stacker/master/LICENSE)\n\nThis project is available under the Apache 2.0 open source license.\n\nFor any licensing questions, please email [\u0026#108;\u0026#105;\u0026#99;\u0026#101;\u0026#110;\u0026#115;\u0026#105;\u0026#110;\u0026#103;\u0026#64;\u0026#101;\u0026#110;\u0026#100;\u0026#106;\u0026#105;\u0026#110;\u0026#46;\u0026#99;\u0026#111;\u0026#109;](\u0026#109;\u0026#97;\u0026#105;\u0026#108;\u0026#116;\u0026#111;\u0026#58;\u0026#108;\u0026#105;\u0026#99;\u0026#101;\u0026#110;\u0026#115;\u0026#105;\u0026#110;\u0026#103;\u0026#64;\u0026#101;\u0026#110;\u0026#100;\u0026#106;\u0026#105;\u0026#110;\u0026#46;\u0026#99;\u0026#111;\u0026#109;)\n\n## Project Sponsor\n\nThis project is sponsored by [endjin](https://endjin.com), a fully remote UK based Technology Consultancy which specializes in Data, AI, DevOps \u0026 Cloud, and is a [.NET Foundation Corporate Sponsor](https://dotnetfoundation.org/membership/corporate-sponsorship).\n\n\u003e We help small teams achieve big things.\n\nWe produce two free weekly newsletters: \n\n - [Azure Weekly](https://azureweekly.info) for all things about the Microsoft Azure Platform\n - [Power BI Weekly](https://powerbiweekly.info) for all things Power BI, Microsoft Fabric, and Azure Synapse Analytics\n\nKeep up with everything that's going on at endjin via our [blog](https://endjin.com/blog), follow us on [Twitter](https://twitter.com/endjin), [YouTube](https://www.youtube.com/c/endjin) or [LinkedIn](https://www.linkedin.com/company/endjin).\n\nWe have become the maintainers of a number of popular .NET Open Source Projects:\n\n- [Reactive Extensions for .NET](https://github.com/dotnet/reactive)\n- [Reaqtor](https://github.com/reaqtive)\n- [Argotic Syndication Framework](https://github.com/argotic-syndication-framework/)\n\nAnd we have over 50 Open Source projects of our own, spread across the following GitHub Orgs:\n\n- [endjin](https://github.com/endjin/)\n- [Corvus](https://github.com/corvus-dotnet)\n- [Menes](https://github.com/menes-dotnet)\n- [Marain](https://github.com/marain-dotnet)\n- [AIS.NET](https://github.com/ais-dotnet)\n\nAnd the DevOps tooling we have created for managing all these projects is available on the [PowerShell Gallery](https://www.powershellgallery.com/profiles/endjin).\n\nFor more information about our consulting services, please [contact us](https://endjin.com/contact-us).\n\n## Code of conduct\n\nThis project has adopted a code of conduct adapted from the [Contributor Covenant](http://contributor-covenant.org/) to clarify expected behaviour in our community. This code of conduct has been [adopted by many other projects](http://contributor-covenant.org/adopters/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [\u0026#104;\u0026#101;\u0026#108;\u0026#108;\u0026#111;\u0026#064;\u0026#101;\u0026#110;\u0026#100;\u0026#106;\u0026#105;\u0026#110;\u0026#046;\u0026#099;\u0026#111;\u0026#109;](\u0026#109;\u0026#097;\u0026#105;\u0026#108;\u0026#116;\u0026#111;:\u0026#104;\u0026#101;\u0026#108;\u0026#108;\u0026#111;\u0026#064;\u0026#101;\u0026#110;\u0026#100;\u0026#106;\u0026#105;\u0026#110;\u0026#046;\u0026#099;\u0026#111;\u0026#109;) with any additional questions or comments.\n\n## IP Maturity Model (IMM)\n\nThe [IP Maturity Model](https://github.com/endjin/Endjin.Ip.Maturity.Matrix) is endjin's IP quality framework; it defines a [configurable set of rules](https://github.com/endjin/Endjin.Ip.Maturity.Matrix.RuleDefinitions), which are committed into the [root of a repo](imm.yaml), and a [Azure Function HttpTrigger](https://github.com/endjin/Endjin.Ip.Maturity.Matrix/tree/master/Solutions/Endjin.Ip.Maturity.Matrix.Host) which can evaluate the ruleset, and render an svg badge for display in repo's `readme.md`.\n\nThis approach is based on our 10+ years experience of delivering complex, high performance, bleeding-edge projects, and due diligence assessments of 3rd party systems. For detailed information about the ruleset see the [IP Maturity Model repo](https://github.com/endjin/Endjin.Ip.Maturity.Matrix).\n\n## IMM for stacker\n\n[![Shared Engineering Standards](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/74e29f9b-6dca-4161-8fdd-b468a1eb185d?nocache=true)](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/74e29f9b-6dca-4161-8fdd-b468a1eb185d?cache=false)\n\n[![Coding Standards](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/f6f6490f-9493-4dc3-a674-15584fa951d8?cache=false)](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/f6f6490f-9493-4dc3-a674-15584fa951d8?cache=false)\n\n[![Executable Specifications](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/bb49fb94-6ab5-40c3-a6da-dfd2e9bc4b00?cache=false)](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/bb49fb94-6ab5-40c3-a6da-dfd2e9bc4b00?cache=false)\n\n[![Code Coverage](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/0449cadc-0078-4094-b019-520d75cc6cbb?cache=false)](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/0449cadc-0078-4094-b019-520d75cc6cbb?cache=false)\n\n[![Benchmarks](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/64ed80dc-d354-45a9-9a56-c32437306afa?cache=false)](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/64ed80dc-d354-45a9-9a56-c32437306afa?cache=false)\n\n[![Reference Documentation](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/2a7fc206-d578-41b0-85f6-a28b6b0fec5f?cache=false)](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/2a7fc206-d578-41b0-85f6-a28b6b0fec5f?cache=false)\n\n[![Design \u0026 Implementation Documentation](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/f026d5a2-ce1a-4e04-af15-5a35792b164b?cache=false)](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/f026d5a2-ce1a-4e04-af15-5a35792b164b?cache=false)\n\n[![How-to Documentation](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/145f2e3d-bb05-4ced-989b-7fb218fc6705?cache=false)](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/145f2e3d-bb05-4ced-989b-7fb218fc6705?cache=false)\n\n[![Date of Last IP Review](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/da4ed776-0365-4d8a-a297-c4e91a14d646?cache=false)](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/da4ed776-0365-4d8a-a297-c4e91a14d646?cache=false)\n\n[![Framework Version](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/6c0402b3-f0e3-4bd7-83fe-04bb6dca7924?cache=false)](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/6c0402b3-f0e3-4bd7-83fe-04bb6dca7924?cache=false)\n\n[![Associated Work Items](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/79b8ff50-7378-4f29-b07c-bcd80746bfd4?cache=false)](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/79b8ff50-7378-4f29-b07c-bcd80746bfd4?cache=false)\n\n[![Source Code Availability](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/30e1b40b-b27d-4631-b38d-3172426593ca?cache=false)](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/30e1b40b-b27d-4631-b38d-3172426593ca?cache=false)\n\n[![License](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/d96b5bdc-62c7-47b6-bcc4-de31127c08b7?cache=false)](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/d96b5bdc-62c7-47b6-bcc4-de31127c08b7?cache=false)\n\n[![Production Use](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/87ee2c3e-b17a-4939-b969-2c9c034d05d7?cache=false)](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/87ee2c3e-b17a-4939-b969-2c9c034d05d7?cache=false)\n\n[![Insights](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/71a02488-2dc9-4d25-94fa-8c2346169f8b?cache=false)](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/71a02488-2dc9-4d25-94fa-8c2346169f8b?cache=false)\n\n[![Packaging](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/547fd9f5-9caf-449f-82d9-4fba9e7ce13a?cache=false)](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/547fd9f5-9caf-449f-82d9-4fba9e7ce13a?cache=false)\n\n[![Deployment](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/edea4593-d2dd-485b-bc1b-aaaf18f098f9?cache=false)](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/edea4593-d2dd-485b-bc1b-aaaf18f098f9?cache=false)\n\n[![OpenChain](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/66efac1a-662c-40cf-b4ec-8b34c29e9fd7?cache=false)](https://imm.endjin.com/api/imm/github/endjin/Stacker/rule/66efac1a-662c-40cf-b4ec-8b34c29e9fd7?cache=false)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fendjin%2Fstacker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fendjin%2Fstacker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fendjin%2Fstacker/lists"}