{"id":47971182,"url":"https://github.com/aurc/plist","last_synced_at":"2026-04-04T10:45:03.733Z","repository":{"id":45629945,"uuid":"433994892","full_name":"aurc/plist","owner":"aurc","description":"The missing CLI plist converter","archived":false,"fork":false,"pushed_at":"2021-12-06T00:07:36.000Z","size":519,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-04T10:45:01.711Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aurc.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-12-01T21:45:25.000Z","updated_at":"2026-03-19T05:28:44.000Z","dependencies_parsed_at":"2022-09-10T21:01:09.165Z","dependency_job_id":null,"html_url":"https://github.com/aurc/plist","commit_stats":null,"previous_names":[],"tags_count":27,"template":false,"template_full_name":null,"purl":"pkg:github/aurc/plist","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aurc%2Fplist","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aurc%2Fplist/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aurc%2Fplist/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aurc%2Fplist/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aurc","download_url":"https://codeload.github.com/aurc/plist/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aurc%2Fplist/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31397055,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-04T10:45:03.009Z","updated_at":"2026-04-04T10:45:03.719Z","avatar_url":"https://github.com/aurc.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# plist\n\n[![GoDoc](https://godoc.org/github.com/aurc/plist?status.svg)](https://godoc.org/github.com/aurc/plist)\n![example workflow](https://github.com/aurc/plist/actions/workflows/go.yml/badge.svg)\n[![codecov](https://codecov.io/gh/aurc/plist/branch/main/graph/badge.svg?token=NZKNTEJ5YC)](https://codecov.io/gh/aurc/plist)\n[![GitHub license](https://img.shields.io/github/license/aurc/plist)](https://github.com/aurc/plist/blob/main/LICENSE)\n\n\nConvert Apple's `plist` file format to `JSON` or `YAML` (natural \u0026 high fidelity modes) effortlessly.\nOften complex bundles and other files are very hard to read or seamlessly \nport to other applications. \n\n**This Package Provides:**\n- A **CLI** tool for reading and converting PLIST that can be fully intgrated\n  with `shell` scripting.\n- A **golang module** that can be imported directly into golang projects with\n  an easy to use API.\n- A **native bundle** *(coming soon)* that can be imported to any C-compatible\n  applications (e.g. Swift, C, C++, Python, etc).\n\n## Installation\n\n### Homebrew For the Inpatient\n\nConsider using homebrew to install the utility from there:\n````\nbrew install aurc/tap/plist\n````\nMore information here: [plist homebrew tap](https://github.com/aurc/homebrew-tap)\n\n### Golang\n\n````bash\n# As CLI Tool\ngo install github.com/aurc/plist@latest\n# Then (assumung $GOPATH/bin set in the path)\nplist --help\n````\nOR\n````bash\n# For working only with parser lib on your go code\ngo get github.com/aurc/plist/pkg/plistparser\n# For entire package with CLI tool on your local (more below)\ngo get github.com/aurc/plist\n````\n\n## Basic Usage\n\n### CLI Tool\n\nTo get started:\n````\ngo install github.com/aurc/plist@latest\n````\n\nAssuming your `$GOPATH/bin` is in your path, then:\n\n````\nplist -h\n````\nOutput:\n````\nThis tool converts Apple's Property List (.plist) inputs into several useful\nformats, such as JSON and YAML.\n\nIt supports both a file name as input and a piped ('|') input which might be useful\non more involved shell scripts.\n\nFor example:\n    plist json -i myfile.plist\n    cat myfile.plist | plist json\n\nFor individual commands instructions run:\n        plist [command] -h\n        plist json -h\n\nUsage:\n  plist [command]\n\nAvailable Commands:\n  completion  generate the autocompletion script for the specified shell\n  help        Help about any command\n  json        Converts plist into JSON\n  yaml        Converts plist into YAML\n\nFlags:\n  -h, --help            help for plist\n  -x, --high-fidelity   Specifies whether the output should be a one-to-one translation of the plist. \n                        Set to true, it's one-to-one. The default is false as it produces a more readable file.\n  -i, --input string    Specifies a input file, e.g. --input myFile.plist\n\nUse \"plist [command] --help\" for more information about a command.\n\n````\n\nGiven the input\n\n````xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003c!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\"\u003e\n\u003cplist version=\"1.0\"\u003e\n    \u003cdict\u003e\n        \u003ckey\u003eidle_wakeups\u003c/key\u003e\u003cinteger\u003e103\u003c/integer\u003e\n        \u003ckey\u003eidle_wakeups_per_s\u003c/key\u003e\u003creal\u003e20.533\u003c/real\u003e\n        \u003ckey\u003etimer_wakeups\u003c/key\u003e\n        \u003carray\u003e\n            \u003cdict\u003e\n                \u003ckey\u003einterval_ns\u003c/key\u003e\u003cinteger\u003e2000000\u003c/integer\u003e\n                \u003ckey\u003ewakeups\u003c/key\u003e\u003cinteger\u003e270\u003c/integer\u003e\n                \u003ckey\u003ewakeups_per_s\u003c/key\u003e\u003creal\u003e53.8244\u003c/real\u003e\n            \u003c/dict\u003e\n            \u003cdict\u003e\n                \u003ckey\u003einterval_ns\u003c/key\u003e\u003cinteger\u003e1500000\u003c/integer\u003e\n                \u003ckey\u003ewakeups\u003c/key\u003e\u003cinteger\u003e170\u003c/integer\u003e\n                \u003ckey\u003ewakeups_per_s\u003c/key\u003e\u003creal\u003e22.44\u003c/real\u003e\n            \u003c/dict\u003e\n        \u003c/array\u003e\n    \u003c/dict\u003e\n\u003c/plist\u003e\n````\n#### Output as **JSON (Natural conversion)**\n````\nplist json -i docs/demo/demo.plist -p true\n````\nOR\n````\ncat docs/demo/demo.plist | plist json -p true\n````\nThe natural conversion will hide the verbosity of datatypes, having types\nto be easily inferred, for example a `\u003creal\u003e1.1\u003c/real\u003e` becomes just `1.1` \nwithout quotes whereas a `\u003cdict\u003e` will look more like a `JSON` objects, with\nthe `key` entries listed as fields.\n````json\n{\n  \"idle_wakeups\": 103,\n  \"idle_wakeups_per_s\": 20.533,\n  \"timer_wakeups\": [\n    {\n      \"interval_ns\": 2000000,\n      \"wakeups\": 270,\n      \"wakeups_per_s\": 53.8244\n    },\n    {\n      \"interval_ns\": 1500000,\n      \"wakeups\": 170,\n      \"wakeups_per_s\": 22.44\n    }\n  ]\n}\n````\n#### Output as **YAML (Natural conversion)**\n````\nplist yaml -i docs/demo/demo.plist\n````\nOR\n````\ncat docs/demo/demo.plist | plist yaml\n````\nGives...\n````yaml\nidle_wakeups: 103\nidle_wakeups_per_s: 20.533\ntimer_wakeups:\n- interval_ns: 2000000\n  wakeups: 270\n  wakeups_per_s: 53.8244\n- interval_ns: 1500000\n  wakeups: 170\n  wakeups_per_s: 22.44\n````\n\n#### Output as **JSON (High fidelity)**\n````\nplist json -i docs/demo/demo.plist -p true -x true\n````\nOR\n````\ncat docs/demo/demo.plist | plist json -p true -x true\n````\nDepending on your application, you might want a full, high fidelity\ntranslation, defining each entry and explicitly exposing the data types. For\nthat, given the same input above, you'll have the following output:\n````json\n{\n  \"type\": \"dict\",\n  \"value\": [\n    {\n      \"k\": \"idle_wakeups\",\n      \"v\": {\n        \"type\": \"integer\",\n        \"value\": \"103\"\n      }\n    },\n    {\n      \"k\": \"idle_wakeups_per_s\",\n      \"v\": {\n        \"type\": \"real\",\n        \"value\": \"20.533\"\n      }\n    },\n    {\n      \"k\": \"timer_wakeups\",\n      \"v\": {\n        \"type\": \"array\",\n        \"value\": [\n          {\n            \"type\": \"dict\",\n            \"value\": [\n              {\n                \"k\": \"interval_ns\",\n                \"v\": {\n                  \"type\": \"integer\",\n                  \"value\": \"2000000\"\n                }\n              },\n              {\n                \"k\": \"wakeups\",\n                \"v\": {\n                  \"type\": \"integer\",\n                  \"value\": \"270\"\n                }\n              },\n              {\n                \"k\": \"wakeups_per_s\",\n                \"v\": {\n                  \"type\": \"real\",\n                  \"value\": \"53.8244\"\n                }\n              }\n            ]\n          },\n          {\n            \"type\": \"dict\",\n            \"value\": [\n              {\n                \"k\": \"interval_ns\",\n                \"v\": {\n                  \"type\": \"integer\",\n                  \"value\": \"1500000\"\n                }\n              },\n              {\n                \"k\": \"wakeups\",\n                \"v\": {\n                  \"type\": \"integer\",\n                  \"value\": \"170\"\n                }\n              },\n              {\n                \"k\": \"wakeups_per_s\",\n                \"v\": {\n                  \"type\": \"real\",\n                  \"value\": \"22.44\"\n                }\n              }\n            ]\n          }\n        ]\n      }\n    }\n  ]\n}\n````\nOutput as **YAML (High fidelity)**\n````\nplist yaml -i docs/demo/demo.plist -x true\n````\nOR\n````\ncat docs/demo/demo.plist | plist yaml -x true\n````\n````yaml\ntype: dict\nvalue:\n- k: idle_wakeups\n  v:\n    type: integer\n    value: \"103\"\n- k: idle_wakeups_per_s\n  v:\n    type: real\n    value: \"20.533\"\n- k: timer_wakeups\n  v:\n    type: array\n    value:\n    - type: dict\n      value:\n      - k: interval_ns\n        v:\n          type: integer\n          value: \"2000000\"\n      - k: wakeups\n        v:\n          type: integer\n          value: \"270\"\n      - k: wakeups_per_s\n        v:\n          type: real\n          value: \"53.8244\"\n    - type: dict\n      value:\n      - k: interval_ns\n        v:\n          type: integer\n          value: \"1500000\"\n      - k: wakeups\n        v:\n          type: integer\n          value: \"170\"\n      - k: wakeups_per_s\n        v:\n          type: real\n          value: \"22.44\"\n\n````\n\n## As a Package \n\n````bash\n$ go get github.com/aurc/plist/pkg/plistparser\n````\n\n````go\npackage main\n\nimport (\n    \"fmt\"\n\t\n    \"github.com/aurc/plist/pkg/plistparser\"\n)\n\nfunc main() {\n  plistFile := `\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n  \u003c!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\"\u003e\n  \u003cplist version=\"1.0\"\u003e\n  \u003carray\u003e\n      \u003cstring\u003eString\u003c/string\u003e\n  \u003c/array\u003e\n  \u003c/plist\u003e`\n\n  out, _ := plistparser.Convert([]byte(plistFile), \u0026plistparser.Config{\n    Target:       plistparser.Json,\n    HighFidelity: false,\n    Beatify:      true,\n  })\n  \n  fmt.Println(string(out))\n}\n````\n\n## License\n\n`plist` is released under the Apache 2.0 license. See [LICENSE](https://github.com/aurc/plist/blob/master/LICENSE)\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faurc%2Fplist","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faurc%2Fplist","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faurc%2Fplist/lists"}