[{"data":1,"prerenderedAt":380},["ShallowReactive",2],{"project-40758703":3},{"id":4,"name":5,"line":6,"line_source":7,"title":8,"url":9,"domain":10,"maker":11,"posted_at":12,"year":13,"points":14,"comments":15,"rank_in_year":16,"shown_in_year":17,"top":18,"tier":19,"category":20,"subcategory":21,"format":22,"keywords":23,"reception":28,"sentiment":29,"stance_mix":30,"scored_comments":35,"aspects":36,"strip":44,"post_text":46,"what":47,"said":77,"maker_in_thread":193,"shape":205,"grid":210,"attempts":342,"same_week":343,"maker_shows":41,"maker_hidden":372,"reader_version":373,"card":374},"40758703","Envelope","A modern environment variable cli tool","title","Show HN: Envelope – A modern environment variable cli tool","https:\u002F\u002Fgithub.com\u002Fmattrighetti\u002Fenvelope","github.com","mattrighetti",1719059997,2024,103,55,814,3515,24,"notable","dev_tools","environment variable manager","cli",[24,25,22,26,27],"environment variables","env file","rust","dotenv alternative","mixed",-0.283,{"positive":31,"neutral":32,"mixed":33,"critical":34},3,12,0,13,28,{"privacy":37,"idea":39,"design":42,"docs":43},{"positive":33,"critical":38},2,{"positive":40,"critical":41},1,4,{"positive":33,"critical":31},{"positive":33,"critical":40},[40,33,33,31,45,31,33,33,33,33,33,40,40,31,40,33,33,33,33,40,40,45,31,40,33,40,31,33,40,40,40,31,31,33,31,33,31,45,31,40],5,"Hey HN! I've built this cli tool to manage env variables of a project, but mostly for fun and to try out Rust and the clap crate.\n\nI had this idea when I made a big mistake and broke some production stuff because I had a very messy .env file laying around in my project.\n\nI was implementing new features for one of my projects and in my .env file I had the test database url commented out and the production one was not. Long story short, I applied migrations to the production database instead of my local test one and broke a lot of production APIs :')\n\nI wanted a tool that could easily help me sp",{"problem":48,"audience":54,"pricing":54,"motivation":55,"time_to_build":54,"stack":59,"openness":74,"stage":75,"team_size":76},{"value":49,"source":50,"evidence":51},"Messy .env files cause mistakes, such as running migrations against the wrong database","maker",[52],{"id":53},"post",null,{"value":56,"source":50,"evidence":57},"Built mostly for fun and to try Rust, after a production database mistake",[58],{"id":53},[60,64,68],{"value":61,"source":50,"evidence":62},"Rust",[63],{"id":53},{"value":65,"source":50,"evidence":66},"clap crate",[67],{"id":53},{"value":69,"source":50,"evidence":70},"SQLite",[71],{"id":72,"by":11,"text":73},"40762359","Agreed, sqlite is definitely overkill for this kind of task but it's also lightweight and fast, so why not?","open_source","launched","solo",{"praise":78,"objections":97,"requests":133,"questions":149,"alternatives":167},[79,87],{"value":80,"source":81,"evidence":82},"Good idea for managing env variables simply","commenter",[83],{"id":84,"by":85,"text":86},"40759789","breck","I like it. Env variables should be a solved problem but no one has made the simplest general solution yet. Seems like you are on track. One suggestion: no need to use SQLite.…",{"value":88,"source":81,"evidence":89},"Useful packaging and install options requested and added",[90,94],{"id":91,"by":92,"text":93},"40759211","cranberryturkey","Can we get an arch package?",{"id":95,"by":11,"text":96},"40766421","Added an aarch version to the release ci",[98,105,116,122],{"value":99,"source":81,"evidence":100},"Storing secrets in shell history is risky",[101],{"id":102,"by":103,"text":104},"40760140","leetrout","A word of caution - this is a way to leak your secrets through your shell history: ``` $ envelope add dev db_pwd pwd ``` There are settings such that a command that starts with a…",{"value":106,"source":81,"evidence":107},"Plain-text .env files and shell already solve this",[108,112],{"id":109,"by":110,"text":111},"40761607","eikenberry","> Env variables should be a solved problem I think the main problem is that this problem is 99% solved by the shell alone. Shells are very versatile and it is quite easy to setup…",{"id":113,"by":114,"text":115},"40760540","Kwpolska","The docs don’t make it very obvious how are the environment variables actually applied. And I think .env files are much easier to manage and share. `envelope check` could be…",{"value":117,"source":81,"evidence":118},"Custom format means tools like dotenv cannot read it",[119],{"id":120,"by":114,"text":121},"40766731","> Actually, they are not applied. This is a tool that helps you manage them, you can see it as a replacement of .env files. The point of .env files is for tools (shells or…",{"value":123,"source":81,"evidence":124},"direnv or symlinked .env files do the job",[125,129],{"id":126,"by":127,"text":128},"40762758","globular-toast","Seems neat, but direnv can do more despite this claiming to be \"modern\".",{"id":130,"by":131,"text":132},"40766614","another-dave","But running: ``` ln -sf .env.dev .env ``` doesn't seem any worse than running: ``` envelope export dev ? ```",[134,138,145],{"value":135,"source":81,"evidence":136},"Arch package",[137],{"id":91,"by":92,"text":93},{"value":139,"source":81,"evidence":140},"Encryption at rest",[141],{"id":142,"by":143,"text":144},"40772233","nodesocket","Any plans to support encryption at rest?",{"value":146,"source":81,"evidence":147},"Plain text DSL instead of SQLite",[148],{"id":84,"by":85,"text":86},[150,156,160],{"value":151,"source":81,"evidence":152},"How to install the tool",[153],{"id":154,"by":92,"text":155},"40758777","how do I install the damn thing??",{"value":157,"source":81,"evidence":158},"How the variables are actually applied",[159],{"id":113,"by":114,"text":115},{"value":161,"source":81,"evidence":162},"What the threat model is for shell history leaks",[163],{"id":164,"by":165,"text":166},"40776999","bomewish","What’s the threat model? If an attacker has access to your shell history then don’t they then already have access to basically everything else?",[168,172,179,186],{"value":169,"source":81,"evidence":170},"direnv",[171],{"id":126,"by":127,"text":128},{"value":173,"source":81,"evidence":174},"mise-en-place",[175],{"id":176,"by":177,"text":178},"40759901","bloopernova","Interesting! Have you looked at mise-en-place at all? It's written in rust too, and might have some cool ideas to use: https:\u002F\u002Fmise.jdx.dev\u002F",{"value":180,"source":81,"evidence":181},"envkey",[182],{"id":183,"by":184,"text":185},"40760677","SeriousM","envkey.com is also distributing environment variables",{"value":187,"source":81,"evidence":188},"Shell scripts sourcing variable files",[189],{"id":190,"by":191,"text":192},"40762218","skeledrew","Hmm I fairly recently started saving variables which tend to be shared among multiple projects in a central location, grouped in sh files and sourcing as needed. This gives me an…",{"comments":194,"answered":41,"key":195},8,[196,199,202],{"id":197,"text":198},"40760221","Mine was a bad example :) the command also lets you input stuff from stdin for that very case",{"id":200,"text":201},"40762339","> how do you version control SQLite in git? Interesting article just about that [0] [0]: https:\u002F\u002Fgarrit.xyz\u002Fposts\u002F2023-11-01-tracking-sqlite-database-changes-in-git",{"id":203,"text":204},"40762297","> The docs don’t make it very obvious how are the environment variables actually applied. Actually, they are not applied. This is a tool that helps you manage them, you can see…",{"commenters":206,"max_depth":207,"maker_replies":194,"first_comment_mins":208,"lifespan_hours":209},29,6,11,57,[211,213,215,217,219,221,223,227,230,232,234,236,237,240,242,246,249,251,255,258,262,266,268,271,274,277,280,282,284,288,291,293,295,297,298,299,301,304,305,307,309,314,316,317,321,323,325,327,330,331,334,335,337,340],[102,33,40,212,103,33],"project\u002Fcritical\u002Fprivacy",[197,33,33,214,11,40],"maker\u002Fneutral\u002Fprivacy",[164,33,33,216,165,33],"commenter\u002Fneutral\u002Fprivacy",[218,33,33,216,103,33],"40781196",[176,40,31,220,177,33],"project\u002Fneutral\u002Fidea",[84,38,45,222,85,33],"project\u002Fpositive\u002Fidea",[224,38,31,225,226,33],"40759902","project\u002Fneutral\u002Fdesign","gtirloni",[228,38,33,229,191,33],"40762143","commenter\u002Fcritical\u002Fprivacy",[231,38,33,216,226,33],"40767360",[233,38,33,229,191,33],"40767868",[235,38,33,216,226,33],"40768851",[200,38,33,225,11,40],[238,38,33,239,177,33],"40759944","other\u002Fneutral\u002Fnone",[241,38,33,239,85,33],"40762795",[243,38,40,244,245,33],"40760332","project\u002Fcritical\u002Fdesign","cbarrick",[247,38,33,248,85,33],"40762800","commenter\u002Fneutral\u002Fdesign",[109,38,40,250,110,33],"project\u002Fcritical\u002Fidea",[252,31,31,253,254,33],"40760247","project\u002Fneutral\u002Fnone","tomwphillips",[256,31,33,239,257,33],"40760337","RadiozRadioz",[259,31,40,260,261,33],"40760667","project\u002Fcritical\u002Fnone","toastercat",[263,31,33,264,265,33],"40761036","commenter\u002Fneutral\u002Fnone","looperhacks",[267,31,33,264,261,33],"40763199",[269,31,33,264,270,33],"40767751","superb_dev",[272,31,33,239,273,33],"40761158","bityard",[275,31,33,239,276,33],"40770546","whateveracct",[278,31,31,253,279,33],"40761616","peter_l_downs",[281,31,40,260,191,33],"40762116",[283,31,40,260,254,33],"40765132",[285,31,45,286,287,33],"40771954","project\u002Fpositive\u002Fnone","Aeolun",[289,31,31,253,290,33],"40761712","rpigab",[292,31,33,239,287,33],"40771956",[113,41,40,294,114,33],"project\u002Fcritical\u002Fdocs",[203,41,33,296,11,40],"maker\u002Fneutral\u002Fnone",[120,41,40,244,114,33],[126,45,40,250,127,33],[300,207,31,220,131,33],"40761698",[302,207,33,303,11,40],"40762247","maker\u002Fneutral\u002Fidea",[130,207,40,250,131,33],[306,207,33,264,287,33],"40771966",[308,207,40,250,131,33],"40773544",[310,311,40,312,313,33],"40761422",7,"maker\u002Fcritical\u002Fprivacy","stephenr",[315,311,33,296,11,40],"40762330",[190,194,31,220,191,33],[318,319,31,253,320,33],"40763627",9,"applgo443",[183,322,33,239,184,33],10,[142,208,31,324,143,33],"project\u002Fneutral\u002Fprivacy",[154,32,31,326,92,33],"project\u002Fneutral\u002Fdocs",[328,32,33,329,11,40],"40758787","maker\u002Fneutral\u002Fdocs",[91,32,31,253,92,33],[332,32,45,286,333,33],"40760543","i4k",[95,32,33,296,11,40],[336,32,31,253,92,33],"40772303",[338,34,40,244,339,33],"40760812","twerkmonsta",[72,34,33,341,11,40],"maker\u002Fneutral\u002Fdesign",[],[344,349,354,358,362,367],{"id":345,"name":346,"points":347,"category":348},"40740021","rahulilango.com",1054,"learning_science",{"id":350,"name":351,"points":352,"category":353},"40789672","flipdisc",455,"creative",{"id":355,"name":356,"points":357,"category":20},"40757951","Web Check",411,{"id":359,"name":360,"points":361,"category":20},"40789353","From dotenv to dotenvx",354,{"id":363,"name":364,"points":365,"category":366},"40802557","alpha.reconquer.online",340,"games",{"id":368,"name":369,"points":370,"category":371},"40805010","Cerebrium voice agent (fastvoiceagent)",315,"ai",false,"v2",{"id":375,"name":5,"line":6,"ai":372,"cat":20,"year":13,"points":14,"comments":15,"rec":28,"s":376,"top":18,"kw":377,"maker":11,"domain":10,"tier":19,"attempts":33,"strip":378,"url":9,"mix":379,"praise":80,"objection":99,"sub":21},40758703,-0.28,[24,25,22,26,27],"1003530000011310000115310130111330303531",[31,32,33,34],1794036656662]