{"action":"created","issue":{"url":"https://api.github.com/repos/carrotIndustries/horizon/issues/148","repository_url":"https://api.github.com/repos/carrotIndustries/horizon","labels_url":"https://api.github.com/repos/carrotIndustries/horizon/issues/148/labels{/name}","comments_url":"https://api.github.com/repos/carrotIndustries/horizon/issues/148/comments","events_url":"https://api.github.com/repos/carrotIndustries/horizon/issues/148/events","html_url":"https://github.com/carrotIndustries/horizon/issues/148","id":320042960,"node_id":"MDU6SXNzdWUzMjAwNDI5NjA=","number":148,"title":"A pool side scenario","user":{"login":"atoav","id":6620266,"node_id":"MDQ6VXNlcjY2MjAyNjY=","avatar_url":"https://avatars1.githubusercontent.com/u/6620266?v=4","gravatar_id":"","url":"https://api.github.com/users/atoav","html_url":"https://github.com/atoav","followers_url":"https://api.github.com/users/atoav/followers","following_url":"https://api.github.com/users/atoav/following{/other_user}","gists_url":"https://api.github.com/users/atoav/gists{/gist_id}","starred_url":"https://api.github.com/users/atoav/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/atoav/subscriptions","organizations_url":"https://api.github.com/users/atoav/orgs","repos_url":"https://api.github.com/users/atoav/repos","events_url":"https://api.github.com/users/atoav/events{/privacy}","received_events_url":"https://api.github.com/users/atoav/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":10,"created_at":"2018-05-03T19:06:45Z","updated_at":"2018-11-02T22:47:03Z","closed_at":null,"author_association":"NONE","body":"**Disclaimer:** this is not exactly an _Issue_ in the typical form, but more like a thought. I decided against writing a blog post and to post it here, where it reaches the right people. It is likely that somebody (@carrotindustries) already grappled with similar thoughts and ideas. This is going to touch multiple conceptual topics and is more meant as a base of discussion than a real proposal for anything.\r\n\r\nWhile working on some projects using horizon I had a question: how would I go about sharing my schematic/board in a way that other people can open it without hassle. As for now I found two ways:\r\n1. Use only parts that are in the official pool\r\n2. Share my own pool right besides the project\r\n\r\n## A pool side scenario\r\n\r\nSay you need a 32 Ohm resistor quickly and there is none to be found in the public pool – so you build it yourself. Quick and dirty, you don't want to waste an evening to pedantic accuracy. It is probably incompatible to all the other parts in the pool and there is no real MPN because it was a part you had lying around and finding the exact manufacturer number is work. If only you invested a little extra time, it could be pushed into the pool and if you didn't forget a thing the part might become part of the pool after a while. But you _don't_ invest that extra time because you are a typical lazy user and you are interested to get moving with that project of yours and not deal with other things. Building that resistor already slowed you down enough, you love open source, but right now you have better things to do.\r\n\r\nSo you keep that quick'n'dirty 32 Ohm resistor – it is fair enough – as long as you keep the project to yourself it is. But now you have to ship that pool of yours with your project, so people can open it without getting strange messages about UUIDs which make little to no sense to non-programmers. Because your local pool is a mess nobody should see you decide to push it to the repository later. And because it is located in a completely different place than your project you obviously just forget about it till somebody complains a month later.  \r\n\r\nToo bad the person who complained did so only _after your hard drive crashed_ and the pool is lost (see [Murphy's Law](https://en.wikipedia.org/wiki/Murphy%27s_law)). The only way to get it back now is to create new parts and to manually change their UUIDs to match the lost parts and finally upload it again. So you fire up Sublime Text ...  \r\n\r\nThis story might sound a tiny bit dystopian, but this _will_ definitly happen once people try to share the stuff they made. \r\n\r\n## A possible solution\r\n\r\nAll of this wouldn't happen if our user would limit him/herself to using the public pool. I think the pool is a great concept for sharing parts with each other and within a community, but maybe it lacks a sort of project-centric storage that allows for quick modifications/adaptions/creation of parts that are not meant to clutter the pool. A bit like `git stash`: temporary in nature. This would make sharing much easier as files that are not part of the public pool would be able to travel with the project files. Every user could still go back to the public pool version of a part, if they like to. And the other way round: if they find a cool part in a project they downloaded they can easily integrate it into to their local pool, clean it up and make a pull request for the public pool. So essentially this solution is to automatically bundle the used units/symbols/entities/3d-models/parts/packages/padstacks with each project, which would ensure that without user action every project looks just the same it looked like when somebody created it, similar to library version lock files e.g. in a language like Rust:\r\n\r\n\r\n> The purpose of a Cargo.lock is to describe the state of the world at the\r\n> time of a successful build. It is then used to provide deterministic \r\n> builds across whatever machine is building the project by ensuring that \r\n> the exact same dependencies are being compiled.\r\n\r\nThis state of the world is saved locally with the pool. So you update only when you have the will and time to deal with possible changes, even if they should just be cosmetic in nature. If I am right, the idea beehind the existing pool cache is something similar, only without storing a project pool itself. If there are better and newer versions of parts in the library, the lock can be lifted. And if you don't care and always want to rely on the public pool, just leave the lock away. So basically this would be a the `pool cache` we have, but working also without `local pool`.  \r\n\r\nWith this train of thought we would have multiple levels of pools:  \r\n```\r\npublic pool and forks  ->  local pools  ->  project pools\r\n```\r\nIn this concept the project pool is only there to act as bridge between different people's local pools to aid the exchange of projects and \"not for production\" pool objects that are not ready for the public pool yet.  \r\n\r\n## New Users\r\n\r\nThe steps a new user has to take when they want to open a horizon project they found online. They At the moment they would have to:  \r\n1. Download/Clone the Project\r\n2. Download/Clone the fitting Pool\r\n3. Download and run Horizon\r\n4. Select that pool Pool in the project manager\r\n5. Open the project\r\n\r\nThe problem here is – these not few steps for somebody who has no clue how the software works and who bascially just liked to check it out. Also if they install horizon and then right-click on my `.hprj` and open it with horizon-prj-mgr.exe things will fall appart as they get yelled at for not having a pool installed.    \r\n\r\nMuch better would be:  \r\n1. Download/Clone the Project\r\n2. Download and run Horizon\r\n3. Open the Project\r\n\r\nWhat do you think? There are many variation.Maybe I am overcomplicating things here or my assumptions are wrong altogether and this is not a problem at all. Maybe there are already plans on how to solve this issue. I am just trying to brainstorm a little and find out where the journey is going..\r\n\r\n## Misc pool related stuff\r\nMaybe the pool should be downloaded automatically on the first start of the software (user just needs to select the location). I imagine a window that explains what the pool is: \r\n> horizon has a community maintained public pool on github. The pool contains all parts, symbols, packages and so on. It is a good start to create your own local pool as a clone from the public pool. Please select a location for it\r\n\r\nAlso nice would be a way to quickly try out pull requests listed in the Remote Tab of the Pool Manager. This would make sense to quickly check out new pull requests for maintainers, but also would make sense for people who contributed as they can already use their newly created objects in production without manually copying them. "},"comment":{"url":"https://api.github.com/repos/carrotIndustries/horizon/issues/comments/435531047","html_url":"https://github.com/carrotIndustries/horizon/issues/148#issuecomment-435531047","issue_url":"https://api.github.com/repos/carrotIndustries/horizon/issues/148","id":435531047,"node_id":"MDEyOklzc3VlQ29tbWVudDQzNTUzMTA0Nw==","user":{"login":"carrotIndustries","id":877304,"node_id":"MDQ6VXNlcjg3NzMwNA==","avatar_url":"https://avatars2.githubusercontent.com/u/877304?v=4","gravatar_id":"","url":"https://api.github.com/users/carrotIndustries","html_url":"https://github.com/carrotIndustries","followers_url":"https://api.github.com/users/carrotIndustries/followers","following_url":"https://api.github.com/users/carrotIndustries/following{/other_user}","gists_url":"https://api.github.com/users/carrotIndustries/gists{/gist_id}","starred_url":"https://api.github.com/users/carrotIndustries/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/carrotIndustries/subscriptions","organizations_url":"https://api.github.com/users/carrotIndustries/orgs","repos_url":"https://api.github.com/users/carrotIndustries/repos","events_url":"https://api.github.com/users/carrotIndustries/events{/privacy}","received_events_url":"https://api.github.com/users/carrotIndustries/received_events","type":"User","site_admin":false},"created_at":"2018-11-02T22:47:03Z","updated_at":"2018-11-02T22:47:03Z","author_association":"OWNER","body":"> C) Don't copy it, but include the offical pool (which makes authoring the pool harder because all the other parts show up)\r\n\r\nSince that's the preferred method, any idea how to improve on that situation? Maybe an option to only show items from the current pool (hide included items)."}}
{"actor":{"display_login":"carrotIndustries"}}