{"id":51027357,"url":"https://github.com/condense9/hark-lang","last_synced_at":"2026-06-21T20:49:10.867Z","repository":{"id":41284046,"uuid":"259907403","full_name":"condense9/hark-lang","owner":"condense9","description":"A serverless virtual machine \u0026 language","archived":false,"fork":false,"pushed_at":"2022-12-08T12:12:25.000Z","size":3651,"stargazers_count":110,"open_issues_count":16,"forks_count":8,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-06-06T09:14:23.646Z","etag":null,"topics":["aws","aws-lambda","concurrency","infrastructure","lambda","orchestration","pipeline","python","serverless"],"latest_commit_sha":null,"homepage":"","language":"Python","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/condense9.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-04-29T11:31:58.000Z","updated_at":"2025-11-08T14:58:14.000Z","dependencies_parsed_at":"2023-01-25T13:01:05.910Z","dependency_job_id":null,"html_url":"https://github.com/condense9/hark-lang","commit_stats":null,"previous_names":["condense9/teal-lang"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/condense9/hark-lang","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/condense9%2Fhark-lang","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/condense9%2Fhark-lang/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/condense9%2Fhark-lang/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/condense9%2Fhark-lang/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/condense9","download_url":"https://codeload.github.com/condense9/hark-lang/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/condense9%2Fhark-lang/sbom","scorecard":{"id":302245,"data":{"date":"2025-08-11","repo":{"name":"github.com/condense9/hark-lang","commit":"810924f12fb605ce318a131003c5b06f78150f61"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.5,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 1/18 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/condense9/hark-lang/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/condense9/hark-lang/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:36: update your workflow using https://app.stepsecurity.io/secureworkflow/condense9/hark-lang/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/condense9/hark-lang/ci.yml/master?enable=pin","Warn: containerImage not pinned by hash: integration/stories/getting_started/Dockerfile:1: pin your Docker image by updating python:3.8 to python:3.8@sha256:d411270700143fa2683cc8264d9fa5d3279fd3b6afff62ae81ea2f9d070e390c","Warn: containerImage not pinned by hash: integration/stories/try_fractals/Dockerfile:1: pin your Docker image by updating python:3.8 to python:3.8@sha256:d411270700143fa2683cc8264d9fa5d3279fd3b6afff62ae81ea2f9d070e390c","Warn: pipCommand not pinned by hash: integration/stories/getting_started/Dockerfile:8","Warn: pipCommand not pinned by hash: integration/stories/try_fractals/Dockerfile:8","Warn: pipCommand not pinned by hash: scripts/make_lambda_dist.sh:32","Warn: pipCommand not pinned by hash: scripts/make_layer.sh:25","Warn: pipCommand not pinned by hash: .github/workflows/ci.yml:23","Warn: pipCommand not pinned by hash: .github/workflows/ci.yml:24","Warn: pipCommand not pinned by hash: .github/workflows/ci.yml:45","Warn: pipCommand not pinned by hash: .github/workflows/ci.yml:46","Warn: pipCommand not pinned by hash: .github/workflows/ci.yml:48","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 containerImage dependencies pinned","Info:   0 out of   9 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 13 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"17 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2022-42986 / GHSA-43fp-rhv2-5gv8","Warn: Project is vulnerable to: PYSEC-2023-135 / GHSA-xqr8-7jwr-rhp7","Warn: Project is vulnerable to: PYSEC-2024-60 / GHSA-jjg7-2v4v-x38h","Warn: Project is vulnerable to: PYSEC-2020-92 / GHSA-hj5v-574p-mj7c","Warn: Project is vulnerable to: PYSEC-2022-42969","Warn: Project is vulnerable to: PYSEC-2021-140 / GHSA-9w8r-397f-prfh","Warn: Project is vulnerable to: PYSEC-2023-117 / GHSA-mrwq-x4v8-fh7p","Warn: Project is vulnerable to: PYSEC-2021-141 / GHSA-pq64-v7f5-gqh8","Warn: Project is vulnerable to: PYSEC-2021-142 / GHSA-8q59-q68h-6hv4","Warn: Project is vulnerable to: GHSA-9hjg-9r4m-mvj7","Warn: Project is vulnerable to: GHSA-9wx4-h78v-vm56","Warn: Project is vulnerable to: PYSEC-2023-74 / GHSA-j8r2-6x86-q33q","Warn: Project is vulnerable to: GHSA-34jh-p97f-mpxf","Warn: Project is vulnerable to: PYSEC-2023-212 / GHSA-g4mx-q9vg-27p4","Warn: Project is vulnerable to: GHSA-pq67-6m6q-mj2v","Warn: Project is vulnerable to: PYSEC-2021-108 / GHSA-q2q7-5pp4-w6pg","Warn: Project is vulnerable to: PYSEC-2023-192 / GHSA-v845-jxx5-vc9f"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-17T20:58:54.683Z","repository_id":41284046,"created_at":"2025-08-17T20:58:54.684Z","updated_at":"2025-08-17T20:58:54.684Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34625624,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-21T02:00:05.568Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["aws","aws-lambda","concurrency","infrastructure","lambda","orchestration","pipeline","python","serverless"],"created_at":"2026-06-21T20:49:10.051Z","updated_at":"2026-06-21T20:49:10.862Z","avatar_url":"https://github.com/condense9.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# The Hark Programming Language\n\n![Tests](https://github.com/condense9/hark-lang/workflows/Build/badge.svg?branch=master) [![PyPI](https://badge.fury.io/py/hark-lang.svg)](https://pypi.org/project/hark-lang) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) [![Python 3.8](https://img.shields.io/badge/python-3.8-blue.svg)](https://www.python.org/downloads/release/python-380)\n\nHark lets you quickly build serverless data pipelines without managing any\ninfrastructure.\n\nHark is for you if:\n- You use AWS.\n- You use Python for **data engineering** or business process pipelines.\n- You don't want to manage a task platform (Airflow, Celery, etc).\n\nKey features:\n- First-class local testing (there's a local Hark runtime).\n- Concurrency primitives for multi-threaded pipelines.\n- Zero infrastructure management and minimal maintenance.\n\n[Quick start: Build an AWS Lambda pipeline in 2 minutes](#up-and-running-in-2-minutes).\n\n**Comparisons**:\n- Like Apache Airflow, but without infrastructure to manage.\n- Like AWS Step Functions but cloud-portable and locally testable.\n- Like Serverless Framework, but handles runtime glue logic in addition to\n  deployment.\n\n*Status*: Hark works well for small workflows: 5-10 Lambda invocations. Larger\nworkflows may cause problems, and there is a known issue caused by DynamoDB\nrestrictions ([#12](https://github.com/condense9/hark-lang/issues/12)).\n\n\u003c!-- Watch an introduction video. --\u003e\n\n[Documentation](https://guide.condense9.com).\n\nHark was Presented at PyCon Africa 2020. [Watch the presentation][pycon], or\n[check out the demos][demos].\n\n[demos]: https://github.com/condense9/hark-demos\n[pycon]: https://www.youtube.com/watch?v=I8VGfOBzmF4\n\n\n## Contributing\n\nHark is growing rapidly, and contributions are [welcome](CONTRIBUTING.md).\n\n\n## Is Hark for me?\n\nHark *is* for you if:\n- Your data is in AWS\n- You use Python for processing data, or writing business process workflows.\n- You don't want to deploy and manage a task platform (Airflow, Celery, etc).\n\n**Data in**: You can invoke Hark like any Lambda function (AWS cli, S3 trigger,\nAPI gateway, etc).\n\n**Data out**: Use the Python libraries you already have for database access.\nHark just connects them together.\n\n**Development**: Hark runs locally, so you can thoroughly test Hark programs\nbefore deployment (using minio and localstack for any additional infrastructure\nthat your code uses.\n\n**Operating**: Hark enables contextual cross-thread logging and stacktraces out\nof the box, since the entire application is described in one place.\n\n| Hark is like...                 | But...                                                                                                        |\n|-------------------------------------|---------------------------------------------------------------------------------------------------------------|\n| AWS Step Functions                  | Hark programs aren't bound to AWS and don't use Step Functions under the hood (just plain Lambda + DynamoDB). |\n| Orchestrators (Apache Airflow, etc) | You don't have to manage infrastructure, or think in terms of DAGs, and you can test everything locally.      |\n| Task runners (Celery, etc)          | You don't have to manage infrastructure.                                                                      |\n| Azure Durable Functions             | While powerful, Durable Functions (subjectively) feel complex - their behaviour isn't always obvious.         |\n\n\n[Read more...](https://guide.condense9.com/why.html)\n\n\n## The 2 minute pipeline\n\nAll you need:\n- An AWS account, and [AWS CLI](https://github.com/aws/aws-cli#getting-started)\n  configured.\n- A Python 3.8 virtual environment\n\nHark is built with Python, and distributed as a Python package. To install it,\nrun in a new virtualenv:\n\n```shell\npip install hark-lang\n```\n\nThis gives you the `hark` executable. Try `hark -h`.\n\nInitialise the project with a few template files:\n\n```shell\nhark init\n```\n\nCopy the following snippet into `service.hk`:\n\n```javascript\n// Import the processing functions defined in Python\nimport(process_video_step1, src.video, 2);\nimport(process_video_step2, src.video, 3);\nimport(process_video_step3, src.video, 3);\nimport(process_video_final_step, src.video, 3);\n\n// Process a named file\nfn process_csv(key) {\n  a = async process_video_step1(bucket, key);\n  b = async process_video_step2(bucket, key, await a);\n  c = async process_video_step3(bucket, key, await b);\n  process_video_final_step(bucket, key, await c);\n}\n```\n\nRun it locally to test:\n\n```shell\nhark service.hk -f on_upload filename.csv\n```\n\nAnd deploy the service to your AWS account (requires AWS credentials and\n`AWS_DEFAULT_REGION` to be defined):\n\n```shell\nhark deploy\n```\n\n[Read more](https://guide.condense9.com/aws.html) about what this actually\ncreates.\n\nFinally, invoke it in AWS (`-f main` is optional, as before):\n\n```shell\nhark invoke -f main your_bucket filename.csv\n```\n\nRead more...\n- [about the language](https://guide.condense9.com/language/index.html)\n- [about the development process](https://guide.condense9.com/development/index.html)\n- [about configuring Hark](https://guide.condense9.com/configuration.html)\n\n\n## Language Features\n\n### Concurrency \u0026 Synchronisation\n\nThis is useful when a set computations are related, and must be kept together.\n\n```javascript\n/**\n * Return f(x) + g(x), computing f(x) and g(x) in parallel in two separate\n * threads (Lambda invocations in AWS).\n */\nfn compute(x) {\n  a = async f(x);     // Start computing f(x) in a new thread\n  b = async g(x);     // Likewise with g(x)\n  await a + await b;  // Stop this thread, and resume when {a, b} are ready\n}\n```\n\n*Traditional approach*: Manually store intermediate results in an external\ndatabase, and build the synchronisation logic into the cloud functions `f` and\n`g`, or use an orchestrator service.\n\n[Read more...](https://guide.condense9.com/language/threads.html)\n\n\n### Trivial Pipelines\n\nUse this approach when each individual function may take several minutes (and\nhence, together would break the 5 minute AWS Lambda limit).\n\n```javascript\n/**\n * Compute f(g(h(x))), using a separate lambda invocation for each\n * function call.\n */\nfn pipeline(x) {\n  a = async h(x);\n  b = async g(await a);\n  f(await b);\n}\n```\n\n*Traditional approach:* This is functionally similar to a \"chain\" of AWS Lambda\nfunctions and SQS queues.\n\n\n### Mapping / reducing\n\nHark functions are first-class, and can be passed around (closures and anonymous\nfunctions are planned, giving Hark object-oriented capabilities).\n\n```javascript\n/**\n * Compute [f(element) for element in x], using a separate lambda invocation for\n * each application of f.\n */\nfn map(f, x, accumulator) {\n  if nullp(x) {\n    accumulator\n  }\n  else {\n    // The Hark compiler has tail-recursion optimisation\n    map(func, rest(x), append(accumulator, async f(first(x))))\n  }\n}\n```\n\nThis could be used like:\n\n```javascript\nfn add2(x) {\n  x + 2\n}\n\nfn main() {\n  futures = map(add2, [1, 2, 3, 4], []);\n  // ...\n}\n```\n\n[Read more...](https://guide.condense9.com/language/functions.html)\n\n\n## Notes about syntax\n\nThe syntax should look familiar, but there are a couple of things to point out.\n\n### No 'return' statement\n\nEvery expression must return a value, so there is no `return` statement. The\nlast expression in a 'block' (expressions between `{` and `}`) is returned\nimplicitly.\n\n```javascript\nfn foo() {\n  \"something\"\n}\n\nfn main() {\n  print(foo())  // -\u003e prints \"something\"\n}\n```\n\n### Semi-colons are required...\n\n... when there is more than one expression in a block.\n\nThis is ok:\n\n```javascript\nfn main() {\n  print(\"done\")\n}\n```\n\nSo is this:\n\n```javascript\nfn main() {\n  print(\"one\");\n  print(\"two\")\n}\n```\n\nAnd this:\n\n```javascript\nfn main() {\n  print(\"one\");\n  print(\"two\");\n}\n```\n\nBut this is not ok:\n\n```javascript\nfn main() {\n  print(\"one\")  // \u003c- missing semicolon!\n  print(\"two\")\n}\n```\n\n\n### 'print' returns the value printed\n\nIn this snippet, \"Hello Worlds!\" is actually printed twice. First in `bar`, then\nin `main`.\n\n```javascript\nfn bar() {\n  print(\"Hello Worlds!\")\n}\n\nfn main() {\n  print(bar())\n}\n```\n\n```shell\n$\u003e hark -q service.hk\nHello Worlds!\nHello Worlds!\n```\n\n### 'if' is an expression, and returns a value\n\nThink about it like this: An `if` expression represents a choice between\n*values*.\n\n```javascript\nv = if something { true_value } else { false_value };\n\n// if 'something' is not true, v is set to null\nv = if something { value };\n```\n\n\n## FAQ\n\u003c!-- NOTE: Taken from guide/src/why.md --\u003e\n\n**Why is this not a library/DSL in Python?**\n\nWhen Hark threads wait on a Future, they stop completely. The Lambda function\nsaves the machine state and then terminates. When the Future resolves, the\nresolving thread restarts any waiting threads by invoking new Lambdas to pick up\nexecution.\n\nTo achieve the same thing in Python, the framework would need to dump the entire\nPython VM state to disk, and then reload it at a later point -- this may be\npossible, but would certainly be non-trivial. An alternative approach would be\nto build a langauge on top of Python that looked similar to Python, but hark\n*wrong* because it was really faking things under the hood.\n\n**How is Hark like Go?**\n\nGoroutines are very lightweight, while Hark `async` functions are pretty heavy --\nthey involve creating a new Lambda (or process, when running locally).\n\nHark's concurrency model is similar to Go's, but channels are not fully\nimplemented so data can only be sent to/from a thread at call/return points.\n\n**Is this an infrastructure-as-code tool?**\n\nNo, Hark does not do general-purpose infrastructure management. There are\nalready great tools to do that ([Terraform](https://www.terraform.io/),\n[Pulumi](https://www.pulumi.com/), [Serverless\nFramework](https://www.serverless.com/), etc).\n\nInstead, Hark reduces the amount of infrastructure you need. Instead of a\ndistinct Lambda function for every piece of application logic, you only need the\ncore Hark interpreter (purely serverless) infrastructure.\n\nHark will happily manage that infrastructure for you (through `hark deploy` and\n`hark destroy`), or you can set it up with your in-house custom system.\n\n\n## Current Limitations and Roadmap\n\nHark is beta quality, which means that it's not thoroughly tested or feature\ncomplete. This is a non-exhaustive list.\n\n### Libraries\n\nOnly one Hark program file is supported, but a module/package system is\n[planned](https://github.com/condense9/hark-lang/issues/9).\n\n### Error Handling\n\nThere's no error handling - if your function fails, you'll have to restart the\nwhole process manually. An exception handling system is\n[planned](https://github.com/condense9/hark-lang/issues/1).\n\n### Typing\n\nFunction inputs and outputs aren't typed. This is a limitation, and will be\nfixed soon, probably using\n[ProtoBufs](https://developers.google.com/protocol-buffers) as the interface\ndefinition language.\n\n### Calling Arbitrary Services\n\nCurrently you can only call Hark or Python functions -- arbitrary microservices\ncan't be called. Before Hark v1.0 is released, this will be possible. You will\nbe able to call a long-running third party service (e.g. an AWS ML service) as a\nnormal Hark function and `await` on the result.\n\n\n---\n\n## About\n\nHark started because we couldn't find any data engineering tools that were\nproductive and *feel* like software engineering. As an industry, we've spent\ndecades growing a wealth of computer science knowledge, but building data\npipelines in $IaC, or manually crafting workflow DAGs with $AutomationTool,\nfeels more like hardware than software.\n\n\n## License\n\nApache License (Version 2.0). See [LICENSE](LICENSE) for details.\n\n---\n\n[![forthebadge](https://forthebadge.com/images/badges/gluten-free.svg)](https://forthebadge.com) [![forthebadge](https://forthebadge.com/images/badges/built-with-love.svg)](https://forthebadge.com) [![forthebadge](https://forthebadge.com/images/badges/check-it-out.svg)](https://forthebadge.com)\n\nThe end. Here's a spaceship. Hacks and glory await.\n\n```\n\n\n                     `. ___\n                    __,' __`.                _..----....____\n        __...--.'``;.   ,.   ;``--..__     .'    ,-._    _.-'\n  _..-''-------'   `'   `'   `'     O ``-''._   (,;') _,'\n,'________________                          \\`-._`-','\n `._              ```````````------...___   '-.._'-:\n    ```--.._      ,.                     ````--...__\\-.\n            `.--. `-`                       ____    |  |`\n              `. `.                       ,'`````.  ;  ;`\n                `._`.        __________   `.      \\'__/`\n                   `-:._____/______/___/____`.     \\  `\n                               |       `._    `.    \\\n                               `._________`-.   `.   `.___\n                                             SSt  `------'`\n```\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcondense9%2Fhark-lang","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcondense9%2Fhark-lang","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcondense9%2Fhark-lang/lists"}