The best Hacker News stories from Show from the past day

Go back

Latest posts:

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.<p>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".<p>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.<p>I took a step back.<p>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.<p>Here's how it works. You define a strongly typed configuration schema in GraphQL, e.g.<p><pre><code> 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 } </code></pre> Then marketers can configure these fields from the UI using our visual, functional, statically-typed language. The language UI is <i>type-directed</i> 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.<p>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.<p>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.<p>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".<p>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.<p>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.<p>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.<p>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).<p>There are other flexible configuration languages like Dhall (discussed here: <a href="https://news.ycombinator.com/item?id=32102203" rel="nofollow">https://news.ycombinator.com/item?id=32102203</a>), Jsonnet (discussed here: <a href="https://news.ycombinator.com/item?id=19656821" rel="nofollow">https://news.ycombinator.com/item?id=19656821</a>) and Cue (discussed here: <a href="https://news.ycombinator.com/item?id=20847943" rel="nofollow">https://news.ycombinator.com/item?id=20847943</a>). 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.<p>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.<p>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.<p>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.<p><pre><code> 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"] } } } </code></pre> 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:<p><pre><code> query { page(deviceType: Mobile) { headline showPromotion } } </code></pre> 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.<p>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:<p><pre><code> { "__typename": "Query", "page": { "__typename": "Page", "headline": "Headline A", "showPromotion": true } } </code></pre> 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.<p>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.<p>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.<p>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.<p>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:<p><pre><code> if (X) { Y } else { Z } </code></pre> to<p><pre><code> ((paramX) => if (paramX) { Y } else { Z } )(X) </code></pre> 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.<p>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.<p>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!

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.<p>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".<p>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.<p>I took a step back.<p>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.<p>Here's how it works. You define a strongly typed configuration schema in GraphQL, e.g.<p><pre><code> 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 } </code></pre> Then marketers can configure these fields from the UI using our visual, functional, statically-typed language. The language UI is <i>type-directed</i> 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.<p>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.<p>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.<p>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".<p>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.<p>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.<p>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.<p>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).<p>There are other flexible configuration languages like Dhall (discussed here: <a href="https://news.ycombinator.com/item?id=32102203" rel="nofollow">https://news.ycombinator.com/item?id=32102203</a>), Jsonnet (discussed here: <a href="https://news.ycombinator.com/item?id=19656821" rel="nofollow">https://news.ycombinator.com/item?id=19656821</a>) and Cue (discussed here: <a href="https://news.ycombinator.com/item?id=20847943" rel="nofollow">https://news.ycombinator.com/item?id=20847943</a>). 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.<p>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.<p>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.<p>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.<p><pre><code> 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"] } } } </code></pre> 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:<p><pre><code> query { page(deviceType: Mobile) { headline showPromotion } } </code></pre> 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.<p>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:<p><pre><code> { "__typename": "Query", "page": { "__typename": "Page", "headline": "Headline A", "showPromotion": true } } </code></pre> 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.<p>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.<p>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.<p>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.<p>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:<p><pre><code> if (X) { Y } else { Z } </code></pre> to<p><pre><code> ((paramX) => if (paramX) { Y } else { Z } )(X) </code></pre> 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.<p>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.<p>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!

Show HN: Make domain verification as easy as verifying an email or phone number

Hi HN,<p>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.<p>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]).<p>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.<p>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:<p>dig 4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg._dv.dvexample.com TXT<p>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.<p>The benefits of this approach are:<p>- Domain owners can grant time-limited, granular permissions for third parties to verify a domain<p>- Every service provider could use the same verification record<p>- 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<p>- 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<p>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.<p>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:<p>1. HASH(user@example.com) -> 4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg<p>2. Store Domain Verification record at: 4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg._dv.dvexample.com<p>3. TXT record determines permissions and time limit:<p>@dv=1;d=Example user emali;e=2025-01-01;s=[seo;email];h=4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg<p>BTW, if you're interested the syntax of that DNS record is a compact data serialisation format I created especially for DNS [3].<p>Thanks for taking a look,<p>Elliott<p>1. <a href="https://www.domainverification.org" rel="nofollow">https://www.domainverification.org</a><p>2. dig target.com TXT<p>3. <a href="https://www.compactdata.org" rel="nofollow">https://www.compactdata.org</a><p>(edit: formatting)

Show HN: Make domain verification as easy as verifying an email or phone number

Hi HN,<p>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.<p>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]).<p>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.<p>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:<p>dig 4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg._dv.dvexample.com TXT<p>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.<p>The benefits of this approach are:<p>- Domain owners can grant time-limited, granular permissions for third parties to verify a domain<p>- Every service provider could use the same verification record<p>- 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<p>- 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<p>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.<p>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:<p>1. HASH(user@example.com) -> 4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg<p>2. Store Domain Verification record at: 4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg._dv.dvexample.com<p>3. TXT record determines permissions and time limit:<p>@dv=1;d=Example user emali;e=2025-01-01;s=[seo;email];h=4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg<p>BTW, if you're interested the syntax of that DNS record is a compact data serialisation format I created especially for DNS [3].<p>Thanks for taking a look,<p>Elliott<p>1. <a href="https://www.domainverification.org" rel="nofollow">https://www.domainverification.org</a><p>2. dig target.com TXT<p>3. <a href="https://www.compactdata.org" rel="nofollow">https://www.compactdata.org</a><p>(edit: formatting)

Show HN: Make domain verification as easy as verifying an email or phone number

Hi HN,<p>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.<p>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]).<p>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.<p>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:<p>dig 4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg._dv.dvexample.com TXT<p>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.<p>The benefits of this approach are:<p>- Domain owners can grant time-limited, granular permissions for third parties to verify a domain<p>- Every service provider could use the same verification record<p>- 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<p>- 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<p>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.<p>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:<p>1. HASH(user@example.com) -> 4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg<p>2. Store Domain Verification record at: 4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg._dv.dvexample.com<p>3. TXT record determines permissions and time limit:<p>@dv=1;d=Example user emali;e=2025-01-01;s=[seo;email];h=4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg<p>BTW, if you're interested the syntax of that DNS record is a compact data serialisation format I created especially for DNS [3].<p>Thanks for taking a look,<p>Elliott<p>1. <a href="https://www.domainverification.org" rel="nofollow">https://www.domainverification.org</a><p>2. dig target.com TXT<p>3. <a href="https://www.compactdata.org" rel="nofollow">https://www.compactdata.org</a><p>(edit: formatting)

Show HN: Make domain verification as easy as verifying an email or phone number

Hi HN,<p>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.<p>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]).<p>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.<p>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:<p>dig 4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg._dv.dvexample.com TXT<p>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.<p>The benefits of this approach are:<p>- Domain owners can grant time-limited, granular permissions for third parties to verify a domain<p>- Every service provider could use the same verification record<p>- 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<p>- 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<p>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.<p>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:<p>1. HASH(user@example.com) -> 4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg<p>2. Store Domain Verification record at: 4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg._dv.dvexample.com<p>3. TXT record determines permissions and time limit:<p>@dv=1;d=Example user emali;e=2025-01-01;s=[seo;email];h=4i7ozur385y5nsqoo0mg0mxv6t9333s2rarxrtvlpag1gsk8pg<p>BTW, if you're interested the syntax of that DNS record is a compact data serialisation format I created especially for DNS [3].<p>Thanks for taking a look,<p>Elliott<p>1. <a href="https://www.domainverification.org" rel="nofollow">https://www.domainverification.org</a><p>2. dig target.com TXT<p>3. <a href="https://www.compactdata.org" rel="nofollow">https://www.compactdata.org</a><p>(edit: formatting)

Show HN: Remove sponsored content in YouTube videos

Show HN: The HN Recap – AI generated daily HN podcast

We've been running The HN Recap for a month to make it easier to consume Hacker News. While this was a PoC in understanding adoption for AI-generated podcasts, we now plan to keep this going, since lots of people are now listening to this daily.<p>Let us know what other content channels you'd like to receive as Podcasts and we'll get on it.<p>Read more about our learnings here → <a href="https://wondercraft.ai/blog/learnings-from-1-month-of-ai-podcast">https://wondercraft.ai/blog/learnings-from-1-month-of-ai-pod...</a>

Show HN: The HN Recap – AI generated daily HN podcast

We've been running The HN Recap for a month to make it easier to consume Hacker News. While this was a PoC in understanding adoption for AI-generated podcasts, we now plan to keep this going, since lots of people are now listening to this daily.<p>Let us know what other content channels you'd like to receive as Podcasts and we'll get on it.<p>Read more about our learnings here → <a href="https://wondercraft.ai/blog/learnings-from-1-month-of-ai-podcast">https://wondercraft.ai/blog/learnings-from-1-month-of-ai-pod...</a>

Show HN: A search engine for your personal network of high-quality websites

Hey all,<p>Last time when we were on HackerNews [1], we received a lot of feedback, and we incorporated most of it.<p>- We have changed our name from grep.help to usegrasp.com<p>- A privacy policy page<p>- Bulk import<p>- Pricing page<p>We are happy to introduce a new feature: a personalized answer search engine that provides direct citations to the content on the page.<p>Demo: <a href="https://usegrasp.com/search?q=is+starship+fully+reusable?" rel="nofollow">https://usegrasp.com/search?q=is+starship+fully+reusable?</a><p>1 - <a href="https://news.ycombinator.com/item?id=35510949" rel="nofollow">https://news.ycombinator.com/item?id=35510949</a>

Show HN: A search engine for your personal network of high-quality websites

Hey all,<p>Last time when we were on HackerNews [1], we received a lot of feedback, and we incorporated most of it.<p>- We have changed our name from grep.help to usegrasp.com<p>- A privacy policy page<p>- Bulk import<p>- Pricing page<p>We are happy to introduce a new feature: a personalized answer search engine that provides direct citations to the content on the page.<p>Demo: <a href="https://usegrasp.com/search?q=is+starship+fully+reusable?" rel="nofollow">https://usegrasp.com/search?q=is+starship+fully+reusable?</a><p>1 - <a href="https://news.ycombinator.com/item?id=35510949" rel="nofollow">https://news.ycombinator.com/item?id=35510949</a>

Show HN: A search engine for your personal network of high-quality websites

Hey all,<p>Last time when we were on HackerNews [1], we received a lot of feedback, and we incorporated most of it.<p>- We have changed our name from grep.help to usegrasp.com<p>- A privacy policy page<p>- Bulk import<p>- Pricing page<p>We are happy to introduce a new feature: a personalized answer search engine that provides direct citations to the content on the page.<p>Demo: <a href="https://usegrasp.com/search?q=is+starship+fully+reusable?" rel="nofollow">https://usegrasp.com/search?q=is+starship+fully+reusable?</a><p>1 - <a href="https://news.ycombinator.com/item?id=35510949" rel="nofollow">https://news.ycombinator.com/item?id=35510949</a>

Show HN: A search engine for your personal network of high-quality websites

Hey all,<p>Last time when we were on HackerNews [1], we received a lot of feedback, and we incorporated most of it.<p>- We have changed our name from grep.help to usegrasp.com<p>- A privacy policy page<p>- Bulk import<p>- Pricing page<p>We are happy to introduce a new feature: a personalized answer search engine that provides direct citations to the content on the page.<p>Demo: <a href="https://usegrasp.com/search?q=is+starship+fully+reusable?" rel="nofollow">https://usegrasp.com/search?q=is+starship+fully+reusable?</a><p>1 - <a href="https://news.ycombinator.com/item?id=35510949" rel="nofollow">https://news.ycombinator.com/item?id=35510949</a>

Show HN: Marqt.org lets you vote on the truth

I'm Arthur, and I wanted to share an MVP for Marqt.org, which lets you crowd-source the truth.<p>John Stuart Mill said that "Truth emerges from the clash of ideas." In that spirit, Marqt brings two adversarial sides together to quantify truth and showcase the best arguments for each side.<p>It is inspired by markets, where buyers and sellers discover a product's true price and update it dynamically. The ultimate aim is to build an open-source semantic knowledge base that represents the collective wisdom of humanity in real-time.<p>If we can do this, I believe it can solve the problem of misinformation in the media and slow the virality of disinformation. More importantly, I believe can be a key part of the AGI stack and allow humans to be paid for building and maintaining it.<p>So what is a marqt? A marqt is a short statement (120 chars or less) that can be true or false. You swipe right to "marq it" true or swipe left to "marq it" false (or use hotkeys j/k or t/f).<p>Your "marq" counts toward a collective tally that determines how true or false any given marqt is (so something can be "68% true" or "93% false"). Unlike polls, marqts don't expire, so you can change your marq if new data or evidence comes to light or if you change your mind.<p>After you "make your marq," you are encouraged to add a "remarq," or an explanation for your vote. Existing remarqs can be upvoted or downvoted based on how "remarqable" or "unremarqable" they are, a la Stack Overflow.<p>You can also "make a marqt" by entering a statement into the marqt maker. You submit by marqing it true or false. It currently only accepts statements in the present tense ("current truths"), but "future truths" (predictions) will come down the line. Inside the marqt maker is a fine-tuned BERT model that roughly ensures the statement is sensical, grammatical, and not a question.<p>"Show me the incentives and I will show you the outcome." -Charlie Munger<p>The incentives in betting markets are to win money, but for every winner there is a loser on the other side, making it arguably a zero-sum game. The incentives in the marqt are to create engaging marqts that encourage the most participation through a point system called "marqs earned." The goal is eventually for people to be able to trade in their marqs earned for money (via a "marqtplace," of course).<p>You earn one point for every marq you make, every remarq you add, every remarqable or unremarqable vote, and for every marqt you make. However, if you are the marqt maker, you collect all the points from the activity in your marqt – every marq, remarq, and remarqable/unremarqable vote. You also collect all the remarqable upvotes for your remarqs. Likewise, you lose points for unremarqable downvotes.<p>You can view everything and interact with the UI and inference model in demo mode (without signing up), but I hope you sign up for an account. I intentionally am not using analytics or cookies because I'm not interested in secretly tracking what users do on the site, I'm interested in showcasing what they create.<p>It's just an MVP for now. You may need to refresh the page every now and then, but please point out any bugs and feature requests. I specifically learned how to program a year and a half ago so that I could build Marqt.org because I believe it is important for society to accurately define truth in an age when information travels (and changes) faster than ever, and when LLMs so confidently lie and have been heavily prompted to avoid controversial topics.<p>I have deep respect for the HN community, and I won't hide the fact that it's nerve-wracking to finally announce this because you're all so brilliant. I welcome your criticism and advice, and sincerely thank you for your time.<p>Arthur arthur@marqt.org<p>Front-end: JavaScript Back-end and API: Django/DRF ML: deberta-v3-xsmall via Hugging Face Deployed on: Google Cloud Run

Show HN: Marqt.org lets you vote on the truth

I'm Arthur, and I wanted to share an MVP for Marqt.org, which lets you crowd-source the truth.<p>John Stuart Mill said that "Truth emerges from the clash of ideas." In that spirit, Marqt brings two adversarial sides together to quantify truth and showcase the best arguments for each side.<p>It is inspired by markets, where buyers and sellers discover a product's true price and update it dynamically. The ultimate aim is to build an open-source semantic knowledge base that represents the collective wisdom of humanity in real-time.<p>If we can do this, I believe it can solve the problem of misinformation in the media and slow the virality of disinformation. More importantly, I believe can be a key part of the AGI stack and allow humans to be paid for building and maintaining it.<p>So what is a marqt? A marqt is a short statement (120 chars or less) that can be true or false. You swipe right to "marq it" true or swipe left to "marq it" false (or use hotkeys j/k or t/f).<p>Your "marq" counts toward a collective tally that determines how true or false any given marqt is (so something can be "68% true" or "93% false"). Unlike polls, marqts don't expire, so you can change your marq if new data or evidence comes to light or if you change your mind.<p>After you "make your marq," you are encouraged to add a "remarq," or an explanation for your vote. Existing remarqs can be upvoted or downvoted based on how "remarqable" or "unremarqable" they are, a la Stack Overflow.<p>You can also "make a marqt" by entering a statement into the marqt maker. You submit by marqing it true or false. It currently only accepts statements in the present tense ("current truths"), but "future truths" (predictions) will come down the line. Inside the marqt maker is a fine-tuned BERT model that roughly ensures the statement is sensical, grammatical, and not a question.<p>"Show me the incentives and I will show you the outcome." -Charlie Munger<p>The incentives in betting markets are to win money, but for every winner there is a loser on the other side, making it arguably a zero-sum game. The incentives in the marqt are to create engaging marqts that encourage the most participation through a point system called "marqs earned." The goal is eventually for people to be able to trade in their marqs earned for money (via a "marqtplace," of course).<p>You earn one point for every marq you make, every remarq you add, every remarqable or unremarqable vote, and for every marqt you make. However, if you are the marqt maker, you collect all the points from the activity in your marqt – every marq, remarq, and remarqable/unremarqable vote. You also collect all the remarqable upvotes for your remarqs. Likewise, you lose points for unremarqable downvotes.<p>You can view everything and interact with the UI and inference model in demo mode (without signing up), but I hope you sign up for an account. I intentionally am not using analytics or cookies because I'm not interested in secretly tracking what users do on the site, I'm interested in showcasing what they create.<p>It's just an MVP for now. You may need to refresh the page every now and then, but please point out any bugs and feature requests. I specifically learned how to program a year and a half ago so that I could build Marqt.org because I believe it is important for society to accurately define truth in an age when information travels (and changes) faster than ever, and when LLMs so confidently lie and have been heavily prompted to avoid controversial topics.<p>I have deep respect for the HN community, and I won't hide the fact that it's nerve-wracking to finally announce this because you're all so brilliant. I welcome your criticism and advice, and sincerely thank you for your time.<p>Arthur arthur@marqt.org<p>Front-end: JavaScript Back-end and API: Django/DRF ML: deberta-v3-xsmall via Hugging Face Deployed on: Google Cloud Run

Show HN: Narr – Download Netflix audio for sampling

Show HN: Narr – Download Netflix audio for sampling

Show HN: Narr – Download Netflix audio for sampling

Shatter, the First Comic Made on a Computer (1985)

A comic book created by Mike Saenz, Peter B. Gillis and Charles Athanas in the mid-1980s on an Apple Macintosh (though with traditional, analog coloring). This milestone of the comics industry started out successfully but ran its course after 14 issues. It paved the way for other digital comics like Das Robot Imperium by Michael Götze, Iron Man: Crash by Mike Saenz and Batman: Digital Justice by Pepe Moreno.

Show HN: Ask Harry Potter any question with GPT-4

I've enjoyed using CharacterAI a lot, and I also use OpenAI's API's for work and personal projects. I wanted to see if I could get the model to behave as believably as CharacterAI counterparts with just a system prompt - and I think it does. Curious if others agree.

< 1 2 3 ... 416 417 418 419 420 ... 854 855 856 >