Monday, 8 May 2023

Show HN: Cptn.io – open-source integration platform https://bit.ly/3B6FuWu

Show HN: Cptn.io – open-source integration platform Hi, I am Krishna Thota. I am building an open source integration and data platform( https://bit.ly/3B6FwxA ). The product is MIT licensed and the repo is at https://bit.ly/3M6eHQd . I have started on my startup journey an year ago and launched a monitoring platform called DevRaven. Unfortunately the product did not takeoff as expected. That story is for another day. But during the course of building the product, I have built several integrations leveraging MQs and Cloud Functions. While building and deploying Cloud Functions for happy paths is easy, I had to monitor logs for failures, build retry mechanisms or manually process failed events, keep instances running to prevent cold start timeouts. It can also get expensive with charges for MQs, server time for running cloud functions etc and costs can be unpredictable. I thought of building a platform where I can build integrations quickly, have the ability to look at incoming/outgoing events, look at logs, retry any failed events etc. And finally, predictable costs for running the infrastructure. cptn.io provides all these capabilities and more. You can build pipelines to integrate with any cloud services, send data from your backend to data warehouses, listen to web hook events etc. The platform can be integrated into any stack by sending events to HTTP end points. Instead of trying to build a business first or launch an open source product under restrictive licenses, the platform will be available under MIT license so any user or customer can use it. There is no ee folder or complex dual licensing and I am also committing to releasing SSO under MIT. The plan is to offer a managed service in the cloud at a later time, accept sponsors for prioritizing features for enterprise customers and charge for enterprise support. It should take less than 5 minutes to get the platform running on your machine. Welcome any feedback, feature requests, PRs and bug reports. https://bit.ly/3B6FwxA May 8, 2023 at 06:45PM

Show HN: Automatic Domain Verification https://bit.ly/3LFydSt

Show HN: Automatic Domain Verification The Domain Verification protocol stores a DNS TXT record at a DNS name derived from a hashed "verifiable identifier" (email, telephone, DID), enabling anyone that can prove control over the verifiable identifier to prove authority for the domain name, whilst preserving the privacy of the authorised party. Once setup, the record enables automatic domain verification for any service provider. This record could be automatically setup by domain registrars upon domain registration (with registrant opt-in) creating a fast lane for verification with service providers many new small businesses use (eg Google Ads, Facebook, Office365, Dropbox, etc). ===== Quick sidebar: This was originally submitted to HN under the title "Show HN: Make domain verification as easy as verifying an email or phone number" 3 days ago [1]. It was doing really well (#3 on front page) then totally disappeared from front page and went to bottom of page 1 of Show HN. After an email exchange with dang (incredibly helpful as always), he explained that it got flagged with the "overheated discussion detector" and it turned out I caused this by diligently responding to every comment as fast as my fingers would type because I wanted to keep engagement going. Helpfully dang took the flag off it about 12 hours later after our email exchange, but understandably the momentum was lost. So I feel like it kinda got killed, just as it was picking up pace and as the US west coast was waking up. So I am humbly reposting it with a modified description based on the comments of the last post. ===== This is a project I've been working on for a little while and I'm interested in your feedback and point of view. Many of us would have verified a domain name by pasting a string into a DNS TXT record. These methods are currently being discussed and standardised at the IETF [2]. Let's Encrypt's DNS-01 method [3] is probably considered the state of the art. The differences between DNS-01 and Domain Verification protocol are: - DNS-01 requires a new TXT record for each service provider. With Domain Verification Protocol, multiple service providers can use the same record. - Instructions to setup a DNS-01 TXT record are instigated by the service provider, whereas a Domain Verification Protocol record can be setup independently by a user or a domain registrar. They could even pre-populated by a registrar upon domain registration (with registrant opt-in) - There’s no concept of permissions in DNS-01, the act of creating the record gives the user full access for the domain with the service provider. With Domain Verification protocol multiple records can be setup, limited permissions could be setup for different third parties. For example give a marketing agency authentication to claim the domain on social media but nowhere else. I'm still working on licensing but creating these records will always be free. I hope to find service providers that see significant upside in reducing friction for user onboarding that are willing to pay to license it. Worked example: Let's say you want to authenticate the user with the email user@example.com with the domain dvexample.com, these are the steps: a. HASH(user@example.com) -> 4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg b. Store Domain Verification record at: 4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg._dv.dvexample.com c. TXT record determines permissions and time limit: @dv=1;d=Example user email;e=2025-01-01;s=[seo;email];h=4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg Thanks for taking a look, Elliott 1. https://bit.ly/41nLwgh 2. https://bit.ly/3HPPWFC... 3. https://bit.ly/3nHzOPE https://bit.ly/3nyKdgB May 8, 2023 at 06:06PM

Show HN: Play SineRider, a math puzzle game built by teenagers at Hack Club https://bit.ly/3LH0bgw

Show HN: Play SineRider, a math puzzle game built by teenagers at Hack Club Messing with your TI-84 graphing calculator is a rite of passage for every teenager who has ever been bored in a math class. In 2013 I was that teenager, and it gave me an idea for a tiny game about sledding on graphs. This project grew into my white whale, and I spent my twenties trying and failing to finish it alone. I shelved the game when I started working for Hack Club in 2018—until last May, when a few community members took it off the shelf. The project took on a life of its own, and turned into a year of nights and weekends from a global team of 20+ teens in 8+ countries. Today SineRider enters public beta! SineRider is literally an infinite universe of function composition puzzles, each with infinite solutions, that range from welcoming for 9th graders to difficult for even the most serious matlab user. And every day we tweet out a fresh one to be solved with your morning coffee. We hope you enjoy playing SineRider as much as we’ve enjoyed making it. And we’re not done! Mobile support, polar coordinates, and a level editor are all on the roadmap. SineRider is a living project, to be continuously built and maintained as free OSS by the Hack Club community: https://bit.ly/42dM61j The team that built the game will try to be in the comments today between high school classes and AP tests. —chris walker, creative director Watch the trailer: https://www.youtube.com/watch?v=35nDYoIwiA8 Play now: https://bit.ly/3K8tXJL https://bit.ly/42dM61j May 8, 2023 at 02:14PM

Sunday, 7 May 2023

Show HN: What do you think about my metasearch engine? https://bit.ly/3nv7y2M

Show HN: What do you think about my metasearch engine? https://bit.ly/3NImgOs May 7, 2023 at 09:44PM

Show HN: Filter crowded places (bars, clubs, museums) per day in major cities https://bit.ly/3VNIr7R

Show HN: Filter crowded places (bars, clubs, museums) per day in major cities Free tool to find and filter busy venues based on predicted crowd levels. This way you can find for example busy bars on Wednesday evening, or quiet museums on Sunday morning. It works in most big cities around the world. It makes it easy to find crowded places (or avoid them) when you are unfamiliar with the area. You can filter on days of the week, how busy a place is (quiet, normal, busy), and sort venues based on overall popularity, rating, dwell time, and price. https://bit.ly/41it88i May 7, 2023 at 07:44PM

Show HN: PostData – The No-Fuss Way to Store and Visualize Your IoT Data https://bit.ly/3NNNT8W

Show HN: PostData – The No-Fuss Way to Store and Visualize Your IoT Data Hey everyone, I'm excited to announce the launch of PostData, a new service that simplifies IoT data storage and visualization. As developers, we know how frustrating it can be to set up complicated services like AWS just to store and view our data. That's why we created PostData – to offer a straightforward solution that gets the job done without all the hassle. With PostData, you can easily ingest, store, and visualize your IoT data in just a few clicks. We offer a forever-free plan that allows you to create new public devices with up to 20 metrics and a limit of 1000 messages per device. We also have two paid plans for private devices and higher limits for those who need them. We're looking for beta users to try out our service and provide feedback. So if you're tired of struggling with complicated IoT data storage and visualization tools, give PostData a try and let us know what you think! Thanks for your time, and I look forward to hearing from you. https://bit.ly/428IL3o May 7, 2023 at 10:09AM

Show HN: Devil Mode: A twisted Emacs key translator for modifier-free editing https://bit.ly/3HLu0LI

Show HN: Devil Mode: A twisted Emacs key translator for modifier-free editing https://bit.ly/3M5ytM1 May 7, 2023 at 10:59AM

Show HN: ChatGPT powered AI chatbot for your website https://bit.ly/3pjCza6

Show HN: ChatGPT powered AI chatbot for your website Introducing Chabotix.com - the no-code chatbot builder powered by ChatGPT! With Chabotix.com, you can easily create a custom chatbot for your website without any coding skills. Simply upload your document and get a link to your chatbot. Your users can then interact with the chatbot, ask questions, and get answers - all without leaving your website! Whether you're a small business owner, a blogger, or a website owner, Chabotix.com is the perfect solution for enhancing your online presence and engaging your audience. Say goodbye to expensive developers and complicated code - with Chabotix.com, you can create a chatbot in minutes and start reaping the benefits of enhanced user engagement and improved customer support. Visit Chabotix.com today and start building your own chatbot! You upload a text file like this one in Chabotix website. Then you receive a personalized link to your AI chat bot. To get your own chabotix, follow simple steps: 1- Sign in to Chabotix.com, 2- Upload your document 3-You get a link to your personalized AI chatbot. Add it to your website. To add chabotix to your website, follow simple steps: 1-Add that Javascript link to your website, before closing html tag. Check this page to see an example. 2- Also use our CSS file to style it. You can also style your Chabotix bot according to your taste by using your own CSS file. Any time if you have any questions, either ask Chabotix directly here or send me a message on Twitter. https://bit.ly/3plgIiz May 7, 2023 at 09:34AM

Show HN: Hyrable - An AI powered job description writer for recruiters https://bit.ly/44ESTTo

Show HN: Hyrable - An AI powered job description writer for recruiters Write Better Job Descriptions Faster with Hyrable https://bit.ly/3LC4LNb May 7, 2023 at 09:13AM

Saturday, 6 May 2023

Show HN: Git Hooting https://bit.ly/42a1RGh

Show HN: Git Hooting 00's called, they want their RSS feeds back. I was looking at my growing Github gist collection when a sudden urge to blog and make a name for myself "by not programming" struck. Part way into implementing my oh so special static website generator it occurred to me that, quite frankly, Github gists is a pretty decent publishing platform. I mean, it gives you reasonably extended markdown with previews, heck I could even write in org-mode, has comments, follower - followee relationship, extended search with filters, check out locally and push your edits. Did someone say "edit button"? Thus the idea behind https://bit.ly/3pjJAHX was born: collect gists into RSS feeds and force everyone, kicking and screaming, into the good old days when Google Reader was king. Well, it's a bit more than that now. But basically, you create a gist or grab an old one, name its main file `hoot.md` or `hoot.org` if org-mode is your poison, make it public and voila. These "hoots" make it into your RSS feed and will get permalinks with social graph metatags, so you get nice previews when you share them on Twitter and such. To take it for a spin: - pick a subdomain e.g. foo.git.ht, - navigate you browser there, - login with Github. I still consider it alpha, but it should work. Report any issues as you would normally on Github https://bit.ly/3HMeNdc . Thank you https://bit.ly/3pjJAHX May 7, 2023 at 01:29AM

Show HN: WebGPU Rotating Cube https://bit.ly/3M1rweL

Show HN: WebGPU Rotating Cube This is a small "hello world" type WebGPU demo that fits in a single page (no NPM dependencies or build steps). The last time I touched anything graphics-related was the OpenGL 1.x era, and I've been hoping WebGPU would be a good opportunity to come up to speed with modern standard GPU programming. However, the WebGPU tutorials I found were often small fragments of code aimed at people already familiar with DX12 or Metal, and the rest involved complex NPM build steps or "clone my repo to get started" setup scripts. This page is just a plain HTML+JS file. You can edit the shaders live from the textboxes, or download it to make more involved edits. I hope it feels something like what learning JS used to be like in the days of MySpace and Geocities (in a good way). https://bit.ly/429d5uB May 6, 2023 at 02:46PM

Show HN: Execute Ethereum Transactions Through Chat https://bit.ly/3nvHWCS

Show HN: Execute Ethereum Transactions Through Chat https://bit.ly/3AXX2E6 May 6, 2023 at 03:00PM

Show HN: ReRender AI, Realistic Architectural Renders for AutoCAD, Blender Users https://bit.ly/42beBwn

Show HN: ReRender AI, Realistic Architectural Renders for AutoCAD, Blender Users https://bit.ly/42vkHYo May 6, 2023 at 10:15AM

Show HN: SpiderSuite: Advance GUI web security crawler https://bit.ly/3LCuIvW

Show HN: SpiderSuite: Advance GUI web security crawler https://bit.ly/3LCuJA0 May 6, 2023 at 06:56AM

Friday, 5 May 2023

Show HN: Ethereum address reviews, similar to Yelp https://bit.ly/3nATHb2

Show HN: Ethereum address reviews, similar to Yelp Hi HN, Excuse me if the formatting sucks, this is a first time post. I want to introduce to you vrfd.info. A place where you can openly view and influence the reputation of any Ethereum address. Think of it as Yelp but for Eth. Addresses are classified as either verified or flagged on-chain through soulbound NFTs. A type of NFT that has no trade value as it cannot be sold. Once minted, it is stuck to the given address. The metadata of the NFT contains either information to verify the address with, this could be a social account for example. Or in the case of flagged addresses, the metadata contains proof of wrong-doing. Users can search the classification status of any address on the web app. Additionally, users can apply to either verify or report an address, provided proof. In the case of reports, users stand a chance to be rewarded. Finally, users can up or down vote other addresses. I made this tool after suffering one to many scam without having an open source library where addresses can be reported or their credentials verified. It's still a bit clunky, but the core concept works fully integrated on the Testnet. I'm shipping a big update this week to make it more responsive. Thanks for taking the time to read this. Please give me any feedback as I am looking to improve everywhere I can. https://bit.ly/3HJnGEy May 5, 2023 at 06:30PM

Show HN: Remove sponsored content in YouTube videos https://bit.ly/42q3D66

Show HN: Remove sponsored content in YouTube videos https://bit.ly/42oveo8 May 5, 2023 at 12:54PM

Show HN: Make domain verification as easy as verifying an email or phone number https://bit.ly/41nLwgh

Show HN: Make domain verification as easy as verifying an email or phone number Hi HN, This is a project [1] I've been working on for a little while and I'm interested in your feedback and point of view. Many of us would have verified a domain name by pasting a string into a DNS TXT record. Some providers ask us to store this DNS TXT record at a domain using a DNS label like "_provider" e.g. _provider.yourdomain.com, and some providers ask that you do it at the zone apex (God help us [2]). The Domain Verification protocol stores a DNS TXT record at a DNS name derived from a hashed "verifiable identifier" (think email, telephone, DID), enabling anyone that can prove control over the verifiable identifier to prove authority for the domain name. For example, the domain verification record giving the email address user@example.com authority over the domain dvexample.com can be seen with this terminal command: dig 4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg._dv.dvexample.com TXT The record can specify what type of services the authorised party is allowed to use (e.g. SEO, Storage, Advertising) or specify an exact provider (ads.google.com), you can also specify an expiry date. The benefits of this approach are: - Domain owners can grant time-limited, granular permissions for third parties to verify a domain - Every service provider could use the same verification record - Once a domain owner creates a verification record by following instructions from one service provider, that same record could be used by other service providers - Domain registrars could set these records up on behalf of users, perhaps even upon domain registration (with registrant opt-in). This would provide domain registrants with a fast lane for signing up to services like Google Ads, Facebook Ads, Dropbox, whatever I'm still working on licensing but creating these records will always be free. I hope to find service providers that see significant upside in reducing friction for user onboarding that are willing to pay to license it. Worked example: Let's say you want to authenticate the user with the email user@example.com with the domain dvexample.com, these are the steps: 1. HASH(user@example.com) -> 4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg 2. Store Domain Verification record at: 4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg._dv.dvexample.com 3. TXT record determines permissions and time limit: ``` @dv=1;d=Example user emali;e=2025-01-01;s=[seo;email];h=4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg ``` BTW, if you're interested the syntax of that DNS record is a compact data serialisation format I created especially for DNS [3]. Thanks for taking a look, Elliott 1. https://bit.ly/418UDRu 2. dig target.com TXT 3. https://bit.ly/3LARRPw https://bit.ly/418UDRu May 5, 2023 at 12:40PM

Show HN: A search engine for your personal network of high-quality websites https://bit.ly/419AgUz

Show HN: A search engine for your personal network of high-quality websites Hey all, Last time when we were on HackerNews [1], we received a lot of feedback, and we incorporated most of it. - We have changed our name from grep.help to usegrasp.com - A privacy policy page - Bulk import - Pricing page We are happy to introduce a new feature: a personalized answer search engine that provides direct citations to the content on the page. Demo: https://bit.ly/41g4FRe 1 - https://bit.ly/41ctltE https://bit.ly/3VCsq4o May 5, 2023 at 09:04AM

Show HN: Text to Music – Create music and drum samples with AI https://bit.ly/3paPc7s

Show HN: Text to Music – Create music and drum samples with AI https://bit.ly/3LCjiZ7 May 5, 2023 at 08:14AM

Thursday, 4 May 2023

Show HN: Hypertune – Visual, functional, statically-typed configuration language https://bit.ly/42rJXyB

Show HN: Hypertune – Visual, functional, statically-typed configuration language Hey HN! I'm Miraan, the founder at Hypertune, and I'm excited to be posting this on HN. Hypertune lets you make your code configurable to let teammates like PMs and marketers quickly change feature flags, in-app copy, pricing plans, etc. It's like a CMS but instead of only letting you set static content, you can insert arbitrary logic from the UI, including A/B tests and ML "loops". I previously built a landing page optimization tool that let marketers define variants of their headline, CTA, cover image, etc, then used a genetic algorithm to find the best combination of them. They used my Chrome extension to define changes on DOM elements based on their unique CSS selector. But this broke when the underlying page changed and didn't work with sites that used CSS modules. Developers hated it. I took a step back. The problem I was trying to solve was making the page configurable by marketers in a way that developers liked. I decided to solve it from first principles and this led to Hypertune. Here's how it works. You define a strongly typed configuration schema in GraphQL, e.g. type Query { page(language: Language!, deviceType: DeviceType!): Page! } type Page { headline: String! imageUrl: String! showPromotion: Boolean! benefits: [String!]! } enum Language { English, French, Spanish } enum DeviceType { Desktop, Mobile, Tablet } Then marketers can configure these fields from the UI using our visual, functional, statically-typed language. The language UI is type-directed so we only show expression options that satisfy the required type of the hole in the logic tree. So for the "headline" field, you can insert a String expression or an If / Else expression that returns a String. If you insert the latter, more holes appear. This means marketers don't need to know any syntax and can't get into invalid states. They can use arguments you define in the schema like "language" and "deviceType", and drop A/B tests and contextual multi-armed bandits anywhere in their logic. We overlay live counts on the logic tree UI so they can see how often different branches are called. You get the config via our SDK which fetches your logic tree once on initialization (from our CDN) then evaluates it locally so you can get flags or content with different arguments (e.g. for different users) immediately with no network latency. So you can use the SDK on your backend without adding extra latency to every request, or on the frontend without blocking renders. The SDK includes a command line tool that auto-generates code for end-to-end type-safety based on your schema. You can also query your config via the GraphQL API. If you use the SDK, you can also embed a build-time snapshot of your logic tree in your app bundle. The SDK initializes from this instantly then fetches the latest logic from the server. So it'll still work in the unlikely event the CDN is down. And on the frontend, you can evaluate flags, content, A/B tests, personalization logic, etc, instantly on page load without any network latency, which makes it compatible with static Jamstack sites. I started building this for landing pages but realized it could be used for configuring feature flags, in-app content, translations, onboarding flows, permissions, rules, limits, magic numbers, pricing plans, backend services, cron jobs, etc, as it's all just "code configuration". This configuration is usually hardcoded, sprawled across json or yaml files, or in separate platforms for feature flags, content management, A/B testing, pricing plans, etc. So if a PM wants to A/B test new onboarding content, they need a developer to write glue code that stitches their A/B testing tool with their CMS for that specific test, then wait for a code deployment. And at that point, it may not be worth the effort. The general problem with having separate platforms is that all this configuration naturally overlaps. Feature flags and content management overlap with A/B testing and analytics. Pricing plans overlap with feature flags. Keeping them separate leads to inflexibility and duplication and requires hacky glue code, which defeats the purpose of configuration. I think the solution is a flexible, type-safe code configuration platform with a strongly typed schema, type-safe SDKs and APIs, and a visual, functional, statically-typed language with analytics, A/B testing and ML built in. I think this solves the problem with having separate platforms, but also results in a better solution for individual use cases and makes new use cases possible. For example, compared specifically to other feature flag platforms, you get auto-generated type-safe code to catch flag typos and errors at compile-time (instead of run-time), code completion and "find all references" in your IDE (no figuring out if a flag is in kebab-case or camelCase), type-safe enum flags you can exhaustively switch on, type-safe object and list flags, and a type-safe logic UI. You pass context arguments like userId, email, etc, in a type-safe way too with compiler errors if you miss or misspell one. To clean up a flag, you remove it from your query, re-run code generation and fix all the type errors to remove all references. The full programming language under the hood means there are no limits on your flag logic (you're not locked into basic disjunctive normal form). You can embed a build-time snapshot of your flag logic in your app bundle for guaranteed, instant initialization with no network latency (and keep this up to date with a commit webhook). And all your flags are versioned together in a single Git history for instant rollbacks to known good states (no figuring out what combination of flag changes caused an incident). There are other flexible configuration languages like Dhall (discussed here: https://bit.ly/3p6yWnX ), Jsonnet (discussed here: https://bit.ly/42o2DiK ) and Cue (discussed here: https://bit.ly/42oaf4P ). But they lack a UI for nontechnical users, can't be updated at run-time and don't support analytics, A/B testing and ML. I was actually going to start with a basic language that had primitives (Boolean, Int, String), a Comparison expression and an If / Else. Then users could implement the logic for each field in the schema separately. But then I realized they might want to share logic for a group of fields at the object level, e.g. instead of repeating "if (deviceType == Mobile) { primitiveA } else { primitiveB }" for each primitive field separately, they could have the logic once at the Page level: "if (deviceType == Mobile) { pageObjectA } else { pageObjectB }". I also needed to represent field arguments like "deviceType" in the language. And I realized users may want to define other variables to reuse bits of logic, like a specific "benefit" which appears in different variations of the "benefits" list. So at this point, it made sense to build a full, functional language with Object expressions (that have a type defined in the schema) and Function, Variable and Application expressions (to implement the lambda calculus). Then all the configuration can be represented as a single Object with the root Query type from the schema, e.g. Query { page: f({ deviceType }) => switch (true) { case (deviceType == DeviceType.Mobile) => Page { headline: f({}) => "Headline A" imageUrl: f({}) => "Image A" showPromotion: f({}) => true benefits: f({}) => ["Ben", "efits", "A"] } default => Page { headline: f({}) => "Headline B" imageUrl: f({}) => "Image B" showPromotion: f({}) => false benefits: f({}) => ["Ben", "efits", "B"] } } } So each schema field is implemented by a Function that takes a single Object parameter (a dictionary of field argument name => value). I needed to evaluate this logic tree given a GraphQL query that looks like: query { page(deviceType: Mobile) { headline showPromotion } } So I built an interpreter that recursively selects the queried parts of the logic tree, evaluating the Functions for each query field with the given arguments. It ignores fields that aren't in the query so the logic tree can grow large without affecting query performance. The interpreter is used by the SDK, to evaluate logic locally, and on our CDN edge server that hosts the GraphQL API. The response for the example above would be: { "__typename": "Query", "page": { "__typename": "Page", "headline": "Headline A", "showPromotion": true } } Developers were concerned about using the SDK on the frontend as it could leak sensitive configuration logic, like lists of user IDs, to the browser. To solve this, I modified the interpreter to support "partial evaluation". This is where it takes a GraphQL query that only provides some of the required field arguments and then partially evaluates the logic tree as much as possible. Any logic which can't be evaluated is left intact. The SDK can leverage this at initialization time by passing already known arguments (e.g. the user ID) in its initialization query so that sensitive logic (like lists of user IDs) are evaluated (and eliminated) on the server. The rest of the logic is evaluated locally by the SDK when client code calls its methods with the remaining arguments. This also minimizes the payload size sent to the client and means less logic needs to be evaluated locally, which improves both page load and render performance. The interpreter also keeps a count of expression evaluations as well as events for A/B tests and ML loops, which are flushed back to Hypertune in the background to overlay live analytics on the logic tree UI. It's been a challenge to build a simple UI given there's a full functional language under the hood. For example, I needed to build a way for users to convert any expression into a variable in one click. Under the hood, to make expression X a variable, we wrap the parent of X in a Function that takes a single parameter, then wrap that Function in an Application that passes X as an argument. Then we replace X in the Function body with a reference to the parameter. So we go from: if (X) { Y } else { Z } to ((paramX) => if (paramX) { Y } else { Z } )(X) So a variable is just an Application argument that can be referenced in the called Function's body. And once we have a variable, we can reference it in more than one place in the Function body. To undo this, users can "drop" a variable in one click which replaces all its references with a copy of its value. Converting X into a variable gets more tricky if the parent of X is a Function itself which defines parameters referenced inside of X. In this case, when we make X a variable, we lift it outside of this Function. But then it doesn't have access to the Function's parameters anymore. So we automatically convert X into a Function itself which takes the parameters it needs. Then we call this new Function where we originally had X, passing in the original parameters. There are more interesting details about how we lift variables to higher scopes in one click but that's for another post. Thanks for reading this far! I'm glad I got to share Hypertune with you. I'm curious about what use case appeals to you the most. Is it type-safe feature flags, in-app content management, A/B testing static Jamstack sites, managing permissions, pricing plans or something else? Please let me know any thoughts or questions! https://bit.ly/42uyxKD May 4, 2023 at 04:01PM