{"id":13601119,"url":"https://github.com/venediktov/vanilla-rtb","last_synced_at":"2025-05-16T03:02:35.170Z","repository":{"id":62929553,"uuid":"60236237","full_name":"venediktov/vanilla-rtb","owner":"venediktov","description":"Real Time Bidding (RTB) - Demand Side Platform framework  ","archived":false,"fork":false,"pushed_at":"2024-12-23T11:24:37.000Z","size":6564,"stargazers_count":323,"open_issues_count":11,"forks_count":85,"subscribers_count":39,"default_branch":"master","last_synced_at":"2025-05-12T06:53:44.994Z","etag":null,"topics":["ad-sdk","ad-tech","adserver","auction","bidding","boost","c-plus-plus-11","c-plus-plus-14","c-plus-plus-17","cmake","cpp11","cpp14","cpp17","crud","docker","low-latency","openrtb","programatic","rtb","vanilla-rtb"],"latest_commit_sha":null,"homepage":"http://forkbid.com","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/venediktov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","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}},"created_at":"2016-06-02T05:50:32.000Z","updated_at":"2025-05-08T03:43:50.000Z","dependencies_parsed_at":"2024-04-18T08:59:21.241Z","dependency_job_id":"28ed0360-9019-4562-a21f-6db7655c6e1f","html_url":"https://github.com/venediktov/vanilla-rtb","commit_stats":{"total_commits":287,"total_committers":9,"mean_commits":31.88888888888889,"dds":"0.29268292682926833","last_synced_commit":"8ac09c90cad772e4bed686ca4200b018139eb62a"},"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/venediktov%2Fvanilla-rtb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/venediktov%2Fvanilla-rtb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/venediktov%2Fvanilla-rtb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/venediktov%2Fvanilla-rtb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/venediktov","download_url":"https://codeload.github.com/venediktov/vanilla-rtb/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253865420,"owners_count":21975916,"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":["ad-sdk","ad-tech","adserver","auction","bidding","boost","c-plus-plus-11","c-plus-plus-14","c-plus-plus-17","cmake","cpp11","cpp14","cpp17","crud","docker","low-latency","openrtb","programatic","rtb","vanilla-rtb"],"created_at":"2024-08-01T18:00:56.020Z","updated_at":"2025-05-16T03:02:30.152Z","avatar_url":"https://github.com/venediktov.png","language":"C++","funding_links":["https://opencollective.com/vanilla-rtb"],"categories":["Table of Contents","Auction Engines and Ad Servers"],"sub_categories":["Applications Engines and Frameworks"],"readme":"[![alt text][1.1]][1]\n[![alt text][2.1]][2]\n[![alt text][3.1]][3]\n[![alt text][4.1]][4]\n\n[1.1]: https://i.imgur.com/tbK9oQ9.png (twitter icon)\n[2.1]: https://i.imgur.com/f1rWtvg.png (LinkedIn icon)\n[3.1]: https://i.imgur.com/g8bZTwu.png (telegram icon)\n[4.1]: https://i.imgur.com/1slR4ab.png (github icon)\n\n[1]: http://www.twitter.com/vanilla_rtb\n[2]: http://www.linkedin.com/company/vanillartb\n[3]: http://t.me/vanilla_rtb\n[4]: http://www.github.com/vanilla-rtb\n\n# vanilla-rtb\n\nReal Time Bidding (RTB) - Demand Side Platform framework\n\nopen-source library utilizing  modern C++11/14/17 features and latest Boost.\n\nWhat makes us different from other open-source RTB projects on GitHub :\n\n* Our stack is fairly small and easy to integrate with any cmake project. \n* Partitioned targeting data\n* Monolithic bidder \n* Code generation for targeting matchers and bidder executable\n* Minimum dependency on outside vendors.\n* Decoupled by C++ templates\n* Very high throughput up to 105K QPS on 16 cores Intel(R) Xeon(R) CPU E5-2697 v3 @ 2.60GHz\n* GUI for editing campaign budget \n\nAs a model cmake project please visit [https://github.com/vanilla-rtb/rapid-bidder](https://github.com/vanilla-rtb/rapid-bidder)\n\nWe provide \n[![VanillaRTB extensions](https://img.shields.io/badge/VanillaRTB-extensions-blue.svg)](https://github.com/vanilla-rtb/extensions) including bindings to popular languages **NodeJS/Go/Java/PHP/Python**  \nand custom targetings and bidder executable generators [https://github.com/vanilla-rtb/extensions](https://github.com/vanilla-rtb/extensions)\n\n[vanilla-rtb ecosystem](../../wiki)\n\n[Multi-bidder-model-with-communicator-for-Win-notifications](../../wiki/Multi-bidder-model-with-communicator-for-Win-notifications)\n\n[best performance compared to other stacks -  105K QPS](../../wiki/QPS-test)\n\n[runs on cloud with docker - see instructions](../../tree/master/docker/)\n\n[![Join the chat at https://gitter.im/vanilla-rtb/Lobby](https://badges.gitter.im/vanilla-rtb/Lobby.svg)](https://gitter.im/vanilla-rtb/Lobby?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge) \n[![build ](https://travis-ci.org/venediktov/vanilla-rtb.svg?branch=master)](https://travis-ci.org/venediktov/vanilla-rtb)\n[![GPLv3 license](https://img.shields.io/badge/License-GPLv3-blue.svg)](http://perso.crans.org/besson/LICENSE.html)\n[![Installing Dependencies](https://img.shields.io/badge/Dependencies-wiki-green.svg)](https://github.com/venediktov/vanilla-rtb/wiki)\n[![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen.svg?style=flat)](https://github.com/venediktov/vanilla-rtb/issues)\n[![Beerpay](https://beerpay.io/venediktov/vanilla-rtb/badge.svg?style=beer)](https://beerpay.io/venediktov/vanilla-rtb)\n[![Backers on Open Collective](https://opencollective.com/vanilla-rtb/backers/badge.svg)](#backers) \n[![Sponsors on Open Collective](https://opencollective.com/vanilla-rtb/sponsors/badge.svg)](#sponsors) \n\n\nRecommended build environment: Linux or macOS, CMake \u003e= 3.9.2, GCC \u003e= 7.0, Clang \u003e= 5.0 , Boost \u003e= 1.67\n\nStructure :\n* [/](../../tree/master/) -- the root directory\n   * [benchmarks/](../../tree/master/benchmarks/) -- optionaly built benchmarks for IPC caches, json parsers and low overhead IPC audit logger\n   * [CRUD/](../../tree/master/CRUD/) -- C++11 high performance HTTP-restful handlers based on boost.ASIO and CRUD API\n   * [docker/](../../tree/master/docker/) -- vanilla docker files and instructions on how to build and run \n   * [jsonv/](../../tree/master/jsonv/) -- DSL mapper of json encoded objects to C++ structures\n   * [parsers/](../../tree/master/parsers/) -- fast zero copy, zero memory allocation parsers\n   * [rapidjson/](../../tree/master/rapidjson/) -- very fast json tokenizer including SAX / DOM API but requires more memory \n   * [rtb/](../../tree/master/rtb/) -- RTB framework\n      * [core/](../../tree/master/rtb/core/) -- generic structures shared in the project ( RTB specific )\n      * [common/](../../tree/master/rtb/common) -- generic RTB agnostic structures \n      * [datacache/](../../tree/master/rtb/datacache/) -- IPC cache generic classes for fast targeting and other lookups\n      * [exchange/](../../tree/master/rtb/exchange) -- exchange handlers implementation\n      * [DSL/](../../tree/master/rtb/DSL) --  DSL formats for jsonv , boost::any and rapidjson\n   * [examples/](../../tree/master/examples) -- root to our sandbox with examples\n      * [bidder/](../../tree/master/examples/bidder) -- collection of application specific classes to support targeting\n      * [bidder_experimental/](../../tree/master/examples/bidder_experimental) -- bidder based on chained matchers model\n      * [loader/](../../tree/master/examples/loader) -- collection of application specific classes to support campaign loading\n      * [campaign/](../../tree/master/examples/campaign) -- add/modify/delete campaign API + UI ( work in progress ) \n      * [datacache/](../../tree/master/examples/datacache) -- IPC cache implementation based on rtb/datacache model \n      * [UI/](../../tree/master/examples/UI) -- HTML and javascript for campaign budget management\n      \n* [CMakeLists.txt] - cmake file\n\n\u003eThe stack of vanilla-rtb includes other C++11/14 projects and is referencing them via gh-subree.\n\u003eTo update to the latest version of json-voorhees or CRUD we use the following commands \\:\n\n* git subtree pull --prefix jsonv git@github.com:tgockel/json-voorhees.git master --squash\n* git subtree pull --prefix CRUD git@github.com:venediktov/CRUD.git  master --squash\n\n\n### Creating bidder in 49 lines of code\n```C++\nusing Selector = vanilla::ad_selector\u003cvanilla::BudgetManager, Ad\u003e;\nusing DSLT = DSL::GenericDSL\u003cstd::string, DSL::rapid_mapper\u003e ;\n\n//Return from each lambda becomes input for next lambda in the tuple of functions\nauto retrieve_domain_f = [\u0026cacheLoader](const std::string\u0026 dom, auto\u0026\u0026 ...) {\n    Domain domain;\n    if(!cacheLoader.retrieve(domain,dom)) {\n        return boost::optional\u003cuint32_t\u003e();\n    }\n    return boost::optional\u003cuint32_t\u003e(domain.dom_id);\n};\n\nauto retrieve_ico_campaign_f = [\u0026cacheLoader](boost::optional\u003cuint32_t\u003e dom_id, auto\u0026\u0026 ...)  {\n    std::vector\u003cICOCampaign\u003e ico_campains;\n    if (!cacheLoader.retrieve(ico_campains,*dom_id)) {\n        return boost::optional\u003cdecltype(ico_campains)\u003e();\n    }\n    return boost::optional\u003cdecltype(ico_campains)\u003e(ico_campains);\n};\n\nvanilla::core::Banker\u003cBudgetManager\u003e banker;\nauto retrieve_campaign_ads_f = [\u0026](boost::optional\u003cstd::vector\u003cICOCampaign\u003e\u003e campaigns, auto \u0026\u0026 req, auto \u0026\u0026 imp)  {\n    std::vector\u003cAd\u003e retrieved_cached_ads;\n    for (auto \u0026campaign : *campaigns) {\n        if (!cacheLoader.retrieve(retrieved_cached_ads, campaign.campaign_id, imp.banner.get().w, imp.banner.get().h)) {\n            continue;\n        }\n        auto budget_bid = banker.authorize(cacheLoader.get\u003cCampaignCache\u003cBidderConfig\u003e\u003e(), campaign.campaign_id);\n        std::transform(std::begin(retrieved_cached_ads),\n                       std::end(retrieved_cached_ads),\n                       std::begin(retrieved_cached_ads), [budget_bid](Ad \u0026 ad){\n                          ad.auth_bid_micros = std::min(budget_bid, ad.max_bid_micros);\n                          return ad;\n                       });\n    }\n    return retrieved_cached_ads;\n};\n\n//creating bidder endpoint utilizing self-referencing pattern\nexchange_handler\u003cDSLT\u003e bid_handler(std::chrono::milliseconds(10));\nbid_handler\n.logger([](const std::string \u0026data) {\n    LOG(debug) \u003c\u003c \"bid request=\" \u003c\u003c data ;\n})\n.error_logger([](const std::string \u0026data) {\n    LOG(debug) \u003c\u003c \"bid request error \" \u003c\u003c data ;\n})\n.auction_async([\u0026](const BidRequest \u0026request) {\n    thread_local vanilla::Bidder\u003cDSLT, Selector\u003e bidder(std::move(Selector()));\n    return bidder.bid(request,\n                      request.site.get().ref,\n                      //chained matchers lambdas defined above\n                      retrieve_domain_f,\n                      retrieve_ico_campaign_f,\n                      retrieve_campaign_ads_f\n   );\n});\n```\n\n### *(\u0026#x1F4D7;) To build vanilla-rtb use following commands in the root of vanilla-rtb*\n\n[(installing dependencies before building vanilla stack)](../../wiki/Installing-dependencies)\n\n### Linux \\:\n\n```bash\n$ mkdir Release\n$ cd Release\n$ cmake -DCMAKE_BUILD_TYPE=Release .. -G \"Unix Makefiles\"\n$ make -j4 install\n####### Creating  Debug build #######\n$ cd ..\n$ mkdir Debug\n$ cd Debug\n$ cmake -DCMAKE_BUILD_TYPE=Debug .. -G \"Unix Makefiles\"\n$ make -j4 install\n```\n\n### Windows \\:\n*same steps as above for linux , only difference is depending on your environment \n  either Visual Studio or NMake project can be used*\n```bash\n######### for NMake ####################\ncd Release\ncmake -DCMAKE_BUILD_TYPE=Release .. -G \"NMake Makefiles\"\ncd ../Debug\ncmake -DCMAKE_BUILD_TYPE=Debug   .. -G \"NMake Makefiles\"\n######### for Visual Studio ############\ncd Release\ncmake -DCMAKE_BUILD_TYPE=Release .. -G \"Visual Studio 14 2015\"\ncd ../Debug\ncmake -DCMAKE_BUILD_TYPE=Debug   .. -G \"Visual Studio 14 2015\"\n```\n### Mac OS X (Xcode) \\:\nFor the reliable results it is suggested to have the build directory out of source tree.\nThe process involves creating a build directory, generating an `Xcode` project in that directory with `CMake`,\nopening the project file generated in the build directory with `Xcode`, and lastly, adjusting project\nsettings as requried and kicking off the build.\n\nTo generate an `Xcode` project invoke cmake from an empty build directory with command line similar to `cmake -G Xcode -DCMAKE_BUILD_TYPE=Release`.\n\n### Mac OS X (command line tools) \\:\n```bash\n$ xcode-select --install\n$ ruby -e \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)\"\n$ brew doctor\n$ brew install cmake\n$ brew install boost\n$ mkdir Release\n$ cd Release\n$ cmake -DCMAKE_BUILD_TYPE=Release .. -G \"Unix Makefiles\"\n$ make -j4 install\n```\n\n### Mac OS X ( with llvm ) \\:\n```bash\n$ brew doctor\n$ brew install cmake\n$ brew install boost\n$ brew install --with-clang llvm\n$ mkdir Release\n$ cd Release\n$ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=/usr/local/opt/llvm/bin/clang -DCMAKE_CXX_COMPILER=/usr/local/opt/llvm/bin/clang++ -DCMAKE_RANLIB=/usr/local/opt/llvm/bin/llvm-ranlib -DCMAKE_AR=/usr/local/opt/llvm/bin/llvm-ar .. -G \"Unix Makefiles\"\n```\n### Parallel Builds\nWhen building on Linux and Mac OS X with Make it's possible to automatically adjust the concurreny of the build using `nproc` for Linux and `sysctl -n hw.physicalcpu` for Mac OS X command line tools that returns number of CPUs available to the Make execution context\\: \n\nLinux :\n```\n$ make -j $(nproc) ... \n```\n\nMac OS X :\n```\nmake -j $(sysctl -n hw.physicalcpu) ...\n```\n\nIt's also possible to specifying the target _Load Average_ with `-l` flag to prevent machine overloading\\:\n\n```\n$ make -l $(nproc) ...\n```\n\nAnd lastly, on Linux, it's possible to run the build with the _BATCH_ scheduling mode (throughput oriented) as\\:\n\n```\n$ chrt --batch 0 make ...\n```\n\nAll above considered the ultimate Make invocation combo on Linux would be something like\\:\n\n```\n$ chrt --batch 0 make -j$(nproc) -l$(nproc)\n```\n\n### Running examples\\:\n#### Testing simple case - single bidder bound to ip/port\n- [x] HTTP-Bidder\n  * vanilla-rtb/Release/examples/bin$ ./http_bidder_test --config etc/config.cfg\n- [x] test with curl and apache benchmark\n  * vanilla-rtb/Release/examples/bin$ ./curl.sh --bidder\n  * vanilla-rtb/Release/examples/bin$ ./ab.sh -n30000 -c10 --bidder\n#### Testing different json mappers to openrtb::BidRequest  available in vanilla-rtb stack\n- [x] Start Exchange Handler with HTTP handler\n  * vanilla-rtb/Release/examples/bin$ ./exchange_handler_test --config etc/config.cfg\n  * vanilla-rtb/Release/examples/bin$ ./ab.sh -n30000 -c10 --auction\n  * vanilla-rtb/Release/examples/bin$ ./ab.sh -n30000 -c10 --auction-any\n   * vanilla-rtb/Release/examples/bin$ ./ab.sh -n30000 -c10 --auction-rapid\n#### Testing mock-bidders e.g. no bid multi bidders via communicator pattern ( work in progress )\n- [x] Start Exchange Handler distributing to multi-bidders via communicator \n  * vanilla-rtb/Release/examples/bin$ ./exchange_handler_test --config etc/config.cfg\n- [x] Mock-bidders starting multiple in one swoop,  currently configured as 5 bidders in config\n  * vanilla-rtb/Release/examples/bin$ ./mock_bidder_test --config etc/config.cfg\n  * vanilla-rtb/Release/examples/bin$ ./ab.sh -n30000 -c10 --mock-bidders\n#### Testing  multi bidders via communicator pattern ( work in progress )\n- [x] multi-bidders starting multiple in one swoop (currently configured as 3 bidders in config ) and starting exchange handler\n  * vanilla-rtb/Release/examples/bin$ ./multi_bidder --config etc/config.cfg\n  * vanilla-rtb/Release/examples/bin$ ./multi_exchange_handler --config etc/config.cfg\n#### Testing cache loader of ad campaigns and ad budgets  ( needs to be extended to get cache update events from outside )\n- [x] Cache loader\n  * vanilla-rtb/Release/examples/bin$ ./cache_loader_test --config etc/config.cfg\n#### Testing Mock exchange writen in python\n- [x] Mock exchange - emulating bid requests\n  * To run mock exchange you need any python, and python \"requests\" library installed.\n  * for simple exchange please run\n  * vanilla-rtb/Release/examples/bin/mock_exchange$ python mock-x.py\n  * for various geo and size rotation please run\n  * vanilla-rtb/Release/examples/bin/mock_exchange$ python mock-x.py --geo \"Russia:Moscow USA:NY USA:Washington USA:Chicago\" --size '100:300 240:400 420:280'\n  * for more info please run \n  * vanilla-rtb/Release/examples/bin/mock_exchange$ python mock-x.py --help\n  \n#### Testing campaign manager paired with Win-notification service\n- [x] Campaign manager - Budget\n  * vanilla-rtb/Release/examples/bin$ ./campaign_manager_test --config etc/config.cfg\n- [x] Notification service and Slave-Banker\n  * vanilla-rtb/Release/examples/bin$ ./notification_service_test --config etc/config.cfg\n  * vanilla-rtb/Release/examples/bin$ ./slavebanker_service_test --config etc/config.cfg\n  \n- [x] To add/delete/modify campign budgets fire up UI by connecting to manager via browser http:://localhost:11081/campaign/index.html\n\n  ![campaign](https://github.com/venediktov/vanilla-rtb/wiki/images/WorkingBudgetButtons.png)  \n\n\n## Support on Beerpay\nWe hope you like our project , fork our repo or chip in for couple of  :beers:!\n\n[![Beerpay](https://beerpay.io/venediktov/vanilla-rtb/badge.svg?style=beer-square)](https://beerpay.io/venediktov/vanilla-rtb)  [![Beerpay](https://beerpay.io/venediktov/vanilla-rtb/make-wish.svg?style=flat-square)](https://beerpay.io/venediktov/vanilla-rtb?focus=wish)\n\n## Contributors\n\nThis project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].\n\u003ca href=\"../../graphs/contributors\"\u003e\u003cimg src=\"https://opencollective.com/vanilla-rtb/contributors.svg?width=890\u0026button=false\" /\u003e\u003c/a\u003e\n\n\n## Backers\n\nThank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/vanilla-rtb#backer)]\n\n\u003ca href=\"https://opencollective.com/vanilla-rtb#backers\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/vanilla-rtb/backers.svg?width=890\"\u003e\u003c/a\u003e\n\n\n## Sponsors\n\nSupport this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/vanilla-rtb#sponsor)]\n\n\u003ca href=\"https://opencollective.com/vanilla-rtb/sponsor/0/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/vanilla-rtb/sponsor/0/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/vanilla-rtb/sponsor/1/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/vanilla-rtb/sponsor/1/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/vanilla-rtb/sponsor/2/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/vanilla-rtb/sponsor/2/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/vanilla-rtb/sponsor/3/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/vanilla-rtb/sponsor/3/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/vanilla-rtb/sponsor/4/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/vanilla-rtb/sponsor/4/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/vanilla-rtb/sponsor/5/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/vanilla-rtb/sponsor/5/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/vanilla-rtb/sponsor/6/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/vanilla-rtb/sponsor/6/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/vanilla-rtb/sponsor/7/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/vanilla-rtb/sponsor/7/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/vanilla-rtb/sponsor/8/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/vanilla-rtb/sponsor/8/avatar.svg\"\u003e\u003c/a\u003e\n\u003ca href=\"https://opencollective.com/vanilla-rtb/sponsor/9/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/vanilla-rtb/sponsor/9/avatar.svg\"\u003e\u003c/a\u003e\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvenediktov%2Fvanilla-rtb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvenediktov%2Fvanilla-rtb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvenediktov%2Fvanilla-rtb/lists"}