├── .dockerignore
├── .editorconfig
├── .env.sample
├── .gitignore
├── .gitmodules
├── .idea
├── codeStyles
│ ├── Project.xml
│ └── codeStyleConfig.xml
├── compiler.xml
├── dataSources.xml
├── gradle.xml
├── inspectionProfiles
│ └── Project_Default.xml
├── jarRepositories.xml
├── jsLinters
│ └── eslint.xml
├── misc.xml
├── modules
│ ├── packages
│ │ ├── server-graphql
│ │ │ └── rich-multiproject.packages.server-graphql.iml
│ │ ├── server-rich-rss
│ │ │ └── rich-multiproject.packages.server-rich-rss.iml
│ │ └── server-rss-kotlin
│ │ │ └── rich-multiproject.packages.server-rss-kotlin.test.iml
│ └── server-rich-graph.iml
└── vcs.xml
├── .run
└── FeedlessApplication.run.xml
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── README.mustache.md
├── build.gradle.kts
├── chrome.json
├── docker-compose.legacy.yml
├── docker-compose.plausible.yml
├── docker-compose.prod.yml
├── docker-compose.yml
├── docker
├── aio-with-chromium
│ ├── Dockerfile
│ └── docker-aio-entrypoint.sh
├── aio-with-web
│ └── Dockerfile
├── app
│ └── app-config.json
├── ingress
│ ├── Dockerfile
│ ├── entrypoint.sh
│ └── nginx-template.conf
├── legacy
│ └── app-config.json
├── loki
│ └── loki.yml
├── nitter
│ └── nitter.conf
├── plausible
│ └── plausible-conf.env
├── prometheus
│ └── prometheus.yml
├── promtail
│ └── promtail.yml
└── your-license.key
├── docs
├── authentication.md
├── blog
│ ├── analytics.md
│ ├── cd.md
│ ├── cofounder.md
│ ├── complexity.md
│ ├── coroutines.md
│ ├── idea.md
│ ├── monitoring.md
│ ├── monolith.md
│ ├── motivation.md
│ ├── no-cloud.md
│ ├── personal-roadmap.md
│ ├── sideproject.md
│ ├── testing-hard.md
│ └── throttling.md
├── development.md
├── flow.dia
├── from-archive-org
│ ├── archive-accumulator.ts
│ └── package.json
├── ideas.md
├── inspiration
│ ├── feed rate.png
│ └── reddit.png
├── license-dump.md
├── opmls
│ ├── engineering-feeds-individuals.opml.xml
│ ├── engineering_blogs.opml.xml
│ ├── feedly.opml.xml
│ ├── fever-security.opml.xml
│ └── test-sample.opml.xml
├── reader.png
├── reads
│ ├── HackerNews Ranking Algorithm_ How would you have done it_.html
│ ├── HackerNews Ranking Algorithm_ How would you have done it__files
│ │ ├── 027b57bb-36f0-4968-ad6b-a86063674a79_6412x3328(1).jpg
│ │ ├── 027b57bb-36f0-4968-ad6b-a86063674a79_6412x3328.jpg
│ │ ├── 0952ad26-47a3-4213-85c0-29c8eb1979ce_945x945.jpg
│ │ ├── 11d75d52-c322-430a-b382-636457c898b3_2208x1984.png
│ │ ├── 66dd34c6-7d29-4428-a8d5-f41f8ffe4a91_400x400.jpg
│ │ ├── 6c2ff3e3828e4017b7faf7b63e24cdf8.min.js
│ │ ├── 6ca3e7da-886c-438c-a46a-e82686c5af48_1916x984(1).jpg
│ │ ├── 6ca3e7da-886c-438c-a46a-e82686c5af48_1916x984.jpg
│ │ ├── 80c8d221-3e4f-423f-bed5-929b04d8b301_4000x4000(1).jpg
│ │ ├── 80c8d221-3e4f-423f-bed5-929b04d8b301_4000x4000.jpg
│ │ ├── 9ca94043-1f3f-41fe-8749-f7e2b89ccf2b_144x144.jpg
│ │ ├── AlertDialog-e3a605af.css
│ │ ├── Attachments-94e0a9c8.css
│ │ ├── AuditionPlayer-5637d633.css
│ │ ├── Banner-cc32eba2.css
│ │ ├── BetaTag-8b30a2bc.css
│ │ ├── ChatAppUpsell-41a3562f.css
│ │ ├── CommentBody-f90dd6a2.css
│ │ ├── CommunityPostView-2bcc1970.css
│ │ ├── CookieConsentFooter-0d9aca19.css
│ │ ├── Divider-f25512a6.css
│ │ ├── DropzoneOverlay-287820b3.css
│ │ ├── EmailTypoHandler-1f1ddc43.css
│ │ ├── Field-cea155ef.css
│ │ ├── FilePicker-ceb0fe25.css
│ │ ├── FlexBox-c1df079b.css
│ │ ├── FollowPrompt-a56b28dc.css
│ │ ├── HoverCard-41ea4b50.css
│ │ ├── ImageViewerModal-5f70a364.css
│ │ ├── IntroPopup-96bfa55d.css
│ │ ├── Logo-f0548763.css
│ │ ├── Menu-9123dbf7.css
│ │ ├── Modal-faa641cb.css
│ │ ├── NavbarUserWidget-a83cba36.css
│ │ ├── NoteComposer-6d7a578b.css
│ │ ├── PodcastTranscriptTab-22166d76.css
│ │ ├── ProfileHoverCard-0f3ebd95.css
│ │ ├── ProfileSetupToast-60e0a843.css
│ │ ├── Progress-f0f26f86.css
│ │ ├── PubAccentTheme-4d7e77dd.css
│ │ ├── PublicationSearch-24228c5a.css
│ │ ├── Radio-148681a8.css
│ │ ├── Recipe-53df0851.css
│ │ ├── RewardBox-5297e7a9.css
│ │ ├── SearchModal-bbccf91b.css
│ │ ├── Select-cd38999e.css
│ │ ├── ShareAssetButtons-9cd347fc.css
│ │ ├── ShareableImageModal-6a735338.css
│ │ ├── TabBar-a61ccfca.css
│ │ ├── TextEditor-9120b69d.css
│ │ ├── TextLink-f399b628.css
│ │ ├── Tooltip-d0af0cf2.css
│ │ ├── UserBadge-fb9c174e.css
│ │ ├── VideoVerticalMenu-89d6e55f.css
│ │ ├── _baseEach-514c6e37.css
│ │ ├── _defineProperty-213a01f6.css
│ │ ├── a19b9ff9-60b4-4a6e-ae91-95c701c44c7b_1184x776.jpg
│ │ ├── app_install_modal-1b80d39d.css
│ │ ├── autocomplete_results-a5e8d737.css
│ │ ├── bb5f775e-a62c-48ea-8189-f74b74c84c65_1024x1024.jpg
│ │ ├── beacon.min.js
│ │ ├── entry-3c13f6d5.css
│ │ ├── f0866902-0b32-48e4-b46c-bc36002e518c_144x144(1).jpg
│ │ ├── f0866902-0b32-48e4-b46c-bc36002e518c_144x144(2).jpg
│ │ ├── f0866902-0b32-48e4-b46c-bc36002e518c_144x144.jpg
│ │ ├── f1ea07d3-b3d8-44a8-8b2b-4a8f50175ff3_3088x2316.jpg
│ │ ├── facepile-2e21e967.css
│ │ ├── free_email_form-25f68dbb.css
│ │ ├── homepage_hooks-c28ee672.css
│ │ ├── index-bee825e1.css
│ │ ├── js
│ │ ├── logged-out.png
│ │ ├── main-514d96ed.js
│ │ ├── main.744438bb3c1e083ebc7a.css
│ │ ├── mention-e43b25a5.css
│ │ ├── newsletter_item_list-03468b3d.css
│ │ ├── overflow_menu-db9a534e.css
│ │ ├── podcast_apps-184969d7.css
│ │ ├── post-cfd9b3d5.css
│ │ ├── recommend_linked_publication_modal-722617bb.css
│ │ ├── setup_all_podcasts-b481ea39.css
│ │ ├── tex-mml-chtml.js
│ │ ├── user-51b02764.css
│ │ ├── user_indicator-c1a5a8fb.css
│ │ └── video_editor-d2e65442.css
│ ├── How to make a good ID in Atom [dive into mark].html
│ ├── How to make a good ID in Atom [dive into mark]_files
│ │ ├── analytics.js
│ │ ├── banner-styles.css
│ │ ├── donate.html
│ │ ├── donate_data
│ │ │ ├── analytics.js
│ │ │ ├── banner.css
│ │ │ ├── donation-banner.js
│ │ │ ├── jquery-1.js
│ │ │ ├── js.js
│ │ │ └── polyfill.js
│ │ ├── iconochive.css
│ │ ├── playback.js
│ │ └── wombat.js
│ ├── Improving the Hacker News Ranking Algorithm _ Felix Dietze’s blog.html
│ ├── Improving the Hacker News Ranking Algorithm _ Felix Dietze’s blog_files
│ │ ├── all.js
│ │ ├── count.js
│ │ ├── feedback-loop-balanced.svg
│ │ ├── feedback-loop.svg
│ │ ├── hacker-news-downvotes-quality-scatterplot.png
│ │ ├── hacker-news-normalized-upvote-quality-scatterplot.png
│ │ ├── hacker-news-upvote-quality-scatterplot.png
│ │ ├── hacker-news-views-as-downvotes-quality-scatterplot.png
│ │ ├── normalize.css
│ │ ├── open-color.css
│ │ ├── styles.css
│ │ ├── submission_and_votes_distribution_over_score_intervals.svg
│ │ └── votehist.svg
│ ├── Introduction to Atom.html
│ ├── Introduction to Atom_files
│ │ ├── borderBL.gif
│ │ ├── borderBR.gif
│ │ ├── borderTL.gif
│ │ ├── borderTR.gif
│ │ └── w3c.png
│ ├── The myth of RSS compatibility [dive into mark].html
│ ├── The myth of RSS compatibility [dive into mark]_files
│ │ ├── 0596101651.jpg
│ │ ├── analytics.js
│ │ ├── banner-styles.css
│ │ ├── donate.html
│ │ ├── donate_data
│ │ │ ├── analytics.js
│ │ │ ├── banner.css
│ │ │ ├── donation-banner.js
│ │ │ ├── jquery-1.js
│ │ │ ├── js.js
│ │ │ └── polyfill.js
│ │ ├── iconochive.css
│ │ ├── playback.js
│ │ ├── show_ads.js
│ │ └── wombat.js
│ ├── Tricks to Monetize your Side Projects – Jeremy Boyd.html
│ ├── Tricks to Monetize your Side Projects – Jeremy Boyd_files
│ │ ├── 8c64c40d7162ecf436a965d5399d5422.jpeg
│ │ ├── 8c64c40d7162ecf436a965d5399d5422_002.jpeg
│ │ ├── 8c64c40d7162ecf436a965d5399d5422_003.jpeg
│ │ ├── 8c64c40d7162ecf436a965d5399d5422_004.jpeg
│ │ ├── 9d173ac02601e81a78d9980ff6ad50cf.jpeg
│ │ ├── 9d173ac02601e81a78d9980ff6ad50cf_002.jpeg
│ │ ├── CVYD42E.js
│ │ ├── a.html
│ │ ├── a_data
│ │ │ ├── analytics.js
│ │ │ ├── archive.css
│ │ │ ├── archive.js
│ │ │ ├── areact.js
│ │ │ ├── bootstrap.js
│ │ │ ├── clipboard.js
│ │ │ ├── ia-topnav.js
│ │ │ ├── ie-dom-node-remove-polyfill.js
│ │ │ ├── jquery-1.js
│ │ │ ├── jquery-ui.js
│ │ │ ├── more-facets.js
│ │ │ ├── polyfill.js
│ │ │ ├── raven.js
│ │ │ ├── react-dom.js
│ │ │ ├── react.js
│ │ │ ├── regenerator-runtime-polyfill.js
│ │ │ ├── styles.css
│ │ │ ├── web.css
│ │ │ └── webcomponents-bundle.js
│ │ ├── analytics_002.js
│ │ ├── banner-styles.css
│ │ ├── carbon.js
│ │ ├── code-820275-825x510.jpg
│ │ ├── comment-reply.html
│ │ ├── css.css
│ │ ├── devicepx-jetpack.js
│ │ ├── donate.html
│ │ ├── e-201722.js
│ │ ├── form.html
│ │ ├── forms-api.js
│ │ ├── functions.js
│ │ ├── genericons.css
│ │ ├── gprofiles.js
│ │ ├── iconochive.css
│ │ ├── jetpack.css
│ │ ├── jquery-migrate.js
│ │ ├── jquery.html
│ │ ├── jquery.js
│ │ ├── jquery_002.html
│ │ ├── master.html
│ │ ├── master_data
│ │ │ ├── a.html
│ │ │ ├── a_data
│ │ │ │ └── a.js
│ │ │ ├── jed.js
│ │ │ ├── jquery.js
│ │ │ ├── jquery_002.js
│ │ │ ├── likes-rest.js
│ │ │ ├── postmessage.js
│ │ │ └── underscore.js
│ │ ├── playback.js
│ │ ├── postmessage.html
│ │ ├── queuehandler.html
│ │ ├── related-posts.js
│ │ ├── sharing.html
│ │ ├── skip-link-focus-fix.js
│ │ ├── social-logos.css
│ │ ├── style.html
│ │ ├── twentysixteen.css
│ │ ├── wombat.js
│ │ ├── wp-embed.html
│ │ ├── wp-emoji-release.html
│ │ └── wpgroho.html
│ ├── hyphenation.org - TeX Users Group.html
│ ├── hyphenation.org - TeX Users Group_files
│ │ └── tugstyle.css
│ ├── inessential Brian’s Stupid Feed Tricks.html
│ └── inessential Brian’s Stupid Feed Tricks_files
│ │ ├── css.css
│ │ └── styles5.css
├── rfcs
│ ├── Pingback 1.0.html
│ ├── RFC 3275_ (Extensible Markup Language) XML-Signature Syntax and Processing.html
│ ├── RFC 4287 The Atom Syndication Format.html
│ └── RFC 5005 Feed Paging and Archiving.html
├── schemas
│ ├── rich-rss-0.1.xsd
│ └── rss-2_0_1-rev9.xsd
├── screenshot.png
├── web-to-fragment-feed.md
└── xsl
│ ├── feed.xml
│ └── feed.xsl
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── graphql.config.yml
├── lintDockerfile.sh
├── local.hosts
├── package.json
├── packages
├── agent
│ ├── .dockerignore
│ ├── .gitignore
│ ├── .nvmrc
│ ├── .prettierignore
│ ├── .prettierrc
│ ├── .prettierrc.json
│ ├── Dockerfile
│ ├── README.md
│ ├── agent-scope.json
│ ├── build-ghostery.sh
│ ├── build.gradle.kts
│ ├── codegen.yml
│ ├── docker-entrypoint.sh
│ ├── nest-cli.json
│ ├── package.json
│ ├── src
│ │ ├── app.controller.spec.ts
│ │ ├── app.controller.ts
│ │ ├── app.module.ts
│ │ ├── app.service.ts
│ │ ├── corrId.ts
│ │ ├── graphql-client.ts
│ │ ├── graphql
│ │ │ └── agent.graphql
│ │ ├── main.ts
│ │ └── services
│ │ │ ├── agent
│ │ │ ├── agent.module.ts
│ │ │ ├── agent.service.spec.ts
│ │ │ └── agent.service.ts
│ │ │ ├── common
│ │ │ ├── common.module.ts
│ │ │ ├── prefix-logger.service.spec.ts
│ │ │ ├── prefix-logger.service.ts
│ │ │ ├── verbose-config.service.spec.ts
│ │ │ └── verbose-config.service.ts
│ │ │ └── puppeteer
│ │ │ ├── puppeteer.controller.spec.ts
│ │ │ ├── puppeteer.controller.ts
│ │ │ ├── puppeteer.module.ts
│ │ │ ├── puppeteer.service.spec.ts
│ │ │ └── puppeteer.service.ts
│ ├── tsconfig.build.json
│ ├── tsconfig.json
│ └── yarn.lock
├── app-web
│ ├── .browserslistrc
│ ├── .dockerignore
│ ├── .editorconfig
│ ├── .eslintignore
│ ├── .eslintrc.json
│ ├── .gitignore
│ ├── .nvmrc
│ ├── .prettierignore
│ ├── .prettierrc.json
│ ├── Dockerfile
│ ├── README.md
│ ├── angular.json
│ ├── build.gradle.kts
│ ├── codegen.yml
│ ├── e2e
│ │ └── tsconfig.json
│ ├── generate-dev-app-config.sh
│ ├── generate-verticals-data.ts
│ ├── ionic.config.json
│ ├── karma-ci.conf.js
│ ├── karma.conf.js
│ ├── nginx.conf
│ ├── ngsw-config.json
│ ├── package.json
│ ├── proxy.conf.json
│ ├── src
│ │ ├── ads.txt
│ │ ├── app
│ │ │ ├── all-verticals.ts
│ │ │ ├── app-load.module.ts
│ │ │ ├── app-routing.module.ts
│ │ │ ├── app-test.module.ts
│ │ │ ├── app.component.html
│ │ │ ├── app.component.scss
│ │ │ ├── app.component.spec.ts
│ │ │ ├── app.component.ts
│ │ │ ├── app.config.ts
│ │ │ ├── app.module.ts
│ │ │ ├── components
│ │ │ │ ├── agents-button
│ │ │ │ │ ├── agents-button.component.html
│ │ │ │ │ ├── agents-button.component.scss
│ │ │ │ │ ├── agents-button.component.spec.ts
│ │ │ │ │ └── agents-button.component.ts
│ │ │ │ ├── agents
│ │ │ │ │ ├── agents.component.html
│ │ │ │ │ ├── agents.component.scss
│ │ │ │ │ ├── agents.component.spec.ts
│ │ │ │ │ └── agents.component.ts
│ │ │ │ ├── bubble
│ │ │ │ │ ├── bubble.component.html
│ │ │ │ │ ├── bubble.component.scss
│ │ │ │ │ ├── bubble.component.spec.ts
│ │ │ │ │ └── bubble.component.ts
│ │ │ │ ├── console-button
│ │ │ │ │ ├── console-button.component.html
│ │ │ │ │ ├── console-button.component.scss
│ │ │ │ │ ├── console-button.component.spec.ts
│ │ │ │ │ └── console-button.component.ts
│ │ │ │ ├── dark-mode-button
│ │ │ │ │ ├── dark-mode-button.component.html
│ │ │ │ │ ├── dark-mode-button.component.scss
│ │ │ │ │ ├── dark-mode-button.component.spec.ts
│ │ │ │ │ └── dark-mode-button.component.ts
│ │ │ │ ├── email-login
│ │ │ │ │ ├── email-login.component.html
│ │ │ │ │ ├── email-login.component.scss
│ │ │ │ │ ├── email-login.component.spec.ts
│ │ │ │ │ └── email-login.component.ts
│ │ │ │ ├── embedded-image
│ │ │ │ │ ├── embedded-image.component.html
│ │ │ │ │ ├── embedded-image.component.scss
│ │ │ │ │ ├── embedded-image.component.spec.ts
│ │ │ │ │ └── embedded-image.component.ts
│ │ │ │ ├── embedded-markup
│ │ │ │ │ ├── embedded-markup.component.html
│ │ │ │ │ ├── embedded-markup.component.scss
│ │ │ │ │ ├── embedded-markup.component.spec.ts
│ │ │ │ │ └── embedded-markup.component.ts
│ │ │ │ ├── empty-repository
│ │ │ │ │ ├── empty-repository.component.html
│ │ │ │ │ ├── empty-repository.component.scss
│ │ │ │ │ ├── empty-repository.component.spec.ts
│ │ │ │ │ └── empty-repository.component.ts
│ │ │ │ ├── feed-builder
│ │ │ │ │ ├── feed-builder.component.html
│ │ │ │ │ ├── feed-builder.component.scss
│ │ │ │ │ ├── feed-builder.component.spec.ts
│ │ │ │ │ └── feed-builder.component.ts
│ │ │ │ ├── feed-details
│ │ │ │ │ ├── feed-details.component.html
│ │ │ │ │ ├── feed-details.component.scss
│ │ │ │ │ ├── feed-details.component.spec.ts
│ │ │ │ │ └── feed-details.component.ts
│ │ │ │ ├── feedless-header
│ │ │ │ │ ├── feedless-header.component.html
│ │ │ │ │ ├── feedless-header.component.scss
│ │ │ │ │ ├── feedless-header.component.spec.ts
│ │ │ │ │ └── feedless-header.component.ts
│ │ │ │ ├── fetch-rate-accordion
│ │ │ │ │ ├── fetch-rate-accordion.component.html
│ │ │ │ │ ├── fetch-rate-accordion.component.scss
│ │ │ │ │ ├── fetch-rate-accordion.component.spec.ts
│ │ │ │ │ └── fetch-rate-accordion.component.ts
│ │ │ │ ├── filter-items-accordion
│ │ │ │ │ ├── filter-items-accordion.component.html
│ │ │ │ │ ├── filter-items-accordion.component.scss
│ │ │ │ │ ├── filter-items-accordion.component.spec.ts
│ │ │ │ │ └── filter-items-accordion.component.ts
│ │ │ │ ├── histogram
│ │ │ │ │ ├── histogram.component.html
│ │ │ │ │ ├── histogram.component.scss
│ │ │ │ │ ├── histogram.component.spec.ts
│ │ │ │ │ └── histogram.component.ts
│ │ │ │ ├── image-diff
│ │ │ │ │ ├── image-diff.component.html
│ │ │ │ │ ├── image-diff.component.scss
│ │ │ │ │ ├── image-diff.component.spec.ts
│ │ │ │ │ └── image-diff.component.ts
│ │ │ │ ├── import-button
│ │ │ │ │ ├── import-button.component.html
│ │ │ │ │ ├── import-button.component.scss
│ │ │ │ │ ├── import-button.component.spec.ts
│ │ │ │ │ └── import-button.component.ts
│ │ │ │ ├── interactive-website
│ │ │ │ │ ├── interactive-website.component.html
│ │ │ │ │ ├── interactive-website.component.scss
│ │ │ │ │ ├── interactive-website.component.spec.ts
│ │ │ │ │ ├── interactive-website.component.ts
│ │ │ │ │ ├── source-builder.spec.ts
│ │ │ │ │ └── source-builder.ts
│ │ │ │ ├── login-button
│ │ │ │ │ ├── login-button.component.html
│ │ │ │ │ ├── login-button.component.scss
│ │ │ │ │ ├── login-button.component.spec.ts
│ │ │ │ │ └── login-button.component.ts
│ │ │ │ ├── map
│ │ │ │ │ ├── map.component.html
│ │ │ │ │ ├── map.component.scss
│ │ │ │ │ ├── map.component.spec.ts
│ │ │ │ │ └── map.component.ts
│ │ │ │ ├── native-feed
│ │ │ │ │ ├── native-feed.component.html
│ │ │ │ │ ├── native-feed.component.scss
│ │ │ │ │ ├── native-feed.component.spec.ts
│ │ │ │ │ └── native-feed.component.ts
│ │ │ │ ├── notebooks
│ │ │ │ │ ├── notebooks.component.html
│ │ │ │ │ ├── notebooks.component.scss
│ │ │ │ │ ├── notebooks.component.spec.ts
│ │ │ │ │ └── notebooks.component.ts
│ │ │ │ ├── notifications-button
│ │ │ │ │ ├── notifications-button.component.html
│ │ │ │ │ ├── notifications-button.component.scss
│ │ │ │ │ ├── notifications-button.component.spec.ts
│ │ │ │ │ └── notifications-button.component.ts
│ │ │ │ ├── pagination
│ │ │ │ │ ├── pagination.component.html
│ │ │ │ │ ├── pagination.component.scss
│ │ │ │ │ ├── pagination.component.spec.ts
│ │ │ │ │ └── pagination.component.ts
│ │ │ │ ├── plan-column
│ │ │ │ │ ├── plan-column.component.html
│ │ │ │ │ ├── plan-column.component.scss
│ │ │ │ │ ├── plan-column.component.spec.ts
│ │ │ │ │ └── plan-column.component.ts
│ │ │ │ ├── player
│ │ │ │ │ ├── player.component.html
│ │ │ │ │ ├── player.component.scss
│ │ │ │ │ ├── player.component.spec.ts
│ │ │ │ │ └── player.component.ts
│ │ │ │ ├── pricing
│ │ │ │ │ ├── pricing.component.html
│ │ │ │ │ ├── pricing.component.scss
│ │ │ │ │ ├── pricing.component.spec.ts
│ │ │ │ │ └── pricing.component.ts
│ │ │ │ ├── product-header
│ │ │ │ │ ├── product-header.component.html
│ │ │ │ │ ├── product-header.component.scss
│ │ │ │ │ ├── product-header.component.spec.ts
│ │ │ │ │ └── product-header.component.ts
│ │ │ │ ├── product-headline
│ │ │ │ │ ├── product-headline.component.html
│ │ │ │ │ ├── product-headline.component.scss
│ │ │ │ │ ├── product-headline.component.spec.ts
│ │ │ │ │ └── product-headline.component.ts
│ │ │ │ ├── product-title
│ │ │ │ │ ├── product-title.component.html
│ │ │ │ │ ├── product-title.component.scss
│ │ │ │ │ ├── product-title.component.spec.ts
│ │ │ │ │ └── product-title.component.ts
│ │ │ │ ├── reader
│ │ │ │ │ ├── reader.component.html
│ │ │ │ │ ├── reader.component.scss
│ │ │ │ │ ├── reader.component.spec.ts
│ │ │ │ │ └── reader.component.ts
│ │ │ │ ├── remote-feed-item
│ │ │ │ │ ├── remote-feed-item.component.html
│ │ │ │ │ ├── remote-feed-item.component.scss
│ │ │ │ │ ├── remote-feed-item.component.spec.ts
│ │ │ │ │ └── remote-feed-item.component.ts
│ │ │ │ ├── remote-feed-preview
│ │ │ │ │ ├── remote-feed-preview.component.html
│ │ │ │ │ ├── remote-feed-preview.component.scss
│ │ │ │ │ ├── remote-feed-preview.component.spec.ts
│ │ │ │ │ └── remote-feed-preview.component.ts
│ │ │ │ ├── repositories-button
│ │ │ │ │ ├── repositories-button.component.html
│ │ │ │ │ ├── repositories-button.component.scss
│ │ │ │ │ ├── repositories-button.component.spec.ts
│ │ │ │ │ └── repositories-button.component.ts
│ │ │ │ ├── responsive-columns
│ │ │ │ │ ├── responsive-columns.component.html
│ │ │ │ │ ├── responsive-columns.component.scss
│ │ │ │ │ ├── responsive-columns.component.spec.ts
│ │ │ │ │ └── responsive-columns.component.ts
│ │ │ │ ├── segmented-output
│ │ │ │ │ ├── segmented-output.component.html
│ │ │ │ │ ├── segmented-output.component.scss
│ │ │ │ │ ├── segmented-output.component.spec.ts
│ │ │ │ │ └── segmented-output.component.ts
│ │ │ │ ├── table
│ │ │ │ │ ├── table.component.html
│ │ │ │ │ ├── table.component.scss
│ │ │ │ │ ├── table.component.spec.ts
│ │ │ │ │ └── table.component.ts
│ │ │ │ ├── text-diff
│ │ │ │ │ ├── text-diff.component.html
│ │ │ │ │ ├── text-diff.component.scss
│ │ │ │ │ ├── text-diff.component.spec.ts
│ │ │ │ │ └── text-diff.component.ts
│ │ │ │ ├── transform-website-to-feed
│ │ │ │ │ ├── transform-website-to-feed.component.html
│ │ │ │ │ ├── transform-website-to-feed.component.scss
│ │ │ │ │ ├── transform-website-to-feed.component.spec.ts
│ │ │ │ │ └── transform-website-to-feed.component.ts
│ │ │ │ ├── trial-warning
│ │ │ │ │ ├── trial-warning.component.html
│ │ │ │ │ ├── trial-warning.component.scss
│ │ │ │ │ ├── trial-warning.component.spec.ts
│ │ │ │ │ └── trial-warning.component.ts
│ │ │ │ └── workflow-builder
│ │ │ │ │ ├── workflow-builder.component.html
│ │ │ │ │ ├── workflow-builder.component.scss
│ │ │ │ │ ├── workflow-builder.component.spec.ts
│ │ │ │ │ └── workflow-builder.component.ts
│ │ │ ├── defaults.ts
│ │ │ ├── directives
│ │ │ │ ├── control-value-accessor
│ │ │ │ │ └── control-value-accessor.directive.ts
│ │ │ │ ├── localize
│ │ │ │ │ └── localize.directive.ts
│ │ │ │ └── remove-if-prod
│ │ │ │ │ └── remove-if-prod.directive.ts
│ │ │ ├── elements
│ │ │ │ ├── code-editor
│ │ │ │ │ ├── checkbox.widget.ts
│ │ │ │ │ ├── code-editor.component.html
│ │ │ │ │ ├── code-editor.component.scss
│ │ │ │ │ ├── code-editor.component.spec.ts
│ │ │ │ │ ├── code-editor.component.ts
│ │ │ │ │ ├── hashtag.widget.ts
│ │ │ │ │ ├── inline-image.widget.ts
│ │ │ │ │ ├── line.decorator.ts
│ │ │ │ │ ├── markdown.decorator.ts
│ │ │ │ │ ├── markdown.lang.ts
│ │ │ │ │ ├── theme.ts
│ │ │ │ │ └── url.decorator.ts
│ │ │ │ ├── input
│ │ │ │ │ ├── input.component.html
│ │ │ │ │ ├── input.component.scss
│ │ │ │ │ ├── input.component.spec.ts
│ │ │ │ │ └── input.component.ts
│ │ │ │ ├── menu
│ │ │ │ │ ├── menu.component.html
│ │ │ │ │ ├── menu.component.scss
│ │ │ │ │ ├── menu.component.spec.ts
│ │ │ │ │ └── menu.component.ts
│ │ │ │ ├── searchbar
│ │ │ │ │ ├── searchbar.component.html
│ │ │ │ │ ├── searchbar.component.scss
│ │ │ │ │ ├── searchbar.component.spec.ts
│ │ │ │ │ └── searchbar.component.ts
│ │ │ │ └── select
│ │ │ │ │ ├── select.component.html
│ │ │ │ │ ├── select.component.scss
│ │ │ │ │ ├── select.component.spec.ts
│ │ │ │ │ └── select.component.ts
│ │ │ ├── form-controls.ts
│ │ │ ├── graphql
│ │ │ │ ├── agents.graphql
│ │ │ │ ├── annotation.graphql
│ │ │ │ ├── auth.graphql
│ │ │ │ ├── connectedApp.graphql
│ │ │ │ ├── event.graphql
│ │ │ │ ├── feature.graphql
│ │ │ │ ├── fragments.graphql
│ │ │ │ ├── license.graphql
│ │ │ │ ├── order.graphql
│ │ │ │ ├── plugins.graphql
│ │ │ │ ├── product.graphql
│ │ │ │ ├── record.graphql
│ │ │ │ ├── report.graphql
│ │ │ │ ├── repositories.graphql
│ │ │ │ ├── scrape.graphql
│ │ │ │ ├── serverConfig.graphql
│ │ │ │ ├── session.graphql
│ │ │ │ └── types.ts
│ │ │ ├── guards
│ │ │ │ ├── auth-guard.service.ts
│ │ │ │ ├── profile-guard.service.ts
│ │ │ │ ├── saas-guard.service.ts
│ │ │ │ └── self-hosting-guard.service.ts
│ │ │ ├── modals
│ │ │ │ ├── code-editor-modal
│ │ │ │ │ ├── code-editor-modal.component.html
│ │ │ │ │ ├── code-editor-modal.component.scss
│ │ │ │ │ ├── code-editor-modal.component.spec.ts
│ │ │ │ │ ├── code-editor-modal.component.ts
│ │ │ │ │ └── code-editor-modal.module.ts
│ │ │ │ ├── feed-builder-modal
│ │ │ │ │ ├── feed-builder-modal.component.html
│ │ │ │ │ ├── feed-builder-modal.component.scss
│ │ │ │ │ ├── feed-builder-modal.component.spec.ts
│ │ │ │ │ ├── feed-builder-modal.component.ts
│ │ │ │ │ └── feed-builder-modal.module.ts
│ │ │ │ ├── import-opml-modal
│ │ │ │ │ ├── import-opml-modal.component.html
│ │ │ │ │ ├── import-opml-modal.component.scss
│ │ │ │ │ ├── import-opml-modal.component.spec.ts
│ │ │ │ │ ├── import-opml-modal.component.ts
│ │ │ │ │ └── import-opml-modal.module.ts
│ │ │ │ ├── interactive-website-modal
│ │ │ │ │ ├── interactive-website-controller.ts
│ │ │ │ │ ├── interactive-website-modal.component.html
│ │ │ │ │ ├── interactive-website-modal.component.scss
│ │ │ │ │ ├── interactive-website-modal.component.spec.ts
│ │ │ │ │ ├── interactive-website-modal.component.ts
│ │ │ │ │ └── interactive-website-modal.module.ts
│ │ │ │ ├── map-modal
│ │ │ │ │ ├── map-modal.component.html
│ │ │ │ │ ├── map-modal.component.scss
│ │ │ │ │ ├── map-modal.component.spec.ts
│ │ │ │ │ ├── map-modal.component.ts
│ │ │ │ │ └── map-modal.module.ts
│ │ │ │ ├── repository-modal
│ │ │ │ │ ├── repository-modal.component.html
│ │ │ │ │ ├── repository-modal.component.scss
│ │ │ │ │ ├── repository-modal.component.spec.ts
│ │ │ │ │ ├── repository-modal.component.ts
│ │ │ │ │ └── repository-modal.module.ts
│ │ │ │ ├── search-address-modal
│ │ │ │ │ ├── search-address-modal.component.html
│ │ │ │ │ ├── search-address-modal.component.scss
│ │ │ │ │ ├── search-address-modal.component.spec.ts
│ │ │ │ │ ├── search-address-modal.component.ts
│ │ │ │ │ └── search-address-modal.module.ts
│ │ │ │ ├── selection-modal
│ │ │ │ │ ├── selection-modal.component.html
│ │ │ │ │ ├── selection-modal.component.scss
│ │ │ │ │ ├── selection-modal.component.spec.ts
│ │ │ │ │ ├── selection-modal.component.ts
│ │ │ │ │ └── selection-modal.module.ts
│ │ │ │ └── tags-modal
│ │ │ │ │ ├── tags-modal.component.html
│ │ │ │ │ ├── tags-modal.component.scss
│ │ │ │ │ ├── tags-modal.component.spec.ts
│ │ │ │ │ ├── tags-modal.component.ts
│ │ │ │ │ └── tags-modal.module.ts
│ │ │ ├── offline.module.ts
│ │ │ ├── pages
│ │ │ │ ├── agents
│ │ │ │ │ ├── agents.page.html
│ │ │ │ │ ├── agents.page.scss
│ │ │ │ │ ├── agents.page.spec.ts
│ │ │ │ │ ├── agents.page.ts
│ │ │ │ │ └── agents.routes.ts
│ │ │ │ ├── billings
│ │ │ │ │ ├── billings.page.html
│ │ │ │ │ ├── billings.page.scss
│ │ │ │ │ ├── billings.page.spec.ts
│ │ │ │ │ ├── billings.page.ts
│ │ │ │ │ └── billings.routes.ts
│ │ │ │ ├── checkout
│ │ │ │ │ ├── checkout.page.html
│ │ │ │ │ ├── checkout.page.scss
│ │ │ │ │ ├── checkout.page.spec.ts
│ │ │ │ │ ├── checkout.page.ts
│ │ │ │ │ └── checkout.routes.ts
│ │ │ │ ├── connect-app
│ │ │ │ │ ├── connect-app.page.html
│ │ │ │ │ ├── connect-app.page.scss
│ │ │ │ │ ├── connect-app.page.spec.ts
│ │ │ │ │ ├── connect-app.page.ts
│ │ │ │ │ └── connect-app.routes.ts
│ │ │ │ ├── contact
│ │ │ │ │ ├── contact.page.html
│ │ │ │ │ ├── contact.page.scss
│ │ │ │ │ ├── contact.page.spec.ts
│ │ │ │ │ ├── contact.page.ts
│ │ │ │ │ └── contact.routes.ts
│ │ │ │ ├── directory
│ │ │ │ │ ├── directory.page.html
│ │ │ │ │ ├── directory.page.scss
│ │ │ │ │ ├── directory.page.spec.ts
│ │ │ │ │ ├── directory.page.ts
│ │ │ │ │ └── directory.routes.ts
│ │ │ │ ├── documents
│ │ │ │ │ ├── documents.page.html
│ │ │ │ │ ├── documents.page.scss
│ │ │ │ │ ├── documents.page.ts
│ │ │ │ │ ├── documents.routes.ts
│ │ │ │ │ ├── telegram.page.html
│ │ │ │ │ ├── telegram.page.ts
│ │ │ │ │ ├── terms.page.html
│ │ │ │ │ └── terms.page.ts
│ │ │ │ ├── feed-builder
│ │ │ │ │ ├── feed-builder.page.html
│ │ │ │ │ ├── feed-builder.page.scss
│ │ │ │ │ ├── feed-builder.page.spec.ts
│ │ │ │ │ ├── feed-builder.page.ts
│ │ │ │ │ └── feed-builder.routes.ts
│ │ │ │ ├── feed-details
│ │ │ │ │ ├── feed-details.page.html
│ │ │ │ │ ├── feed-details.page.scss
│ │ │ │ │ ├── feed-details.page.spec.ts
│ │ │ │ │ ├── feed-details.page.ts
│ │ │ │ │ └── feed-details.routes.ts
│ │ │ │ ├── feeds
│ │ │ │ │ ├── feeds.page.html
│ │ │ │ │ ├── feeds.page.scss
│ │ │ │ │ ├── feeds.page.spec.ts
│ │ │ │ │ ├── feeds.page.ts
│ │ │ │ │ └── feeds.routes.ts
│ │ │ │ ├── license
│ │ │ │ │ ├── license.page.html
│ │ │ │ │ ├── license.page.scss
│ │ │ │ │ ├── license.page.spec.ts
│ │ │ │ │ ├── license.page.ts
│ │ │ │ │ └── license.routes.ts
│ │ │ │ ├── login
│ │ │ │ │ ├── login.page.html
│ │ │ │ │ ├── login.page.scss
│ │ │ │ │ ├── login.page.spec.ts
│ │ │ │ │ ├── login.page.ts
│ │ │ │ │ └── login.routes.ts
│ │ │ │ ├── notebook-details
│ │ │ │ │ ├── note-reference-marker.ts
│ │ │ │ │ ├── note-reference-widget.ts
│ │ │ │ │ ├── notebook-details.page.html
│ │ │ │ │ ├── notebook-details.page.scss
│ │ │ │ │ ├── notebook-details.page.spec.ts
│ │ │ │ │ ├── notebook-details.page.ts
│ │ │ │ │ └── notebook-details.routes.ts
│ │ │ │ ├── notebooks
│ │ │ │ │ ├── notebooks.page.html
│ │ │ │ │ ├── notebooks.page.scss
│ │ │ │ │ ├── notebooks.page.spec.ts
│ │ │ │ │ ├── notebooks.page.ts
│ │ │ │ │ └── notebooks.routes.ts
│ │ │ │ ├── payment-summary
│ │ │ │ │ ├── payment-summary.page.html
│ │ │ │ │ ├── payment-summary.page.scss
│ │ │ │ │ ├── payment-summary.page.spec.ts
│ │ │ │ │ ├── payment-summary.page.ts
│ │ │ │ │ └── payment-summary.routes.ts
│ │ │ │ ├── payment
│ │ │ │ │ ├── payment.page.html
│ │ │ │ │ ├── payment.page.scss
│ │ │ │ │ ├── payment.page.spec.ts
│ │ │ │ │ ├── payment.page.ts
│ │ │ │ │ └── payment.routes.ts
│ │ │ │ ├── pricing
│ │ │ │ │ ├── pricing.page.html
│ │ │ │ │ ├── pricing.page.scss
│ │ │ │ │ ├── pricing.page.spec.ts
│ │ │ │ │ ├── pricing.page.ts
│ │ │ │ │ └── pricing.routes.ts
│ │ │ │ ├── privacy
│ │ │ │ │ ├── privacy.page.html
│ │ │ │ │ ├── privacy.page.scss
│ │ │ │ │ ├── privacy.page.spec.ts
│ │ │ │ │ ├── privacy.page.ts
│ │ │ │ │ └── privacy.routes.ts
│ │ │ │ ├── profile
│ │ │ │ │ ├── profile.page.html
│ │ │ │ │ ├── profile.page.scss
│ │ │ │ │ ├── profile.page.spec.ts
│ │ │ │ │ ├── profile.page.ts
│ │ │ │ │ └── profile.routes.ts
│ │ │ │ ├── report
│ │ │ │ │ ├── report.page.html
│ │ │ │ │ ├── report.page.scss
│ │ │ │ │ ├── report.page.spec.ts
│ │ │ │ │ ├── report.page.ts
│ │ │ │ │ └── report.routes.ts
│ │ │ │ ├── settings
│ │ │ │ │ ├── settings.page.html
│ │ │ │ │ ├── settings.page.scss
│ │ │ │ │ ├── settings.page.spec.ts
│ │ │ │ │ ├── settings.page.ts
│ │ │ │ │ └── settings.routes.ts
│ │ │ │ ├── tracker-edit
│ │ │ │ │ ├── tracker-edit.page.html
│ │ │ │ │ ├── tracker-edit.page.scss
│ │ │ │ │ ├── tracker-edit.page.spec.ts
│ │ │ │ │ ├── tracker-edit.page.ts
│ │ │ │ │ └── tracker-edit.routes.ts
│ │ │ │ └── workflow-builder
│ │ │ │ │ ├── workflow-builder.page.html
│ │ │ │ │ ├── workflow-builder.page.scss
│ │ │ │ │ ├── workflow-builder.page.spec.ts
│ │ │ │ │ ├── workflow-builder.page.ts
│ │ │ │ │ └── workflow-builder.routes.ts
│ │ │ ├── products
│ │ │ │ ├── change-tracker
│ │ │ │ │ ├── about
│ │ │ │ │ │ ├── about-tracker.page.html
│ │ │ │ │ │ ├── about-tracker.page.scss
│ │ │ │ │ │ ├── about-tracker.page.spec.ts
│ │ │ │ │ │ └── about-tracker.page.ts
│ │ │ │ │ ├── change-tracker-product.page.html
│ │ │ │ │ ├── change-tracker-product.page.scss
│ │ │ │ │ ├── change-tracker-product.page.spec.ts
│ │ │ │ │ ├── change-tracker-product.page.ts
│ │ │ │ │ ├── change-tracker-product.routes.ts
│ │ │ │ │ ├── tracker-details
│ │ │ │ │ │ ├── tracker-details.page.html
│ │ │ │ │ │ ├── tracker-details.page.scss
│ │ │ │ │ │ ├── tracker-details.page.spec.ts
│ │ │ │ │ │ └── tracker-details.page.ts
│ │ │ │ │ └── tracker-edit
│ │ │ │ │ │ ├── tracker-edit-modal.component.html
│ │ │ │ │ │ ├── tracker-edit-modal.component.scss
│ │ │ │ │ │ ├── tracker-edit-modal.component.spec.ts
│ │ │ │ │ │ ├── tracker-edit-modal.component.ts
│ │ │ │ │ │ └── tracker-edit-modal.module.ts
│ │ │ │ ├── default-routes.ts
│ │ │ │ ├── feedless
│ │ │ │ │ ├── about
│ │ │ │ │ │ ├── about-feedless.page.html
│ │ │ │ │ │ ├── about-feedless.page.scss
│ │ │ │ │ │ ├── about-feedless.page.spec.ts
│ │ │ │ │ │ └── about-feedless.page.ts
│ │ │ │ │ ├── feedless-menu
│ │ │ │ │ │ ├── feedless-menu.component.html
│ │ │ │ │ │ ├── feedless-menu.component.scss
│ │ │ │ │ │ ├── feedless-menu.component.spec.ts
│ │ │ │ │ │ └── feedless-menu.component.ts
│ │ │ │ │ ├── feedless-product.page.html
│ │ │ │ │ ├── feedless-product.page.scss
│ │ │ │ │ ├── feedless-product.page.spec.ts
│ │ │ │ │ ├── feedless-product.page.ts
│ │ │ │ │ ├── feedless-product.routes.ts
│ │ │ │ │ └── products
│ │ │ │ │ │ ├── products-routes.ts
│ │ │ │ │ │ ├── products.page.html
│ │ │ │ │ │ ├── products.page.scss
│ │ │ │ │ │ ├── products.page.spec.ts
│ │ │ │ │ │ └── products.page.ts
│ │ │ │ ├── reader
│ │ │ │ │ ├── reader-menu
│ │ │ │ │ │ ├── reader-menu.component.html
│ │ │ │ │ │ ├── reader-menu.component.scss
│ │ │ │ │ │ ├── reader-menu.component.spec.ts
│ │ │ │ │ │ └── reader-menu.component.ts
│ │ │ │ │ ├── reader-product.page.html
│ │ │ │ │ ├── reader-product.page.scss
│ │ │ │ │ ├── reader-product.page.spec.ts
│ │ │ │ │ ├── reader-product.page.ts
│ │ │ │ │ └── reader-product.routes.ts
│ │ │ │ ├── rss-builder
│ │ │ │ │ ├── about
│ │ │ │ │ │ ├── about-rss-builder.page.html
│ │ │ │ │ │ ├── about-rss-builder.page.scss
│ │ │ │ │ │ ├── about-rss-builder.page.spec.ts
│ │ │ │ │ │ └── about-rss-builder.page.ts
│ │ │ │ │ ├── rss-builder-product.page.html
│ │ │ │ │ ├── rss-builder-product.page.scss
│ │ │ │ │ ├── rss-builder-product.page.spec.ts
│ │ │ │ │ ├── rss-builder-product.page.ts
│ │ │ │ │ ├── rss-builder-product.routes.ts
│ │ │ │ │ └── setup
│ │ │ │ │ │ ├── setup.page.html
│ │ │ │ │ │ ├── setup.page.scss
│ │ │ │ │ │ ├── setup.page.spec.ts
│ │ │ │ │ │ └── setup.page.ts
│ │ │ │ ├── untold-notes
│ │ │ │ │ ├── about
│ │ │ │ │ │ ├── about-untold-notes.page.html
│ │ │ │ │ │ ├── about-untold-notes.page.scss
│ │ │ │ │ │ ├── about-untold-notes.page.spec.ts
│ │ │ │ │ │ └── about-untold-notes.page.ts
│ │ │ │ │ ├── untold-mixins.scss
│ │ │ │ │ ├── untold-notes-product.page.html
│ │ │ │ │ ├── untold-notes-product.page.scss
│ │ │ │ │ ├── untold-notes-product.page.spec.ts
│ │ │ │ │ ├── untold-notes-product.page.ts
│ │ │ │ │ └── untold-notes-product.routes.ts
│ │ │ │ ├── upcoming
│ │ │ │ │ ├── about-us
│ │ │ │ │ │ ├── about-us.page.html
│ │ │ │ │ │ ├── about-us.page.scss
│ │ │ │ │ │ ├── about-us.page.spec.ts
│ │ │ │ │ │ └── about-us.page.ts
│ │ │ │ │ ├── event
│ │ │ │ │ │ ├── event.page.html
│ │ │ │ │ │ ├── event.page.scss
│ │ │ │ │ │ ├── event.page.spec.ts
│ │ │ │ │ │ └── event.page.ts
│ │ │ │ │ ├── events
│ │ │ │ │ │ ├── events.page.html
│ │ │ │ │ │ ├── events.page.scss
│ │ │ │ │ │ ├── events.page.spec.ts
│ │ │ │ │ │ └── events.page.ts
│ │ │ │ │ ├── places.ts
│ │ │ │ │ ├── submit-modal
│ │ │ │ │ │ ├── submit-modal.component.html
│ │ │ │ │ │ ├── submit-modal.component.scss
│ │ │ │ │ │ ├── submit-modal.component.spec.ts
│ │ │ │ │ │ ├── submit-modal.component.ts
│ │ │ │ │ │ └── submit-modal.module.ts
│ │ │ │ │ ├── terms
│ │ │ │ │ │ ├── terms.page.html
│ │ │ │ │ │ ├── terms.page.scss
│ │ │ │ │ │ ├── terms.page.spec.ts
│ │ │ │ │ │ └── terms.page.ts
│ │ │ │ │ ├── upcoming-footer
│ │ │ │ │ │ ├── upcoming-footer.component.html
│ │ │ │ │ │ ├── upcoming-footer.component.scss
│ │ │ │ │ │ ├── upcoming-footer.component.spec.ts
│ │ │ │ │ │ └── upcoming-footer.component.ts
│ │ │ │ │ ├── upcoming-header
│ │ │ │ │ │ ├── upcoming-header.component.html
│ │ │ │ │ │ ├── upcoming-header.component.scss
│ │ │ │ │ │ ├── upcoming-header.component.spec.ts
│ │ │ │ │ │ └── upcoming-header.component.ts
│ │ │ │ │ ├── upcoming-mixins.scss
│ │ │ │ │ ├── upcoming-product-routes.ts
│ │ │ │ │ └── upcoming-product.module.ts
│ │ │ │ └── visual-diff
│ │ │ │ │ ├── about
│ │ │ │ │ ├── about-visual-diff.page.html
│ │ │ │ │ ├── about-visual-diff.page.scss
│ │ │ │ │ ├── about-visual-diff.page.spec.ts
│ │ │ │ │ └── about-visual-diff.page.ts
│ │ │ │ │ ├── visual-diff-product-routes.ts
│ │ │ │ │ ├── visual-diff-product.page.html
│ │ │ │ │ ├── visual-diff-product.page.scss
│ │ │ │ │ ├── visual-diff-product.page.spec.ts
│ │ │ │ │ └── visual-diff-product.page.ts
│ │ │ ├── router-utils.ts
│ │ │ ├── services
│ │ │ │ ├── agent.service.ts
│ │ │ │ ├── annotation.service.ts
│ │ │ │ ├── apollo-abort-controller.service.ts
│ │ │ │ ├── app-config.service.spec.ts
│ │ │ │ ├── app-config.service.ts
│ │ │ │ ├── app-update.service.ts
│ │ │ │ ├── auth.service.spec.ts
│ │ │ │ ├── auth.service.ts
│ │ │ │ ├── connected-app.service.ts
│ │ │ │ ├── feature.service.ts
│ │ │ │ ├── file.service.ts
│ │ │ │ ├── geo.service.ts
│ │ │ │ ├── http-error-interceptor.service.ts
│ │ │ │ ├── license.service.ts
│ │ │ │ ├── modal.service.ts
│ │ │ │ ├── notebook-health.service.ts
│ │ │ │ ├── notebook-repository.ts
│ │ │ │ ├── notebook.service.ts
│ │ │ │ ├── open-street-map.service.ts
│ │ │ │ ├── opml.service.ts
│ │ │ │ ├── order.service.ts
│ │ │ │ ├── page.service.ts
│ │ │ │ ├── plugin.service.ts
│ │ │ │ ├── product.service.ts
│ │ │ │ ├── record.service.ts
│ │ │ │ ├── report.service.ts
│ │ │ │ ├── repository.service.ts
│ │ │ │ ├── scrape.service.spec.ts
│ │ │ │ ├── scrape.service.ts
│ │ │ │ ├── server-config.service.spec.ts
│ │ │ │ ├── server-config.service.ts
│ │ │ │ ├── session.service.spec.ts
│ │ │ │ ├── session.service.ts
│ │ │ │ ├── upload.service.spec.ts
│ │ │ │ └── upload.service.ts
│ │ │ └── types.ts
│ │ ├── assets
│ │ │ ├── archive.jpeg
│ │ │ ├── feedless.jpeg
│ │ │ ├── i18n
│ │ │ │ └── upcoming
│ │ │ │ │ ├── de.json
│ │ │ │ │ └── en.json
│ │ │ ├── icon
│ │ │ │ └── favicon.png
│ │ │ ├── icons
│ │ │ │ ├── icon-128x128.png
│ │ │ │ ├── icon-144x144.png
│ │ │ │ ├── icon-152x152.png
│ │ │ │ ├── icon-192x192.png
│ │ │ │ ├── icon-384x384.png
│ │ │ │ ├── icon-512x512.png
│ │ │ │ ├── icon-72x72.png
│ │ │ │ └── icon-96x96.png
│ │ │ ├── mail-digest.jpeg
│ │ │ ├── reader.jpeg
│ │ │ ├── rss-proxy.jpeg
│ │ │ ├── tg-bot-start.webp
│ │ │ ├── tg-connect.webp
│ │ │ ├── tg-link.webp
│ │ │ ├── tg-linked.webp
│ │ │ ├── tg-push.webp
│ │ │ ├── tg-repo-settings.webp
│ │ │ ├── tg-search.webp
│ │ │ ├── untold.jpeg
│ │ │ ├── upcoming.jpeg
│ │ │ ├── video-preview.webp
│ │ │ └── visual-diff.jpeg
│ │ ├── browserconfig.xml
│ │ ├── environments
│ │ │ ├── environment.prod.ts
│ │ │ └── environment.ts
│ │ ├── global.scss
│ │ ├── index.html
│ │ ├── main.ts
│ │ ├── manifest.webmanifest
│ │ ├── mixins.scss
│ │ ├── test
│ │ │ ├── apollo-client.mock.ts
│ │ │ └── sw-update.mock.ts
│ │ ├── theme
│ │ │ └── variables.scss
│ │ └── zone-flags.ts
│ ├── tsconfig.app.json
│ ├── tsconfig.json
│ ├── tsconfig.spec.json
│ └── yarn.lock
└── server-core
│ ├── .dockerignore
│ ├── .gitignore
│ ├── Dockerfile
│ ├── README.md
│ ├── build.gradle.kts
│ ├── docker-entrypoint.sh
│ ├── fetchGithubJars.sh
│ ├── pre-boot.sh
│ ├── src
│ ├── main
│ │ ├── kotlin
│ │ │ └── org
│ │ │ │ └── migor
│ │ │ │ └── feedless
│ │ │ │ ├── AppInitListener.kt
│ │ │ │ ├── AppMetrics.kt
│ │ │ │ ├── AppProfiles.kt
│ │ │ │ ├── Exceptions.kt
│ │ │ │ ├── FeedlessApplication.kt
│ │ │ │ ├── actions
│ │ │ │ ├── ClickPositionActionEntity.kt
│ │ │ │ ├── ClickXpathActionEntity.kt
│ │ │ │ ├── DomActionEntity.kt
│ │ │ │ ├── ExecuteActionEntity.kt
│ │ │ │ ├── ExtractBoundingBoxActionEntity.kt
│ │ │ │ ├── ExtractXpathActionEntity.kt
│ │ │ │ ├── FetchActionEntity.kt
│ │ │ │ ├── HeaderActionEntity.kt
│ │ │ │ ├── PluginExecutionJsonEntity.kt
│ │ │ │ ├── ScrapeActionDAO.kt
│ │ │ │ ├── ScrapeActionEntity.kt
│ │ │ │ ├── WaitActionEntity.kt
│ │ │ │ ├── XPathConstraint.kt
│ │ │ │ └── XPathValidator.kt
│ │ │ │ ├── agent
│ │ │ │ ├── AgentDAO.kt
│ │ │ │ ├── AgentEntity.kt
│ │ │ │ ├── AgentResolver.kt
│ │ │ │ ├── AgentService.kt
│ │ │ │ └── AgentSyncExecutor.kt
│ │ │ │ ├── analytics
│ │ │ │ ├── AnalyticsService.kt
│ │ │ │ └── Tracked.kt
│ │ │ │ ├── annotation
│ │ │ │ ├── AnnotationDAO.kt
│ │ │ │ ├── AnnotationEntity.kt
│ │ │ │ ├── AnnotationResolver.kt
│ │ │ │ ├── AnnotationService.kt
│ │ │ │ ├── TextAnnotationDAO.kt
│ │ │ │ ├── TextAnnotationEntity.kt
│ │ │ │ ├── VoteDAO.kt
│ │ │ │ └── VoteEntity.kt
│ │ │ │ ├── api
│ │ │ │ ├── ApiParams.kt
│ │ │ │ ├── ApiUrls.kt
│ │ │ │ ├── Mappers.kt
│ │ │ │ ├── graphql
│ │ │ │ │ ├── GraphQLExceptionHandler.kt
│ │ │ │ │ └── ServerConfigResolver.kt
│ │ │ │ ├── http
│ │ │ │ │ ├── AppErrorController.kt
│ │ │ │ │ ├── HttpExceptionHandler.kt
│ │ │ │ │ └── TestingEndpoint.kt
│ │ │ │ └── throttle
│ │ │ │ │ ├── IpThrottleService.kt
│ │ │ │ │ ├── ThrottleAspect.kt
│ │ │ │ │ └── Throttled.kt
│ │ │ │ ├── attachment
│ │ │ │ ├── AttachmentController.kt
│ │ │ │ ├── AttachmentDAO.kt
│ │ │ │ ├── AttachmentEntity.kt
│ │ │ │ └── AttachmentService.kt
│ │ │ │ ├── common
│ │ │ │ ├── CacheKeyGenerator.kt
│ │ │ │ ├── CleanupExecutor.kt
│ │ │ │ ├── HttpService.kt
│ │ │ │ ├── InMemorySinkRepository.kt
│ │ │ │ ├── PdfService.kt
│ │ │ │ └── PropertyService.kt
│ │ │ │ ├── community
│ │ │ │ ├── CommentDAO.kt
│ │ │ │ ├── CommentEntity.kt
│ │ │ │ ├── CommentGraphService.kt
│ │ │ │ ├── LanguageService.kt
│ │ │ │ ├── PartOfSpeechService.kt
│ │ │ │ ├── ScoreService.kt
│ │ │ │ ├── StemmerService.kt
│ │ │ │ ├── StoryEntity.kt
│ │ │ │ ├── TokenizerService.kt
│ │ │ │ └── text
│ │ │ │ │ ├── complex
│ │ │ │ │ ├── CivilityScorer.kt
│ │ │ │ │ ├── OriginalityScorer.kt
│ │ │ │ │ ├── QualityScorer.kt
│ │ │ │ │ └── RelevanceScorer.kt
│ │ │ │ │ ├── hyphenation
│ │ │ │ │ ├── HyphenationPattern.kt
│ │ │ │ │ └── Hyphenator.kt
│ │ │ │ │ └── simple
│ │ │ │ │ ├── CitationScorer.kt
│ │ │ │ │ ├── DuplicateContentScorer.kt
│ │ │ │ │ ├── EngagementScorer.kt
│ │ │ │ │ ├── KeywordIntersectionScorer.kt
│ │ │ │ │ ├── NoveltyScorer.kt
│ │ │ │ │ ├── ReadingEaseScorer.kt
│ │ │ │ │ ├── SpamScorer.kt
│ │ │ │ │ ├── SpellingScorer.kt
│ │ │ │ │ ├── VocabularyScorer.kt
│ │ │ │ │ └── WordCountScorer.kt
│ │ │ │ ├── config
│ │ │ │ ├── CacheConfig.kt
│ │ │ │ ├── CacheEventLogger.kt
│ │ │ │ ├── CustomDgsWebSocketConfig.kt
│ │ │ │ ├── CustomSQLDialect.kt
│ │ │ │ ├── CustomSQLFunctions.kt
│ │ │ │ ├── DatabaseConfig.kt
│ │ │ │ ├── FlywayConfig.kt
│ │ │ │ ├── GraphqlConfig.kt
│ │ │ │ ├── PostStartupVerificationService.kt
│ │ │ │ ├── SecurityConfig.kt
│ │ │ │ ├── SystemSettingsDAO.kt
│ │ │ │ ├── SystemSettingsEntity.kt
│ │ │ │ └── TemplateConfig.kt
│ │ │ │ ├── data
│ │ │ │ └── jpa
│ │ │ │ │ ├── EntityWithUUID.kt
│ │ │ │ │ ├── Seeder.kt
│ │ │ │ │ ├── StandardJpaFields.kt
│ │ │ │ │ └── enums
│ │ │ │ │ ├── EntityVisibility.kt
│ │ │ │ │ ├── ReleaseStatus.kt
│ │ │ │ │ └── Vertical.kt
│ │ │ │ ├── document
│ │ │ │ ├── DocumentController.kt
│ │ │ │ ├── DocumentDAO.kt
│ │ │ │ ├── DocumentEntity.kt
│ │ │ │ ├── DocumentResolver.kt
│ │ │ │ ├── DocumentService.kt
│ │ │ │ └── filter
│ │ │ │ │ └── FilterByExpression.jj
│ │ │ │ ├── feature
│ │ │ │ ├── FeatureDAO.kt
│ │ │ │ ├── FeatureEntity.kt
│ │ │ │ ├── FeatureGroupDAO.kt
│ │ │ │ ├── FeatureGroupEntity.kt
│ │ │ │ ├── FeatureResolver.kt
│ │ │ │ ├── FeatureService.kt
│ │ │ │ ├── FeatureStates.kt
│ │ │ │ ├── FeatureValueDAO.kt
│ │ │ │ ├── FeatureValueEntity.kt
│ │ │ │ └── FeatureValueType.kt
│ │ │ │ ├── feed
│ │ │ │ ├── DateClaimer.kt
│ │ │ │ ├── FeedParserService.kt
│ │ │ │ ├── StandaloneFeedController.kt
│ │ │ │ ├── StandaloneFeedService.kt
│ │ │ │ ├── discovery
│ │ │ │ │ ├── GenericFeedLocator.kt
│ │ │ │ │ ├── NativeFeedLocator.kt
│ │ │ │ │ └── RemoteNativeFeedRef.kt
│ │ │ │ ├── exporter
│ │ │ │ │ ├── FeedExporter.kt
│ │ │ │ │ ├── FeedlessModule.kt
│ │ │ │ │ ├── FeedlessModuleGenerator.kt
│ │ │ │ │ ├── FeedlessModuleImpl.kt
│ │ │ │ │ ├── FeedlessModuleParser.kt
│ │ │ │ │ ├── JsonFeedExporter.kt
│ │ │ │ │ └── SyndAtomFeedExporter.kt
│ │ │ │ └── parser
│ │ │ │ │ ├── BrokenXmlParser.kt
│ │ │ │ │ ├── CalendarFeedParser.kt
│ │ │ │ │ ├── FeedBodyParser.kt
│ │ │ │ │ ├── JsonFeedParser.kt
│ │ │ │ │ ├── NullFeedParser.kt
│ │ │ │ │ ├── XmlFeedParser.kt
│ │ │ │ │ └── json
│ │ │ │ │ ├── JsonAttachment.kt
│ │ │ │ │ ├── JsonAuthor.kt
│ │ │ │ │ ├── JsonFeed.kt
│ │ │ │ │ ├── JsonItem.kt
│ │ │ │ │ ├── JsonPoint.kt
│ │ │ │ │ ├── OpenSearchDescription.kt
│ │ │ │ │ ├── OpenSearchQuery.kt
│ │ │ │ │ └── OpenSearchResponse.kt
│ │ │ │ ├── group
│ │ │ │ ├── GroupDAO.kt
│ │ │ │ ├── GroupEntity.kt
│ │ │ │ ├── GroupResolver.kt
│ │ │ │ ├── GroupService.kt
│ │ │ │ ├── UserGroupAssignmentDAO.kt
│ │ │ │ └── UserGroupAssignmentEntity.kt
│ │ │ │ ├── license
│ │ │ │ ├── LicenseDAO.kt
│ │ │ │ ├── LicenseEntity.kt
│ │ │ │ ├── LicenseService.kt
│ │ │ │ └── LinceseResolver.kt
│ │ │ │ ├── mail
│ │ │ │ ├── MailAuthResolver.kt
│ │ │ │ ├── MailAuthenticationService.kt
│ │ │ │ ├── MailConfig.kt
│ │ │ │ ├── MailController.kt
│ │ │ │ ├── MailGunService.kt
│ │ │ │ ├── MailService.kt
│ │ │ │ ├── MailServiceImpl.kt
│ │ │ │ ├── NoopMailService.kt
│ │ │ │ ├── OneTimePasswordDAO.kt
│ │ │ │ ├── OneTimePasswordEntity.kt
│ │ │ │ ├── OneTimePasswordService.kt
│ │ │ │ └── TemplateService.kt
│ │ │ │ ├── message
│ │ │ │ └── MessageService.kt
│ │ │ │ ├── pipeline
│ │ │ │ ├── DocumentPipelineJobDAO.kt
│ │ │ │ ├── DocumentPipelineJobEntity.kt
│ │ │ │ ├── DocumentPipelineJobExecutor.kt
│ │ │ │ ├── DocumentPipelineService.kt
│ │ │ │ ├── FeedlessPlugin.kt
│ │ │ │ ├── FilterEntityPlugin.kt
│ │ │ │ ├── FragmentTransformerPlugin.kt
│ │ │ │ ├── MapEntityPlugin.kt
│ │ │ │ ├── PipelineJobEntity.kt
│ │ │ │ ├── PluginResolver.kt
│ │ │ │ ├── PluginService.kt
│ │ │ │ ├── ReportPlugin.kt
│ │ │ │ ├── SourcePipelineJobDAO.kt
│ │ │ │ ├── SourcePipelineJobEntity.kt
│ │ │ │ ├── SourcePipelineJobExecutor.kt
│ │ │ │ ├── SourcePipelineService.kt
│ │ │ │ └── plugins
│ │ │ │ │ ├── CompositeFilterPlugin.kt
│ │ │ │ │ ├── ConditionalTagPlugin.kt
│ │ │ │ │ ├── DetectMediaPlugin.kt
│ │ │ │ │ ├── DiffDataForwarderPlugin.kt
│ │ │ │ │ ├── EventsReportPlugin.kt
│ │ │ │ │ ├── FeedPlugin.kt
│ │ │ │ │ ├── FeedsPlugin.kt
│ │ │ │ │ ├── FulltextPlugin.kt
│ │ │ │ │ └── PrivacyPlugin.kt
│ │ │ │ ├── plan
│ │ │ │ ├── InvoiceEntity.kt
│ │ │ │ ├── OrderDAO.kt
│ │ │ │ ├── OrderEntity.kt
│ │ │ │ ├── OrderResolver.kt
│ │ │ │ ├── OrderService.kt
│ │ │ │ ├── PaymentController.kt
│ │ │ │ ├── PaymentMethod.kt
│ │ │ │ ├── PlanConstraintsService.kt
│ │ │ │ ├── PlanDAO.kt
│ │ │ │ ├── PlanEntity.kt
│ │ │ │ ├── PlanResolver.kt
│ │ │ │ ├── PlanService.kt
│ │ │ │ ├── PricedProductDAO.kt
│ │ │ │ ├── PricedProductEntity.kt
│ │ │ │ ├── ProductDAO.kt
│ │ │ │ ├── ProductDataLoader.kt
│ │ │ │ ├── ProductEntity.kt
│ │ │ │ ├── ProductResolver.kt
│ │ │ │ └── ProductService.kt
│ │ │ │ ├── report
│ │ │ │ ├── ReportDAO.kt
│ │ │ │ ├── ReportEntity.kt
│ │ │ │ ├── ReportJobExecutor.kt
│ │ │ │ ├── ReportResolver.kt
│ │ │ │ ├── ReportService.kt
│ │ │ │ ├── SegmentationDAO.kt
│ │ │ │ ├── SegmentationEntity.kt
│ │ │ │ └── SegmentationService.kt
│ │ │ │ ├── repository
│ │ │ │ ├── AbstractRepositoryEntity.kt
│ │ │ │ ├── AnalyticsSyncExecutor.kt
│ │ │ │ ├── GithubService.kt
│ │ │ │ ├── HarvestDAO.kt
│ │ │ │ ├── HarvestEntity.kt
│ │ │ │ ├── InboxService.kt
│ │ │ │ ├── RepositoryController.kt
│ │ │ │ ├── RepositoryDAO.kt
│ │ │ │ ├── RepositoryEntity.kt
│ │ │ │ ├── RepositoryHarvester.kt
│ │ │ │ ├── RepositoryHarvesterExecutor.kt
│ │ │ │ ├── RepositoryResolver.kt
│ │ │ │ └── RepositoryService.kt
│ │ │ │ ├── scrape
│ │ │ │ ├── MarkupSimplifier.kt
│ │ │ │ ├── PageInspectionService.kt
│ │ │ │ ├── ScrapeContext.kt
│ │ │ │ ├── ScrapeQueryResolver.kt
│ │ │ │ ├── ScrapeService.kt
│ │ │ │ ├── WebExtractService.kt
│ │ │ │ ├── WebToArticleTransformer.kt
│ │ │ │ ├── WebToFeedTransformer.kt
│ │ │ │ └── WebToTextTransformer.kt
│ │ │ │ ├── secrets
│ │ │ │ ├── EncryptionConverter.kt
│ │ │ │ ├── HashConverter.kt
│ │ │ │ ├── SecretsResolver.kt
│ │ │ │ ├── UserSecretDAO.kt
│ │ │ │ ├── UserSecretEntity.kt
│ │ │ │ ├── UserSecretService.kt
│ │ │ │ └── UserSecretType.kt
│ │ │ │ ├── session
│ │ │ │ ├── AuthAnonymousResolver.kt
│ │ │ │ ├── AuthService.kt
│ │ │ │ ├── AuthWebsocketRepository.kt
│ │ │ │ ├── AuthenticationHttpSessionHandshakeInterceptor.kt
│ │ │ │ ├── CookieProvider.kt
│ │ │ │ ├── IAuthService.kt
│ │ │ │ ├── JwtRequestFilter.kt
│ │ │ │ ├── NoopAuthService.kt
│ │ │ │ ├── PermissionService.kt
│ │ │ │ ├── SessionResolver.kt
│ │ │ │ ├── SessionService.kt
│ │ │ │ └── TokenProvider.kt
│ │ │ │ ├── source
│ │ │ │ ├── SourceDAO.kt
│ │ │ │ ├── SourceEntity.kt
│ │ │ │ └── SourceService.kt
│ │ │ │ ├── transport
│ │ │ │ └── TelegramBotService.kt
│ │ │ │ ├── user
│ │ │ │ ├── ConnectedAppDAO.kt
│ │ │ │ ├── ConnectedAppEntity.kt
│ │ │ │ ├── ConnectedAppService.kt
│ │ │ │ ├── GithubConnectionDAO.kt
│ │ │ │ ├── GithubConnectionEntity.kt
│ │ │ │ ├── GithubConnectionService.kt
│ │ │ │ ├── TelegramConnectionDAO.kt
│ │ │ │ ├── TelegramConnectionEntity.kt
│ │ │ │ ├── UserDAO.kt
│ │ │ │ ├── UserEntity.kt
│ │ │ │ ├── UserResolver.kt
│ │ │ │ └── UserService.kt
│ │ │ │ └── util
│ │ │ │ ├── CryptUtil.kt
│ │ │ │ ├── DateUtil.kt
│ │ │ │ ├── FeedUtil.kt
│ │ │ │ ├── HtmlUtil.kt
│ │ │ │ ├── HttpUtil.kt
│ │ │ │ ├── JsonUtil.kt
│ │ │ │ ├── JtsUtil.kt
│ │ │ │ └── SafeGuards.kt
│ │ └── resources
│ │ │ ├── application-analytics.properties
│ │ │ ├── application-database.properties
│ │ │ ├── application-debug.properties
│ │ │ ├── application-dev.properties
│ │ │ ├── application-mail.properties
│ │ │ ├── application-metrics.properties
│ │ │ ├── application-prod.properties
│ │ │ ├── application-saas.properties
│ │ │ ├── application-sso.properties
│ │ │ ├── application-telegram.properties
│ │ │ ├── application.properties
│ │ │ ├── certs
│ │ │ ├── .gitignore
│ │ │ └── feedless.pub
│ │ │ ├── db
│ │ │ ├── .gitignore
│ │ │ ├── migration
│ │ │ │ ├── V10__name_fk_constraints.sql
│ │ │ │ ├── V11__v2_baseline.sql
│ │ │ │ ├── V12__add_tags.sql
│ │ │ │ ├── V13__rename_scrape_source.sql
│ │ │ │ ├── V14__attachment_field_length.sql
│ │ │ │ ├── V15__attachment_add_size.sql
│ │ │ │ ├── V16__add_schem_version_fields.sql
│ │ │ │ ├── V17__refactor_plans.sql
│ │ │ │ ├── V18__refactor_user.sql
│ │ │ │ ├── V19__correct_user_email.sql
│ │ │ │ ├── V1__baseline.sql
│ │ │ │ ├── V20__patch_billing_add_payment_method.sql
│ │ │ │ ├── V21__create_table_license.sql
│ │ │ │ ├── V22__patch_user_plan_subscription.sql
│ │ │ │ ├── V23__name_foreign_keys.sql
│ │ │ │ ├── V24__invoice.sql
│ │ │ │ ├── V25__patch_feature_value.sql
│ │ │ │ ├── V26__patch_user_usage.sql
│ │ │ │ ├── V27__patch_scrape-source_add_geo.sql
│ │ │ │ ├── V28__patch_document_add_geo.sql
│ │ │ │ ├── V29__rename_cloud_subscription_to_plan.sql
│ │ │ │ ├── V2__patch_user.sql
│ │ │ │ ├── V30__enable_postgis.sql
│ │ │ │ ├── V31__all_actions.sql
│ │ │ │ ├── V32__sequence.sql
│ │ │ │ ├── V33__repo_share_key.sql
│ │ │ │ ├── V34__cron_run.sql
│ │ │ │ ├── V35__retention_age_by_field.sql
│ │ │ │ ├── V36__patch_cron_run.sql
│ │ │ │ ├── V37__rename_repo_cron_run.sql
│ │ │ │ ├── V38__pipeline_job.sql
│ │ │ │ ├── V39__patch_scrape_job.sql
│ │ │ │ ├── V3__generalize_plugins.sql
│ │ │ │ ├── V40__lat_lon_distance.sql
│ │ │ │ ├── V41__notifications.sql
│ │ │ │ ├── V42__notifications_as_repo.sql
│ │ │ │ ├── V43__alter_repo_for_product.sql
│ │ │ │ ├── V44__timestamp_func.sql
│ │ │ │ ├── V45__backward_comp.sql
│ │ │ │ ├── V46__indexes.sql
│ │ │ │ ├── V47__add_source_to_document.sql
│ │ │ │ ├── V48__increase_url_length.sql
│ │ │ │ ├── V49__fix_repo_share_key.sql
│ │ │ │ ├── V4__add_plugin_to_user.sql
│ │ │ │ ├── V50__harvest.sql
│ │ │ │ ├── V51__source_error_count.sql
│ │ │ │ ├── V52__array_functions.sql
│ │ │ │ ├── V53__normalize_names.sql
│ │ │ │ ├── V54__annotate_repository.sql
│ │ │ │ ├── V55__connected_apps.sql
│ │ │ │ ├── V56__system_settings.sql
│ │ │ │ ├── V57__github_to_connected_apps.sql
│ │ │ │ ├── V58__push_notification.sql
│ │ │ │ ├── V59__inbox_repo.sql
│ │ │ │ ├── V5__plugins_in_webdocument.sql
│ │ │ │ ├── V60__create_groups.sql
│ │ │ │ ├── V61__fix_annotation_fks.sql
│ │ │ │ ├── V62__adds_document_hash.sql
│ │ │ │ ├── V63__pricing.sql
│ │ │ │ ├── V64__re-enable_sources.sql
│ │ │ │ ├── V65__fix_chronounit_value.sql
│ │ │ │ ├── V66__report.sql
│ │ │ │ ├── V67__source_with_pulls.sql
│ │ │ │ ├── V68__fix_report.sql
│ │ │ │ ├── V69__add_indixes_to_common_fields.sql
│ │ │ │ ├── V6__alter_feed_native.sql
│ │ │ │ ├── V70__disactivate_push.sql
│ │ │ │ ├── V71__source_last_refreshed_at.sql
│ │ │ │ ├── V7__alter_feed_native__rename_lastUpdatedAt.sql
│ │ │ │ ├── V8__alter_feed_native__add_errorMessage.sql
│ │ │ │ └── V9__alter_feed_native__add_harvestRateFixed.sql
│ │ │ └── old-schema.sql
│ │ │ ├── debug-sample.html
│ │ │ ├── debug-sample.pdf
│ │ │ ├── debug-sample.txt
│ │ │ ├── feed.xsl
│ │ │ ├── logback-loki.xml
│ │ │ ├── logback.xml
│ │ │ ├── markup-templates
│ │ │ ├── mail-auth-code.ftl.html
│ │ │ ├── mail-visual-diff-change-detected.ftl.html
│ │ │ ├── mail-visual-diff-welcome.ftl.html
│ │ │ ├── mail-welcome-paid.ftl.html
│ │ │ └── page-tracker-authorized.ftl.html
│ │ │ ├── models
│ │ │ ├── .gitignore
│ │ │ └── hyph-en-us.tex
│ │ │ ├── public
│ │ │ └── sample.txt
│ │ │ ├── rome.properties
│ │ │ ├── sampleSchema.graphql.txt
│ │ │ ├── schema
│ │ │ └── schema.graphqls
│ │ │ ├── test-data
│ │ │ ├── atom.xml
│ │ │ ├── dynamic-website.html
│ │ │ ├── rss.xml
│ │ │ └── static-website.html
│ │ │ └── test.html
│ └── test
│ │ ├── kotlin
│ │ ├── PostgreSQLExtension.kt
│ │ └── org
│ │ │ └── migor
│ │ │ └── feedless
│ │ │ ├── ExceptionsTest.kt
│ │ │ ├── IntegrationTest.kt
│ │ │ ├── TestConfigurations.kt
│ │ │ ├── agent
│ │ │ └── AgentSyncExecutorTest.kt
│ │ │ ├── analytics
│ │ │ └── AnalyticsServiceTest.kt
│ │ │ ├── annotation
│ │ │ └── AnnotationServiceTest.kt
│ │ │ ├── api
│ │ │ ├── graphql
│ │ │ │ ├── AuthenticationTest.kt
│ │ │ │ ├── QueryResolverTest.kt
│ │ │ │ └── ScrapeQueryResolverTest.kt
│ │ │ └── throttle
│ │ │ │ └── ThrottleAspectTest.kt
│ │ │ ├── common
│ │ │ └── HttpServiceTest.kt
│ │ │ ├── community
│ │ │ ├── LanguageServiceTest.kt
│ │ │ ├── PartOfSpeechServiceTest.kt
│ │ │ ├── TokenizerServiceTest.kt
│ │ │ └── text
│ │ │ │ ├── ScoreServiceTest.kt
│ │ │ │ ├── complex
│ │ │ │ ├── CivilityScorerTest.kt
│ │ │ │ └── QualityScorerTest.kt
│ │ │ │ ├── hyphenation
│ │ │ │ └── HyphenatorTest.kt
│ │ │ │ └── simple
│ │ │ │ ├── CitationScorerTest.kt
│ │ │ │ ├── EngagementScorerTest.kt
│ │ │ │ ├── KeywordIntersectionScorerTest.kt
│ │ │ │ ├── NoveltyScorerTest.kt
│ │ │ │ ├── SpamScorerTest.kt
│ │ │ │ ├── SpellingScorerTest.kt
│ │ │ │ ├── VocabularyScorerTest.kt
│ │ │ │ └── WordCountScorerTest.kt
│ │ │ ├── config
│ │ │ └── SecurityConfigTest.kt
│ │ │ ├── document
│ │ │ ├── DocumentControllerTest.kt
│ │ │ ├── DocumentResolverTest.kt
│ │ │ ├── DocumentServiceTest.kt
│ │ │ └── filter
│ │ │ │ └── FilterByExpressionTest.kt
│ │ │ ├── feed
│ │ │ ├── StandaloneFeedControllerTest.kt
│ │ │ ├── StandaloneFeedServiceTest.kt
│ │ │ ├── exporter
│ │ │ │ ├── JsonFeedExporterTest.kt
│ │ │ │ └── SyndAtomFeedExporterTest.kt
│ │ │ └── parser
│ │ │ │ ├── CalendarFeedParserTest.kt
│ │ │ │ └── XmlFeedParserTest.kt
│ │ │ ├── group
│ │ │ └── GroupServiceTest.kt
│ │ │ ├── jobs
│ │ │ └── CleanupExecutorTest.kt
│ │ │ ├── license
│ │ │ └── LicenseServiceTest.kt
│ │ │ ├── mail
│ │ │ └── TemplateServiceTest.kt
│ │ │ ├── pipeline
│ │ │ ├── DocumentPipelineJobExecutorTest.kt
│ │ │ ├── PluginServiceTest.kt
│ │ │ ├── SourcePipelineJobExecutorTest.kt
│ │ │ └── plugins
│ │ │ │ ├── CompositeFilterPluginTest.kt
│ │ │ │ ├── FeedPluginTest.kt
│ │ │ │ ├── FeedsPluginTest.kt
│ │ │ │ ├── FulltextPluginTest.kt
│ │ │ │ └── PrivacyPluginTest.kt
│ │ │ ├── plan
│ │ │ ├── FeatureServiceTest.kt
│ │ │ ├── PlanConstraintsServiceImplTest.kt
│ │ │ └── ProductServiceTest.kt
│ │ │ ├── report
│ │ │ ├── ReportJobExecutorTest.kt
│ │ │ ├── ReportResolverTest.kt
│ │ │ └── ReportServiceTest.kt
│ │ │ ├── repository
│ │ │ ├── AbstractRepositoryEntityTest.kt
│ │ │ ├── AnalyticsSyncExecutorTest.kt
│ │ │ ├── RepositoryHarvesterExecutorTest.kt
│ │ │ ├── RepositoryHarvesterTest.kt
│ │ │ ├── RepositoryResolverTest.kt
│ │ │ ├── RepositoryServiceTest.kt
│ │ │ └── RepositoryUpdateTest.kt
│ │ │ ├── secrets
│ │ │ └── UserSecretServiceTest.kt
│ │ │ ├── service
│ │ │ ├── PdfServiceTest.kt
│ │ │ └── ScrapeServiceTest.kt
│ │ │ ├── session
│ │ │ └── PermissionServiceTest.kt
│ │ │ ├── source
│ │ │ └── SourceServiceTest.kt
│ │ │ ├── transform
│ │ │ ├── DateClaimerTest.kt
│ │ │ ├── MarkupSimplifierTest.kt
│ │ │ ├── WebExtractServiceTest.kt
│ │ │ ├── WebToArticleTransformerTest.kt
│ │ │ ├── WebToFeedTransformerTest.kt
│ │ │ └── WebToTextTransformerTest.kt
│ │ │ ├── transport
│ │ │ └── TelegramBotServiceTest.kt
│ │ │ ├── user
│ │ │ └── UserServiceTest.kt
│ │ │ └── util
│ │ │ ├── DateUtilKtTest.kt
│ │ │ └── FeedUtilTest.kt
│ │ └── resources
│ │ ├── application-database.properties
│ │ ├── application-test.properties
│ │ ├── images
│ │ ├── sample.jpeg
│ │ ├── sample.pdf
│ │ ├── sample.png
│ │ └── sample.webp
│ │ ├── logback-test.xml
│ │ ├── raw-articles
│ │ ├── derstandard_at.html
│ │ ├── derstandard_at.json
│ │ ├── diepresse_com.html
│ │ ├── diepresse_com.json
│ │ ├── medium_com.html
│ │ ├── medium_com.json
│ │ ├── newyorker_com.html
│ │ ├── newyorker_com.json
│ │ ├── spiegel_de.html
│ │ ├── spiegel_de.json
│ │ ├── theatlantic_com.html
│ │ ├── theatlantic_com.json
│ │ ├── wikipedia_org.html
│ │ ├── wikipedia_org.json
│ │ ├── wordpress_com.html
│ │ └── wordpress_com.json
│ │ ├── raw-websites
│ │ ├── 00-paulgraham-com-articles.input.html
│ │ ├── 00-paulgraham-com-articles.output.json
│ │ ├── 01-spencermounta-in.input.html
│ │ ├── 01-spencermounta-in.output.json
│ │ ├── 02-spotify-com.input.html
│ │ ├── 02-spotify-com.output.json
│ │ ├── 03-telepolis-de.input.html
│ │ ├── 03-telepolis-de.output.json
│ │ ├── 04-arzg-github-io-lang.input.html
│ │ ├── 04-arzg-github-io-lang.output.json
│ │ ├── 05-www-brandonsmith-ninja.input.html
│ │ ├── 05-www-brandonsmith-ninja.output.json
│ │ ├── 06-jon-bo-posts.input.html
│ │ ├── 06-jon-bo-posts.output.json
│ │ ├── 07-craigslist.input.html
│ │ ├── 07-craigslist.output.json
│ │ ├── 08-arxiv-org.input.html
│ │ ├── 08-arxiv-org.output.json
│ │ ├── 09-fool-com.input.html
│ │ ├── 09-fool-com.output.json
│ │ ├── 10-webiphany-com.input.html
│ │ ├── 10-webiphany-com.output.json
│ │ ├── 11-audacityteam-org.input.html
│ │ ├── 11-audacityteam-org.output.json
│ │ ├── 12-sph-ethz-ch.input.html
│ │ ├── 12-sph-ethz-ch.output.json
│ │ ├── 13-google-cloud-blog.input.html
│ │ ├── 13-google-cloud-blog.output.json
│ │ ├── 14-linkace-org.input.html
│ │ └── 14-linkace-org.output.json
│ │ ├── sample.pdf
│ │ └── transform
│ │ ├── after-on-rss.in.xml
│ │ ├── apple-rss.in.xml
│ │ ├── medium-rss.in.xml
│ │ └── yt-atom.in.xml
│ ├── supervisord.conf
│ ├── test-profiles.js
│ └── test
│ └── test-docker.sh
├── renovate.json
├── roadmap.md
├── scripts
├── build.sh
├── deploy.sh
├── performance-test.js
├── semver-tag-docker-images.sh
└── wait-for-containers.sh
├── selfhosting.env
├── settings.gradle.kts
└── yarn.lock
/.dockerignore:
--------------------------------------------------------------------------------
1 | **/node_modules
2 | **/.gradle
3 | .git
4 | products
5 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # Editor configuration, see https://editorconfig.org
2 | root = true
3 |
4 | [*]
5 | charset = utf-8
6 | indent_style = space
7 | indent_size = 2
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
11 | [*.md]
12 | max_line_length = off
13 | trim_trailing_whitespace = false
14 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Ignore Gradle project-specific cache directory
2 | .gradle
3 | bazel-*
4 | .idea
5 |
6 | # Ignore Gradle build output directory
7 | build
8 | package-lock.json
9 | *.log
10 | docs/inspiration
11 | docs/network.dia
12 | node_modules
13 | packages/server-mgmt
14 | build-cache
15 | .env
16 | LAST_BUILD_COMMIT
17 |
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "packages/agent/ghostery-extension"]
2 | path = packages/agent/ghostery-extension
3 | url = git@github.com:ghostery/ghostery-extension.git
4 | [submodule "products/rss-proxy"]
5 | path = products/rss-proxy
6 | url = git@github.com:damoeb/rss-proxy.git
7 | [submodule "products/visual-diff"]
8 | path = products/visual-diff
9 | url = git@github.com:damoeb/visual-diff.git
10 |
--------------------------------------------------------------------------------
/.idea/codeStyles/codeStyleConfig.xml:
--------------------------------------------------------------------------------
1 |
Hi,
13 |you request access to ${domain}. Please enter the following code (valid until ${otp.validUntil} minutes).
14 | 15 |Hi,
13 |your tracker ${trackerTitle} noticed a change on site ${website} 14 |
Hi,
13 |you created a page tracker ${trackerTitle} for page ${website}
14 |in order to authorize the tracking emails, click here
15 | 16 |${info}
17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /packages/server-core/src/main/resources/markup-templates/mail-welcome-paid.ftl.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |Welcome to ${productName}
8 |paid plan
9 |Regards,
10 |
11 | ${productName} Team
12 |