openjournals / joss-reviews

Reviews for the Journal of Open Source Software
Creative Commons Zero v1.0 Universal
725 stars 38 forks source link

[REVIEW]: Jobflow: Computational Workflows Made Simple #5995

Closed editorialbot closed 10 months ago

editorialbot commented 1 year ago

Submitting author: !--author-handle-->@Andrew-S-Rosen<!--end-author-handle-- (Andrew S. Rosen) Repository: https://github.com/materialsproject/jobflow Branch with paper.md (empty if default branch): main Version: v0.1.16 Editor: !--editor-->@arfon<!--end-editor-- Reviewers: @rashatwi, @jherasdo Archive: 10.5281/zenodo.10466868

Status

status

Status badge code:

HTML: <a href="https://joss.theoj.org/papers/fe6c0ab0721b3271728a35e69d02c538"><img src="https://joss.theoj.org/papers/fe6c0ab0721b3271728a35e69d02c538/status.svg"></a>
Markdown: [![status](https://joss.theoj.org/papers/fe6c0ab0721b3271728a35e69d02c538/status.svg)](https://joss.theoj.org/papers/fe6c0ab0721b3271728a35e69d02c538)

Reviewers and authors:

Please avoid lengthy details of difficulties in the review thread. Instead, please create a new issue in the target repository and link to those issues (especially acceptance-blockers) by leaving comments in the review thread below. (For completists: if the target issue tracker is also on GitHub, linking the review thread in the issue or vice versa will create corresponding breadcrumb trails in the link target.)

Reviewer instructions & questions

@rashatwi & @jherasdo, your review will be checklist based. Each of you will have a separate checklist that you should update when carrying out your review. First of all you need to run this command in a separate comment to create the checklist:

@editorialbot generate my checklist

The reviewer guidelines are available here: https://joss.readthedocs.io/en/latest/reviewer_guidelines.html. Any questions/concerns please let @arfon know.

Please start on your review when you are able, and be sure to complete your review in the next six weeks, at the very latest

Checklists

📝 Checklist for @jherasdo

📝 Checklist for @rashatwi

editorialbot commented 1 year ago

Hello humans, I'm @editorialbot, a robot that can help you with some common editorial tasks.

For a list of things I can do to help you, just type:

@editorialbot commands

For example, to regenerate the paper pdf after making changes in the paper's md or bib files, type:

@editorialbot generate pdf
editorialbot commented 1 year ago
Software report:

github.com/AlDanial/cloc v 1.88  T=0.10 s (980.2 files/s, 159490.6 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Python                          49           2517           2711           6311
Markdown                        10            262              0            693
YAML                            13             61              6            355
Jupyter Notebook                 7              0           1993            225
TOML                             1             13              4            155
TeX                              1              0              0            130
reStructuredText                13             95            220            104
CSS                              1              9              3             58
SVG                              1              0              1             16
HTML                             1              0              0              3
JSON                             1              0              0              1
-------------------------------------------------------------------------------
SUM:                            98           2957           4938           8051
-------------------------------------------------------------------------------

gitinspector failed to run statistical information for the repository
editorialbot commented 1 year ago

Wordcount for paper.md is 2361

editorialbot commented 1 year ago
Reference check summary (note 'MISSING' DOIs are suggestions that need verification):

OK DOIs

- 10.5281/zenodo.7720998 is OK
- 10.1063/1.4812323 is OK
- 10.1016/j.commatsci.2015.09.013 is OK
- 10.1038/s41467-021-23339-x is OK
- 10.1002/cpe.3505 is OK
- 10.1109/p3hpc51967.2020.00011 is OK
- 10.1109/works54523.2021.00012 is OK
- 10.5281/zenodo.5903364 is OK

MISSING DOIs

- None

INVALID DOIs

- None
editorialbot commented 1 year ago

:point_right::page_facing_up: Download article proof :page_facing_up: View article proof on GitHub :page_facing_up: :point_left:

arfon commented 1 year ago

@rashatwi, @jherasdo – This is the review thread for the paper. All of our communications will happen here from now on.

Please read the "Reviewer instructions & questions" in the first comment above. Please create your checklist typing:

@editorialbot generate my checklist

As you go over the submission, please check any items that you feel have been satisfied. There are also links to the JOSS reviewer guidelines.

The JOSS review is different from most other journals. Our goal is to work with the authors to help them meet our criteria instead of merely passing judgment on the submission. As such, the reviewers are encouraged to submit issues and pull requests on the software repository. When doing so, please mention https://github.com/openjournals/joss-reviews/issues/5995 so that a link is created to this thread (and I can keep an eye on what is happening). Please also feel free to comment and ask questions on this thread. In my experience, it is better to post comments/questions/suggestions as you come across them instead of waiting until you've reviewed the entire package.

We aim for the review process to be completed within about 4-6 weeks but please make a start well ahead of this as JOSS reviews are by their nature iterative and any early feedback you may be able to provide to the author will be very helpful in meeting this schedule.

jherasdo commented 1 year ago

Review checklist for @jherasdo

Conflict of interest

Code of Conduct

General checks

Functionality

Documentation

Software paper

jherasdo commented 1 year ago

The manuscript “Jobflow: Computational Workflows Made Simple” by Andrew S. Rosen and co-workers present the software application called Jobflow as an open source Python package for writing computational workflows tailored for high-throughput computing applications. This application abstracts a lot of complexities in the field by using a decorator-based approach which is able to transform pythonic functions and classes into more complex workflows. Furthermore, Jobflow also supports dynamic workflows and different ways to store the results both locally and cloud-based databases. Finally, this application can be coupled with FireWorks package to easily manage computational resources in typical HPC cluster architectures.

I have completed my first review of the code and the paper. The software looks very good. The paper is well written with a clear statement of need and state of the field. There are only few things to solve in the manuscript:

I encourage the authors to revise the references since there are some issues:

Andrew-S-Rosen commented 1 year ago

@editorialbot generate pdf

editorialbot commented 1 year ago

:point_right::page_facing_up: Download article proof :page_facing_up: View article proof on GitHub :page_facing_up: :point_left:

Andrew-S-Rosen commented 1 year ago

CC: @utf

@jherasdo: Thank you for your positive feedback and, of course, for your review! We greatly appreciate the time you spent on this. I'll briefly address your comments, but please let us know if you have any further requests or comments!

There is a minor typo in line 80: A missing comma after e.g. (for consistency with the other “e.g.”, I would add it).

Thanks! Fixed in the updated paper.

It is a bit weird the use of “& others” since there is more than enough space to include all authors in each reference.

Thanks for catching this. It is now fixed. In case you're curious, this was from Google Scholar's bibtex exporter, which automatically truncates author lists with "& others." Very annoying. I must have missed it.

Any remaining truncation you see (with "...") is from the automatically applied JOSS style.

For the Covalent software package reference, the authors provide the zenodo link but didn’t include any author or the format of citation suggested in the zenodo link.

Thanks! This is now fixed (and I did the same for the quacc package, which also had a Zenodo DOI).

For the reference “Existing workflow systems. (2023).” The README file from the github has a different way of citing this work. Seems like should be cited through the following work https://dl.acm.org/doi/10.1145/3486897

Thanks. The reference you are referring to is slightly different. The list of existing workflow systems happens to be hosted on the CWL (common workflow language) repository but is a distinct entity from CWL itself. The reference you shared is specifically for CWL, which is a bit outside the scope of this manuscript. We used the recommended citation, which includes the apache URL.

jherasdo commented 1 year ago

Thank you so much for your quick answer @Andrew-S-Rosen! I have updated my checklist accordingly!

I actually have a couple of questions regarding Jobflow:

Since I'm more used to interact with the "original" atomate package.

And also, since sometimes is quite difficult to deploy and maintain a MongoDB in HPC clusters:

Thanks again!

Andrew-S-Rosen commented 1 year ago

@jherasdo: Thank you! Happy to answer any questions you have.

I'm curious to know if the Jobflow/atomate2 combination is going to be able to take complex data as input and to serialize it as in atomate and what part of this is abstracted inside Joblow.

Any inputs/outputs that you are familiar with using from Atomate1 should also be able to be used by Jobflow and thereby Atomate2. The relevant section of the Jobflow documentation is the callout on this page stating "jobflow encodes job outputs as json using the MontyEncoder feature of the monty package. This means that additional datatypes such as datetime objects, enums, and MSONable classes can also be serialized." Happy to elaborate further if there are additional questions there!

Are you "The Jobflow Team" thinking on also implementing the possibility to use PostgresSQL as "local" database, similar to other workflow managers like AiiDa?

This is a good question. Jobflow uses maggma for the database handling and, therefore, supports all of the data stores in maggma. This includes options like MontyStore (which I just realized was not listed on that page; I have opened a PR), which enables a mongo-like interface to a local database like sqlite. Any data stores added to maggma will automatically be fully compatible with Jobflow (and thereby Atomate2). There have been active discussions about adding a variety of other local data stores to maggma, although I don't believe PostgresSQL was on the list at the moment.

utf commented 1 year ago

In terms of Postgres, one project I've found is ferretdb.io which provides a mongodb interface to a Postgres database. It should be possible to use that directly with the current maggma stores.

jherasdo commented 1 year ago

Thank you so much @Andrew-S-Rosen and @utf for your answers and congrats for the nice work!

I will definitely take a look on the DB possibilities you mentioned. And also thanks for considering Postgres as a future addition for maggma and Joblow.

@arfon from my side everything looks good and my questions/comments were solved accordingly.

Please let me know if you need anything else from my side.

arfon commented 1 year ago

Thanks so much @jherasdo! @rashatwi – how are you getting along with your review? Do you think you might be able to complete it in the next week or so?

Andrew-S-Rosen commented 12 months ago

@arfon: Thanks for your help thus far. We haven't heard from the 2nd reviewer yet. Perhaps worth another ping? We are happy to address any comments they may have and are looking forward to their review.

rashatwi commented 11 months ago

@arfon: I'm sorry for my late reply. I should be able to complete the review by Friday, December 8. Thanks for your patience.

rashatwi commented 11 months ago

Review checklist for @rashatwi

Conflict of interest

Code of Conduct

General checks

Functionality

Documentation

Software paper

rashatwi commented 11 months ago

@editorialbot generate pdf

editorialbot commented 11 months ago

:point_right::page_facing_up: Download article proof :page_facing_up: View article proof on GitHub :page_facing_up: :point_left:

rashatwi commented 11 months ago

Overview

I finished my review of the paper and the code. The Jobflow package is well suited for JOSS and is of significant interest to the computational science community. I was really impressed by how intuitive it seems to construct Flows using Jobflow. Some of the features I really like are how the output of each job is stored, how the dependency between Jobs is automatically determined based on inputs, and how you can simply register the output in the Flow object.

As a user of the FireWorks package, I really appreciate the flexibility that Jobflow offers in terms of choosing the workflow manager and database as well as the short overhead time it seems to take to get started writing Flows. I found that some of the design concepts/features are common with FireWorks, e.g., dynamic workflows, detours, and ability to modify parameters of a Job after it has been defined, which are all desirable if someone is used to FireWorks and doesn’t want to lose access to these features when making the transition.

I don’t have comments related to the paper, as it is very clear and the examples provided are simple and straight to the point. I also checked off most of the items on the checklist, but I have some minor comments related to the documentation.

Documentation

  1. The link in this part of the documentation (Defining jobs in jobflow) is not working. Perhaps you were trying to refer to this section instead:

Jobs also have an index. This tracks the number of times the job has been “replaced” (replacing is covered in detail in the [Dynamic and nested Flows tutorial].

  1. Introduction to Jobflow tutorial: After executing flow = Flow( jobs=[time_github, time_google, time_nyt, sum_times], output=sum_times.output ) I got the following error:

ValueError: Job time_website (cba5389e-8837-4bf1-aee1-87b650192bc1) already belongs to another flow.

  1. I found the tutorials provided very basic and some are repetitive, which might be intentional. However, I would appreciate the addition of a bit more advanced examples, e.g., there is not much about setting a custom store other than MemoryStore. The docstrings provided are a very good starting point, but I’m not sure if I’m missing any additional information out there about the custom stores.

  2. One of the main features of Jobflow is being independent of the workflow manager and you already have an adapter/support for FireWorks. I was wondering if you are planning to add additional adapters, and if so, which ones? If not and if this is a task left to the user to create their own adapters, it would be nice to have an example/guide on the website on how to get started.

General Questions

Aside from the review, I have the following questions:

  1. Is there support in the Job output for a wider range of datatypes, not only limited to Monty serializable datatypes?

  2. Having rewritten atomate2 based on atomate, how difficult was the transition from FireWorks to Jobflow for defining the flows, i.e., what was the overhead time for modifying/building upon existing workflows that utilize the FireWorks structure to the use Jobflow instead. I understand that this is a very subjective question, but any comment about that would be really appreciated. I would imagine there are lots of people who have been using the FireWorks package for defining workflows and might be interested in making this transition as well.

Andrew-S-Rosen commented 11 months ago

@rashatwi (CC @arfon):

Thank you very much for your very detailed review! We are glad to hear that you have found Jobflow both easy to use and potentially valuable in your own future research. We have addressed your points below --- please let us know if any further clarification is needed, especially as it relates to the remaining "example usage" tickbox.

The link in this part of the documentation (Defining jobs in jobflow) is not working. Perhaps you were trying to refer to this section instead:

This has now been addressed in PR 503. We also added an automatic link-checker to ensure that such an issue doesn't happen again.

Introduction to Jobflow tutorial: After executing flow = Flow( jobs=[time_github, time_google, time_nyt, sum_times], output=sum_times.output )...

Thank you for your report. This was an artifact of running the same cell again in a Jupyter Notebook. PR 505 provides a bit of guidance to ensure that this doesn't happen to other users going through the tutorial.

I found the tutorials provided very basic and some are repetitive, which might be intentional. However, I would appreciate the addition of a bit more advanced examples, e.g., there is not much about setting a custom store other than MemoryStore. The docstrings provided are a very good starting point, but I’m not sure if I’m missing any additional information out there about the custom stores.

Indeed, we strived to keep the Jobflow documentation quite accessible and domain-agnostic, with ample detail provided in the API.

The information about more "advanced" stores is admittedly scattered across a few repositories. We have streamlined things in the Jobflow documentation to help users like yourself. This has now been addressed in PR 506, and you can see it in the documentation here.

One of the main features of Jobflow is being independent of the workflow manager and you already have an adapter/support for FireWorks. I was wondering if you are planning to add additional adapters, and if so, which ones? If not and if this is a task left to the user to create their own adapters, it would be nice to have an example/guide on the website on how to get started.

This is a good question. Recently, several of the co-authors on this work have developed a custom workflow manager built around Jobflow called jobflow-remote, which we anticipate will be made public in the near future. Additionally, PR 182 contains a work-in-progress adapter for the Myqueue workflow manager. The existing FireWorks adapter, in addition to the aforementioned example, should hopefully provide some guidance on what is needed to create a custom adapter. Since each workflow manager operates differently, it is difficult to provide a uniform set of guidelines, but starting from the FireWorks example should get the user most of the way there.

Is there support in the Job output for a wider range of datatypes, not only limited to Monty serializable datatypes?

Due to the way in which Jobflow is written, all objects must be (de)serializable by Monty. We note that this includes MSONable objects as well as virtually all Python primitives (e.g. lists, dictionaries, strings, floats, etc.). In practice, any object can be made MSONable, such as by adding a custom .as_dict() or .to_dict() property to define a custom routine on how to (de)serialize the object.

Having rewritten atomate2 based on atomate, how difficult was the transition from FireWorks to Jobflow for defining the flows, i.e., what was the overhead time for modifying/building upon existing workflows that utilize the FireWorks structure to the use Jobflow instead. I understand that this is a very subjective question, but any comment about that would be really appreciated. I would imagine there are lots of people who have been using the FireWorks package for defining workflows and might be interested in making this transition as well.

First, I'll answer the question independent of atomate2. In general, we anticipate that the transition from a FireWorks-based library to one centered around Jobflow should be relatively straightforward. The use of the simple @job decorator makes it very easy to turn a given compute function into a discrete unit of work, and this is much more natural for developers to think about than coupling the code to FireWorks directly. There are certainly some learning curves, e.g. to understand how to handle the Response (dynamic job) object, but this is expected.

For your specific question about atomate-->atomate2, however, the story is a bit different. That's because atomate1 is a very large, complex package and atomate2 was designed to address this by introducing a variety of new concepts that are built around Jobflow but are not specific to Jobflow itself. Porting workflows from atomate1 to atomate2 was not a simple translation process as a result --- it largely is a conceptual rewrite. For this reason, the initial time commitment has been high, although we believe the long-term payoff is worth it since the workflows are much more streamlined, more maintainable, and easier to test. If you're solely interested in taking an existing package and swapping out the workflow bits to be Jobflow-centric, that process should be significantly more straightforward to carry out.

rashatwi commented 11 months ago

@Andrew-S-Rosen (CC: @arfon): Thank you and the team for addressing my comments and answering my questions. All my concerns have been addressed now and I checked all the boxes above. I look forward to using Jobflow in the future and thank you for the opportunity to review this work. It gave me the chance to explore Jobflow, something I wanted to do before.

Andrew-S-Rosen commented 11 months ago

Thank you very much, @rashatwi!

@arfon: Please let us know if anything else is needed at this time, and thank you for coordinating.

Andrew-S-Rosen commented 11 months ago

@editorialbot generate pdf

editorialbot commented 11 months ago

:point_right::page_facing_up: Download article proof :page_facing_up: View article proof on GitHub :page_facing_up: :point_left:

Andrew-S-Rosen commented 10 months ago

@arfon: Just wanted to check in. Everything seems good to go here based on the reviewers' comments.

arfon commented 10 months ago

@Andrew-S-Rosen – looks like we're very close to being done here. I will circle back here next week, but in the meantime, please give your own paper a final read to check for any potential typos etc.

After that, could you make a new release of this software that includes the changes that have resulted from this review. Then, please make an archive of the software in Zenodo/figshare/other service and update this thread with the DOI of the archive? For the Zenodo/figshare archive, please make sure that:

utf commented 10 months ago

Thanks @arfon. I've released a new version of jobflow (v0.1.16) on PyPI and GitHub and archived it on Zenodo. The DOI for zenodo is 10.5281/zenodo.10466868.

arfon commented 10 months ago

@editorialbot set v0.1.16 as version

editorialbot commented 10 months ago

Done! version is now v0.1.16

arfon commented 10 months ago

@editorialbot set 10.5281/zenodo.10466868 as archive

editorialbot commented 10 months ago

Done! archive is now 10.5281/zenodo.10466868

arfon commented 10 months ago

@editorialbot recommend-accept

editorialbot commented 10 months ago
Attempting dry run of processing paper acceptance...
editorialbot commented 10 months ago
Reference check summary (note 'MISSING' DOIs are suggestions that need verification):

OK DOIs

- 10.5281/zenodo.7720998 is OK
- 10.1063/1.4812323 is OK
- 10.1016/j.commatsci.2015.09.013 is OK
- 10.1038/s41467-021-23339-x is OK
- 10.1002/cpe.3505 is OK
- 10.1109/p3hpc51967.2020.00011 is OK
- 10.1109/works54523.2021.00012 is OK
- 10.5281/zenodo.5903364 is OK

MISSING DOIs

- None

INVALID DOIs

- None
editorialbot commented 10 months ago

:wave: @openjournals/csism-eics, this paper is ready to be accepted and published.

Check final proof :point_right::page_facing_up: Download article

If the paper PDF and the deposit XML files look good in https://github.com/openjournals/joss-papers/pull/4881, then you can now move forward with accepting the submission by compiling again with the command @editorialbot accept

arfon commented 10 months ago

@editorialbot accept

editorialbot commented 10 months ago
Doing it live! Attempting automated processing of paper acceptance...
editorialbot commented 10 months ago

Ensure proper citation by uploading a plain text CITATION.cff file to the default branch of your repository.

If using GitHub, a Cite this repository menu will appear in the About section, containing both APA and BibTeX formats. When exported to Zotero using a browser plugin, Zotero will automatically create an entry using the information contained in the .cff file.

You can copy the contents for your CITATION.cff file here:

CITATION.cff

``` cff-version: "1.2.0" authors: - family-names: Rosen given-names: Andrew S. orcid: "https://orcid.org/0000-0002-0141-7006" - family-names: Gallant given-names: Max orcid: "https://orcid.org/0009-0008-4099-6144" - family-names: George given-names: Janine orcid: "https://orcid.org/0000-0001-8907-0336" - family-names: Riebesell given-names: Janosh orcid: "https://orcid.org/0000-0001-5233-3462" - family-names: Sahasrabuddhe given-names: Hrushikesh orcid: "https://orcid.org/0000-0001-7346-4568" - family-names: Shen given-names: Jimmy-Xuan orcid: "https://orcid.org/0000-0002-2743-7531" - family-names: Wen given-names: Mingjian orcid: "https://orcid.org/0000-0003-0013-575X" - family-names: Evans given-names: Matthew L. orcid: "https://orcid.org/0000-0002-1182-9098" - family-names: Petretto given-names: Guido - family-names: Waroquiers given-names: David orcid: "https://orcid.org/0000-0001-8943-9762" - family-names: Rignanese given-names: Gian-Marco orcid: "https://orcid.org/0000-0002-1422-1205" - family-names: Persson given-names: Kristin A. orcid: "https://orcid.org/0000-0002-7212-6310" - family-names: Jain given-names: Anubhav orcid: "https://orcid.org/0000-0001-5893-9967" - family-names: Ganose given-names: Alex M. orcid: "https://orcid.org/0000-0002-4486-3321" doi: 10.5281/zenodo.10466868 message: If you use this software, please cite our article in the Journal of Open Source Software. preferred-citation: authors: - family-names: Rosen given-names: Andrew S. orcid: "https://orcid.org/0000-0002-0141-7006" - family-names: Gallant given-names: Max orcid: "https://orcid.org/0009-0008-4099-6144" - family-names: George given-names: Janine orcid: "https://orcid.org/0000-0001-8907-0336" - family-names: Riebesell given-names: Janosh orcid: "https://orcid.org/0000-0001-5233-3462" - family-names: Sahasrabuddhe given-names: Hrushikesh orcid: "https://orcid.org/0000-0001-7346-4568" - family-names: Shen given-names: Jimmy-Xuan orcid: "https://orcid.org/0000-0002-2743-7531" - family-names: Wen given-names: Mingjian orcid: "https://orcid.org/0000-0003-0013-575X" - family-names: Evans given-names: Matthew L. orcid: "https://orcid.org/0000-0002-1182-9098" - family-names: Petretto given-names: Guido - family-names: Waroquiers given-names: David orcid: "https://orcid.org/0000-0001-8943-9762" - family-names: Rignanese given-names: Gian-Marco orcid: "https://orcid.org/0000-0002-1422-1205" - family-names: Persson given-names: Kristin A. orcid: "https://orcid.org/0000-0002-7212-6310" - family-names: Jain given-names: Anubhav orcid: "https://orcid.org/0000-0001-5893-9967" - family-names: Ganose given-names: Alex M. orcid: "https://orcid.org/0000-0002-4486-3321" date-published: 2024-01-07 doi: 10.21105/joss.05995 issn: 2475-9066 issue: 93 journal: Journal of Open Source Software publisher: name: Open Journals start: 5995 title: "Jobflow: Computational Workflows Made Simple" type: article url: "https://joss.theoj.org/papers/10.21105/joss.05995" volume: 9 title: "Jobflow: Computational Workflows Made Simple" ```

If the repository is not hosted on GitHub, a .cff file can still be uploaded to set your preferred citation. Users will be able to manually copy and paste the citation.

Find more information on .cff files here and here.

editorialbot commented 10 months ago

🐘🐘🐘 👉 Toot for this paper 👈 🐘🐘🐘

editorialbot commented 10 months ago

🚨🚨🚨 THIS IS NOT A DRILL, YOU HAVE JUST ACCEPTED A PAPER INTO JOSS! 🚨🚨🚨

Here's what you must now do:

  1. Check final PDF and Crossref metadata that was deposited :point_right: https://github.com/openjournals/joss-papers/pull/4884
  2. Wait five minutes, then verify that the paper DOI resolves https://doi.org/10.21105/joss.05995
  3. If everything looks good, then close this review issue.
  4. Party like you just published a paper! 🎉🌈🦄💃👻🤘

Any issues? Notify your editorial technical team...

arfon commented 10 months ago

@rashatwi, @jherasdo – many thanks for your reviews here! JOSS relies upon the volunteer effort of people like you and we simply wouldn't be able to do this without you ✨

@Andrew-S-Rosen – your paper is now accepted and published in JOSS :zap::rocket::boom:

editorialbot commented 10 months ago

:tada::tada::tada: Congratulations on your paper acceptance! :tada::tada::tada:

If you would like to include a link to your paper from your README use the following code snippets:

Markdown:
[![DOI](https://joss.theoj.org/papers/10.21105/joss.05995/status.svg)](https://doi.org/10.21105/joss.05995)

HTML:
<a style="border-width:0" href="https://doi.org/10.21105/joss.05995">
  <img src="https://joss.theoj.org/papers/10.21105/joss.05995/status.svg" alt="DOI badge" >
</a>

reStructuredText:
.. image:: https://joss.theoj.org/papers/10.21105/joss.05995/status.svg
   :target: https://doi.org/10.21105/joss.05995

This is how it will look in your documentation:

DOI

We need your help!

The Journal of Open Source Software is a community-run journal and relies upon volunteer effort. If you'd like to support us please consider doing either one (or both) of the the following:

Andrew-S-Rosen commented 10 months ago

Thank you all!