The best Hacker News stories from Show from the past day
Latest posts:
Show HN: Lurnby, a tool for better learning, is now open source
I've been working on Lurnby for 2 years. It's kind of like a mix of pocket + kindle + anki.<p>It lets you
=> add add epubs, pdfs, and web articles to the app
=> highlight and add comments
=> tag and organize highlights
=> review them with a spaced repetition system<p>Today I made the decision to open source the project. I'm passionate about helping other people learn to learn better and hope that this will allow a lot more innovation in the tool and the space.<p>I'm very new to open source and development in general really, but looking forward to receiving the guidance of the community.
Show HN: Redirect your customers from your marketing page to your app
Hi HN!<p>I've gotten a bit frustrated by going to `datadog.com` instead of `app.datadog.com`. I know that I could use a chrome extension to do this redirect for me (I do). But since this is a painful UX, I think that SaaS companies should do something to improve it for all of their users.<p>So I made `marketing-redirect`, a quick bit of HTML to put on a marketing page that lets customers get automatically redirected to the application they're already paying for:<p>https://github.com/elliotaplant/marketing-redirect<p>You can see an example of it in action here:<p>https://elliotplant.com/marketing-redirect/<p>Aside from just making the tools I use better, I'm brainstorming ways to monetize this. My best idea is to create a cloud service the help marketing teams remove or tag the page views from paying customers who visit their marketing page so their analytics software can exclude them as possible leads. I'd love to hear your feedback.<p>Thanks,<p>Elliot
Show HN: A Schemaless Data Store Within Your SQL Database
Hi HN, we're Eric and Dean, creators of SchemafreeSQL. Its roots go back to an on-line Web App Development Environment we developed back in 1999. It was comprised of an IDE, Web Server, Object Store, Virtual File System, Template System, and polyglot (Java, JavaScript, and Python). Of course, we named it “.OS”. Then we ended up dropping it. But that's a story for another time. It was the ease of use of the Object Store from .OS that we really missed, which brings us back to SchemafreeSQL. It provides an enhanced API to your SQL Database which allows it to function as a Schemaless Objectstore. Yes, "Schemaless Objectstore" might be an oxymoron if you consider that objects have strict "schemas". So what are we talking about here?<p>It started with a simple goal. We wanted to store data just as simply as one could throw a JSON document into a doc store, but while maintaining the power of the data's relations and references in an object sense.<p>What we ended up with was a JSON over HTTP API (for ubiquitous access from any language), that maps any JSON structure into an optimized, static set of indexed tables in any SQL database (MySQL being our first port). Using it, we can immediately store any data we want, without having to create tables and indexes and optimize them.<p>Inserting data is as easy as sending a JSON doc to a doc store, but in SFSQL all nested relations inherent within that document are stored as objects and primitives. And, with a little extra JSON syntax we can use references and eliminate duplication of data (e.g. "#ref": "oid-goes-here"), all from within the same source JSON doc. There is also no added speed penalty for referencing an object. In fact, all parent nodes in the JSON source data are stored as objects. So any object can be referenced from anywhere, allowing for complex relations (e.g. any-to-any), enabling rapid prototyping of data structures (no tables to create), and enabling unique on-the-fly relations if need be.<p>Queries are issued using JOIN-free SQL query syntax (e.g. SELECT COUNT(*) WHERE $s:person.address.state='NY') that eliminates the verbosity of the standard SQL JOIN, yet still maintains access to the primitive and aggregate functions of the underlying SQL database (e.g. FORMAT(), COUNT(), etc.) which simply get passed through.<p>What it's not? It's not a database on it's own and it's not a horizontally scalable big data store. Although, since it can extend practically any SQL database, it's ability to scale is in large part tied to the scaling ability of the chosen SQL database that it's extending. It's also not an ORM as there is no strict mapping of objects in code to objects in the datastore. And yes, there were trade offs in it's design. One design choice was that every primitive be indexed, which results in better performance than against a straight SQL table without the proper indexes, though slower than a straight SQL table with a composite index tailored to that query. But, the ability to JOIN to an existing SQL table within a SFSQL query is on the roadmap which will allow you have the best of both worlds (custom tables w/custom indexes referenced from within a SFSQL query). As well, there is a situation one encounters in indexing choices (but that you won't encounter with SFSQL) that we like to call the "Index Permutation Limitation". Simply put, there is a real limit to the number of composite indexes that you can create for any table/collection. This is especially a problem when - for instance - you want to give end users the ability to query across any of the possible attributes across the myriad product types that a big online store may carry. We get into detail on this point within our FAQ.<p>So what it is?
It's an extension to SQL databases that makes storing and querying and modeling and just generally using a datastore... easier. We're hoping it will stir up some interesting use-cases.<p>Thanks in advance for the feedback!
Show HN: Updatecli – What if Dependabot and Ansible had a child?
What if Dependabot and Ansible had a child?
Well for me that could be Updatecli.<p>Updatecli is a project that I started to help maintain the infrastructure of the Jenkins project. I needed something flexible enough to update YAML with whatever information needed. Because let’s say it, everybody loves YAML. YAML is everywhere.<p>Run it from everywhere…<p>Updatecli is a command-line tool written in Golang and available for Windows, Linux, MacOSx, amd64, arm64, thank you Goreleaser
All of that to say that it runs from wherever CI or laptop we need.<p>As of today, Updatecli opened over 3000 Pull requests on Github, and it evolved to update automatically Dockerfile, Markdown, Helm Chart, and of course a lot of YAML for tools like Puppet, Kubernetes, or Jenkins.<p>How does it work?<p>Updatecli loads pipeline configurations from YAML(s) or Golang templates then enforce the state defined by the pipeline configuration.
A pipeline run as followed:<p>1. Clone in a temporary location any git repositories used by the pipeline.<p>2. Fetch information for every *source* defined, and then inject them as entry parameters into condition(s) and target(s).<p>3. Test that all *conditions* defined succeed otherwise abort the pipeline.<p>4. Enforce the state for every *target* defined. A state means different things depending on the resource type, more on this later.<p>5. Commit and open pull requests when needed.<p>6. Apply next pipeline<p>A Updatecli pipeline relies on resources aka “extension” aka “plugins” to adapt pipeline behavior. By combining them, we can easily automate scenarios for release workflow, GitOps, dependency management, documentation update, etc.<p>A simple scenario could be:
* Retrieve the latest Golang version
* Test that a docker image with the latest Golang version exist on Dockerhub
* If it exists, then bump the version in a YAML file and open a pull request on GitHub with the change<p>As of today, there are 9 extensions for "sources", 8 for "conditions", 6 for "targets", 2 for git repositories, and 1 for pull requests.<p>A very simple pipeline is available on
-> <a href="https://www.updatecli.io/docs/prologue/quick-start/" rel="nofollow">https://www.updatecli.io/docs/prologue/quick-start/</a><p>For more complex pipelines, you can look for directories named “updatecli/updatecli.d” at the root of repositories on <a href="https://github.com/updatecli" rel="nofollow">https://github.com/updatecli</a> or the Jenkins infrastructure repository such as
<a href="https://github.com/jenkins-infra/kubernetes-management/tree/main/updatecli" rel="nofollow">https://github.com/jenkins-infra/kubernetes-management/tree/...</a><p>I maintain a documentation website to document the different configuration.
It’s not perfect but it’s available on www.updatecli.io<p>What’s next?<p>Well, it depends on many things. Updatecli is since the beginning, a fun side project, I wanted to practice Golang programming while automating tedious recurring tasks. I built it in a way that I could reuse it across the different projects which I maintain. It’s rather simple to add new resources so I’ll keep adding them based on my needs, I welcome any contributions that would benefit the community.<p>More information on
<a href="https://www.updatecli.io" rel="nofollow">https://www.updatecli.io</a>
<a href="https://github.com/updatecli/updatecli" rel="nofollow">https://github.com/updatecli/updatecli</a>
Show HN: Updatecli – What if Dependabot and Ansible had a child?
What if Dependabot and Ansible had a child?
Well for me that could be Updatecli.<p>Updatecli is a project that I started to help maintain the infrastructure of the Jenkins project. I needed something flexible enough to update YAML with whatever information needed. Because let’s say it, everybody loves YAML. YAML is everywhere.<p>Run it from everywhere…<p>Updatecli is a command-line tool written in Golang and available for Windows, Linux, MacOSx, amd64, arm64, thank you Goreleaser
All of that to say that it runs from wherever CI or laptop we need.<p>As of today, Updatecli opened over 3000 Pull requests on Github, and it evolved to update automatically Dockerfile, Markdown, Helm Chart, and of course a lot of YAML for tools like Puppet, Kubernetes, or Jenkins.<p>How does it work?<p>Updatecli loads pipeline configurations from YAML(s) or Golang templates then enforce the state defined by the pipeline configuration.
A pipeline run as followed:<p>1. Clone in a temporary location any git repositories used by the pipeline.<p>2. Fetch information for every *source* defined, and then inject them as entry parameters into condition(s) and target(s).<p>3. Test that all *conditions* defined succeed otherwise abort the pipeline.<p>4. Enforce the state for every *target* defined. A state means different things depending on the resource type, more on this later.<p>5. Commit and open pull requests when needed.<p>6. Apply next pipeline<p>A Updatecli pipeline relies on resources aka “extension” aka “plugins” to adapt pipeline behavior. By combining them, we can easily automate scenarios for release workflow, GitOps, dependency management, documentation update, etc.<p>A simple scenario could be:
* Retrieve the latest Golang version
* Test that a docker image with the latest Golang version exist on Dockerhub
* If it exists, then bump the version in a YAML file and open a pull request on GitHub with the change<p>As of today, there are 9 extensions for "sources", 8 for "conditions", 6 for "targets", 2 for git repositories, and 1 for pull requests.<p>A very simple pipeline is available on
-> <a href="https://www.updatecli.io/docs/prologue/quick-start/" rel="nofollow">https://www.updatecli.io/docs/prologue/quick-start/</a><p>For more complex pipelines, you can look for directories named “updatecli/updatecli.d” at the root of repositories on <a href="https://github.com/updatecli" rel="nofollow">https://github.com/updatecli</a> or the Jenkins infrastructure repository such as
<a href="https://github.com/jenkins-infra/kubernetes-management/tree/main/updatecli" rel="nofollow">https://github.com/jenkins-infra/kubernetes-management/tree/...</a><p>I maintain a documentation website to document the different configuration.
It’s not perfect but it’s available on www.updatecli.io<p>What’s next?<p>Well, it depends on many things. Updatecli is since the beginning, a fun side project, I wanted to practice Golang programming while automating tedious recurring tasks. I built it in a way that I could reuse it across the different projects which I maintain. It’s rather simple to add new resources so I’ll keep adding them based on my needs, I welcome any contributions that would benefit the community.<p>More information on
<a href="https://www.updatecli.io" rel="nofollow">https://www.updatecli.io</a>
<a href="https://github.com/updatecli/updatecli" rel="nofollow">https://github.com/updatecli/updatecli</a>
Show HN: Makers.so – A website builder inside Figma
Founder here. Makers.so is a Figma Plugin to build and publish sites without ever leaving Figma. Here’s a demo [0].<p>As a front-end developer I constantly go from Figma to code / site, but it’s tedious… I decided to automate the process with this plugin. It works great for simple projects like:<p>- Landing Pages<p>- Portfolio / Personal sites<p>- Resume sites<p>- Careers / Wiki sites<p>So, not a Webflow / Framer competitor (yet). Webflow and Framer are amazing tools, but if you are in the Figma ecosystem, it's boring to duplicate your work on a different tool. I'm trying to make life easier for Figma users. If this seems interesting, you can install it here [1] and give it a try.<p>—<p>For a bit of context, I'm a solo-founder and I started Makers after sharing my idea on the Figma subreddit about how awesome it would be to have a button in Figma to publish my designs. A good amount of people seemed to agree, and that was enough to start working on it. This is turning out to be a super fun project, and I’ve been working full-time for the last two months.<p>[0] - <a href="https://twitter.com/joaodmj/status/1488216877511884805?s=20" rel="nofollow">https://twitter.com/joaodmj/status/1488216877511884805?s=20</a><p>[1] - <a href="https://www.figma.com/community/plugin/991438050654881175" rel="nofollow">https://www.figma.com/community/plugin/991438050654881175</a>
Show HN: Makers.so – A website builder inside Figma
Founder here. Makers.so is a Figma Plugin to build and publish sites without ever leaving Figma. Here’s a demo [0].<p>As a front-end developer I constantly go from Figma to code / site, but it’s tedious… I decided to automate the process with this plugin. It works great for simple projects like:<p>- Landing Pages<p>- Portfolio / Personal sites<p>- Resume sites<p>- Careers / Wiki sites<p>So, not a Webflow / Framer competitor (yet). Webflow and Framer are amazing tools, but if you are in the Figma ecosystem, it's boring to duplicate your work on a different tool. I'm trying to make life easier for Figma users. If this seems interesting, you can install it here [1] and give it a try.<p>—<p>For a bit of context, I'm a solo-founder and I started Makers after sharing my idea on the Figma subreddit about how awesome it would be to have a button in Figma to publish my designs. A good amount of people seemed to agree, and that was enough to start working on it. This is turning out to be a super fun project, and I’ve been working full-time for the last two months.<p>[0] - <a href="https://twitter.com/joaodmj/status/1488216877511884805?s=20" rel="nofollow">https://twitter.com/joaodmj/status/1488216877511884805?s=20</a><p>[1] - <a href="https://www.figma.com/community/plugin/991438050654881175" rel="nofollow">https://www.figma.com/community/plugin/991438050654881175</a>
Show HN: EdgeDB 1.0
Show HN: EdgeDB 1.0
Show HN: EdgeDB 1.0
Show HN: EdgeDB 1.0
Show HN: EdgeDB 1.0
Show HN: Zingg – open-source entity resolution for single source of truth
Hello HN,<p>I am Sonal, a data consultant from India. For the past few months(and years!), I have been working on an entity resolution tool to build a single source of truth for customers, suppliers, products and parts. Here is a short demo of Zingg in action https://www.youtube.com/watch?v=zOabyZxN9b0<p>As a data consultant, I often struggled to build unified views of core entities on the datalake and the warehouse. Data spread across different systems has variations and consistencies making Customer 360, KYC, AML, segmentation, personalization and other analytics difficult.<p>As I talked with different clients facing this issue, I searched for existing solutions which I could use or recommend. Unfortunately, most of them were very expensive MDM solutions like Tamr, or CDP solutions like Amperity. There were many open source libraries, but they did not tie well into the datalake/warehouse scenarios we were working with, did not scale and/or needed a decent bit of programming or did not generalize. I even tried to build something internally and failed miserably, and that got me hooked :-)<p>As I dug deeper into the problem, I realized that there were multiple challenges. Data matching, at its very core, becomes a cartesian join, as you need to compare every pair of records to figure out the matches. With millions of records, this becomes extremely tough to scale. I referred to various research papers and then implemented a blocking algorithm to overcome this. More details at https://docs.zingg.ai/docs/zModels.html<p>The second challenge was to say which pairs are a match. I wanted to have a machine learning-based approach to handle the different types of entities and the variety of differences in real world data. But I also felt that non ML experts should be able to use Zingg easily, hence took the approach of abstracting the feature generation and hyper-parameter tuning for the classifier.<p>Once I settled on the ML approach, the problem of training data quickly arose, which led me to pick up active learning and build an interactive labeler through which sample records can be marked as matches and non matches to build training sets quickly. I still feel that we should have an unsupervised approach as well, but I have not yet figured out the right way to do so.<p>The Zingg repository is hosted at https://github.com/zinggAI/zingg and we have close to 60 members on our Slack(https://join.slack.com/t/zinggai/shared_invite/zt-w7zlcnol-vEuqU9m~Q56kLLUVxRgpOA). We are now two developers working full time on Zingg!!! I am super happy that early users have been able to use Zingg and push us to build more stuff - model documentation, using pre-existing training data, native Snowflake integration etc.<p>I have been an open source consumer all my dev life, and this is the first time I have made a decent contribution. It is my first time trying to build a community as well. Not sure how the future will unfold, but wanted to reach out to the community here and hear what you think about the problem, the approach, any ideas or suggestions.<p>Thanks for reading along, and please do post your thoughts in the comments below.
Show HN: 'Url Checker' available now on F-Droid
Show HN: Jless, a command-line JSON viewer
Hey, Hacker News! Today I'm proud to release jless, a command-line JSON viewer.<p>jless provides a JSON viewing experience similar to what you see in a browser's network tab in the developer console, but from the comfort of your terminal, with a whole suite of vim-inspired key bindings to easily manipulate your view of the data and full-text regex search. I'm sure many of you have some piped together some combination of cat, jq and less before; hopefully jless can replace that usage (hence the name). It supports newline delimited JSON too, so it can handle any output from jq.<p>I built jless to solve a problem I kept facing while building plaintextsports.com [1][2]. For the live data I use a lot of public, but undocumented APIs, and I was constantly digging through giant JSON files to understand how the data was structured. I tried installing multiple Chrome extensions, but was dissatisfied with all of them. I piped files through jq into less a lot, and that was ok, but not great. The Preview pane in the Network tab of Chrome's dev tools was pretty useful, and I modeled a lot of jless's behavior and appearance off of that, but it didn't fit well into my tmux + vim dev environment, and I couldn't easily use it to inspect files on disk. I wanted that experience, but in my terminal (and with search support).<p>Once I had built a rudimentary version of jless a few months ago, I immediately started using it whenever I was debugging something, and my usage has only grown as I've added more basic functionality. I've finally added all the features I feel like it needs to be functional, useful, and reliable.<p>There's definitely more features I want to add: Windows support, some way to filter data with jq filters (a la fx [3]), yanking objects to the clipboard, being able to hide keys entirely, streaming data in, so you can peek at the start of gigantic file, maybe a way to extract a schema from a file (like [4]), plenty of low-hanging fruit for performance. Support for different hierarchical data formats (YAML, TOML, XML) could be cool someday. I'm sure many people will ask for editing support, but sadly that is not something I plan on adding anytime soon.<p>I also used this project as a chance to learn Rust (code style and design comments appreciated!), which I had only dabbled with before. For a command-line utility, this felt like an obvious choice: small binaries (~3mb), instant startup, and great performance without any effort (try searching for comma in a big file!).<p>I hope you find it useful!<p>[1]: <a href="https://plaintextsports.com" rel="nofollow">https://plaintextsports.com</a>, live sports scores in plain text, no ads, no tracking, no loading<p>[2]: <a href="https://news.ycombinator.com/item?id=26310314" rel="nofollow">https://news.ycombinator.com/item?id=26310314</a><p>[3]: <a href="https://news.ycombinator.com/item?id=29861043" rel="nofollow">https://news.ycombinator.com/item?id=29861043</a><p>[4]: <a href="https://quicktype.io/typescript" rel="nofollow">https://quicktype.io/typescript</a>
Show HN: Jless, a command-line JSON viewer
Hey, Hacker News! Today I'm proud to release jless, a command-line JSON viewer.<p>jless provides a JSON viewing experience similar to what you see in a browser's network tab in the developer console, but from the comfort of your terminal, with a whole suite of vim-inspired key bindings to easily manipulate your view of the data and full-text regex search. I'm sure many of you have some piped together some combination of cat, jq and less before; hopefully jless can replace that usage (hence the name). It supports newline delimited JSON too, so it can handle any output from jq.<p>I built jless to solve a problem I kept facing while building plaintextsports.com [1][2]. For the live data I use a lot of public, but undocumented APIs, and I was constantly digging through giant JSON files to understand how the data was structured. I tried installing multiple Chrome extensions, but was dissatisfied with all of them. I piped files through jq into less a lot, and that was ok, but not great. The Preview pane in the Network tab of Chrome's dev tools was pretty useful, and I modeled a lot of jless's behavior and appearance off of that, but it didn't fit well into my tmux + vim dev environment, and I couldn't easily use it to inspect files on disk. I wanted that experience, but in my terminal (and with search support).<p>Once I had built a rudimentary version of jless a few months ago, I immediately started using it whenever I was debugging something, and my usage has only grown as I've added more basic functionality. I've finally added all the features I feel like it needs to be functional, useful, and reliable.<p>There's definitely more features I want to add: Windows support, some way to filter data with jq filters (a la fx [3]), yanking objects to the clipboard, being able to hide keys entirely, streaming data in, so you can peek at the start of gigantic file, maybe a way to extract a schema from a file (like [4]), plenty of low-hanging fruit for performance. Support for different hierarchical data formats (YAML, TOML, XML) could be cool someday. I'm sure many people will ask for editing support, but sadly that is not something I plan on adding anytime soon.<p>I also used this project as a chance to learn Rust (code style and design comments appreciated!), which I had only dabbled with before. For a command-line utility, this felt like an obvious choice: small binaries (~3mb), instant startup, and great performance without any effort (try searching for comma in a big file!).<p>I hope you find it useful!<p>[1]: <a href="https://plaintextsports.com" rel="nofollow">https://plaintextsports.com</a>, live sports scores in plain text, no ads, no tracking, no loading<p>[2]: <a href="https://news.ycombinator.com/item?id=26310314" rel="nofollow">https://news.ycombinator.com/item?id=26310314</a><p>[3]: <a href="https://news.ycombinator.com/item?id=29861043" rel="nofollow">https://news.ycombinator.com/item?id=29861043</a><p>[4]: <a href="https://quicktype.io/typescript" rel="nofollow">https://quicktype.io/typescript</a>
Show HN: Jless, a command-line JSON viewer
Hey, Hacker News! Today I'm proud to release jless, a command-line JSON viewer.<p>jless provides a JSON viewing experience similar to what you see in a browser's network tab in the developer console, but from the comfort of your terminal, with a whole suite of vim-inspired key bindings to easily manipulate your view of the data and full-text regex search. I'm sure many of you have some piped together some combination of cat, jq and less before; hopefully jless can replace that usage (hence the name). It supports newline delimited JSON too, so it can handle any output from jq.<p>I built jless to solve a problem I kept facing while building plaintextsports.com [1][2]. For the live data I use a lot of public, but undocumented APIs, and I was constantly digging through giant JSON files to understand how the data was structured. I tried installing multiple Chrome extensions, but was dissatisfied with all of them. I piped files through jq into less a lot, and that was ok, but not great. The Preview pane in the Network tab of Chrome's dev tools was pretty useful, and I modeled a lot of jless's behavior and appearance off of that, but it didn't fit well into my tmux + vim dev environment, and I couldn't easily use it to inspect files on disk. I wanted that experience, but in my terminal (and with search support).<p>Once I had built a rudimentary version of jless a few months ago, I immediately started using it whenever I was debugging something, and my usage has only grown as I've added more basic functionality. I've finally added all the features I feel like it needs to be functional, useful, and reliable.<p>There's definitely more features I want to add: Windows support, some way to filter data with jq filters (a la fx [3]), yanking objects to the clipboard, being able to hide keys entirely, streaming data in, so you can peek at the start of gigantic file, maybe a way to extract a schema from a file (like [4]), plenty of low-hanging fruit for performance. Support for different hierarchical data formats (YAML, TOML, XML) could be cool someday. I'm sure many people will ask for editing support, but sadly that is not something I plan on adding anytime soon.<p>I also used this project as a chance to learn Rust (code style and design comments appreciated!), which I had only dabbled with before. For a command-line utility, this felt like an obvious choice: small binaries (~3mb), instant startup, and great performance without any effort (try searching for comma in a big file!).<p>I hope you find it useful!<p>[1]: <a href="https://plaintextsports.com" rel="nofollow">https://plaintextsports.com</a>, live sports scores in plain text, no ads, no tracking, no loading<p>[2]: <a href="https://news.ycombinator.com/item?id=26310314" rel="nofollow">https://news.ycombinator.com/item?id=26310314</a><p>[3]: <a href="https://news.ycombinator.com/item?id=29861043" rel="nofollow">https://news.ycombinator.com/item?id=29861043</a><p>[4]: <a href="https://quicktype.io/typescript" rel="nofollow">https://quicktype.io/typescript</a>
Show HN: Open Policy Registry: a Docker-inspired workflow for OPA policies
Show HN: Open Policy Registry: a Docker-inspired workflow for OPA policies
Show HN: PgCat, Postgres pooler with sharding, load balancing and failover