Giter Club home page Giter Club logo

kirby-uniform's Introduction

Kirby Uniform

A versatile Kirby plugin to handle web form actions.

Documentation Status Tests Kirby >=3

This is Uniform for Kirby >=3. You can find Uniform for Kirby 2 in the kirby-2 branch.

Builtin actions:

  • Email: Send the form data by email.
  • EmailSelect: Choose from multiple recipients to send the form data by email.
  • Log: Log the form data to a file.
  • Login: Log in to the Kirby frontend.
  • SessionStore: Store the form in the user's session.
  • Upload: Handle file uploads.
  • Webhook: Send the form data as an HTTP request to a webhook.

Quick example

Controller:

<?php

use Uniform\Form;

return function ($kirby) {
   $form = new Form([
      'email' => [
         'rules' => ['required', 'email'],
         'message' => 'Email is required',
      ],
      'message' => [],
   ]);

   if ($kirby->request()->is('POST')) {
      $form->emailAction([
         'to' => '[email protected]',
         'from' => '[email protected]',
      ])->done();
   }

   return compact('form');
};

Template:

<form action="<?php echo $page->url() ?>" method="POST">
   <input name="email" type="email" value="<?php echo $form->old('email'); ?>">
   <textarea name="message"><?php echo $form->old('message'); ?></textarea>
   <?php echo csrf_field(); ?>
   <?php echo honeypot_field(); ?>
   <input type="submit" value="Submit">
</form>
<?php if ($form->success()): ?>
   Success!
<?php else: ?>
   <?php snippet('uniform/errors', ['form' => $form]); ?>
<?php endif; ?>

Installation

Install Uniform via Composer: composer require mzur/kirby-uniform

Or download the repository and extract it to site/plugins/uniform.

Setup

Add this to your CSS:

.uniform__potty {
    position: absolute;
    left: -9999px;
}

Note: Disable the Kirby cache for pages where you use Uniform to make sure the form is generated dynamically.

Documentation

For the full documentation head over to Read the Docs.

Questions

See the answers in the docs, post an issue if you think it is a bug or create a topic in the forum if you need help.

Contributing

Contributions are always welcome!

Donations

Since some people insist on sending me money for this (free) plugin you can do this here.

kirby-uniform's People

Contributors

adamkiss avatar afbora avatar alkinkasap avatar bezin avatar creichel avatar davidelanfranchi avatar dpschen avatar flixt avatar getu-lar avatar janherman avatar julien-gargot avatar ldanielswakman avatar lord-executor avatar lukasbestle avatar lukasleitsch avatar macxim avatar malvese avatar marcomezzavilla avatar maxxst avatar medienbaecker avatar mzur avatar pedroborges avatar rhawbert avatar s1syphos avatar seb-celinedesign avatar teawithlemon avatar webcatsolutions avatar yoanmalie avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

kirby-uniform's Issues

Create Kirby content entry from form submission?

Is it possible to create a new Kirby content page from a form submission?
The use-case: if entries become content, then we can also generate reports of all entries, CMS admins can process/edit/delete entries after submission.

Looking at the log action, it's not far off a YAML file, so if it was saved to e.g. /content/form/{entryID}/form.txt then we're already not far off.

This is a feature request not a bug, but before I give it a try, I wondered whether it had been attempted before?

Dynamic subject

It should be possible to add form field content directly to the subject of the email, too.

Example:
The form contains a field with name persons which contains the number of persons for a reservation.

The subject:

"New reservation: {persons} persons!"

Then would result in New reservation: 5 persons!, for example.

The Toolkit templating engine can be used for this.

Webhook Results

Hi There,
we use kirby-uniform with the webhook option.
Right now the webhook hands back a simple integer, which is read and returned by $form->echoMessage()
This works very good.

Now the question: How can a webhook trigger an error on uniform. Instead of the integer result, the error and its message is shown. Maybe this is just a question of missing documentation, maybe this is not implemented.

Feedback highly appreciated.

Email confirmation displayed multiple times

I have configured a form with multiple recipients, the confirmation message is displayed as many times as there are recipients.

'actions'  => array(
            array(
              '_action' => 'email',
              'to'      => '[email protected]',
              'sender'  => '[email protected]',
              'subject' => 'Amitievillages.org - Questionnaire projet',
              'snippet' => 'mail-form'
            ),
            array(
              '_action' => 'email',
              'to'      => '[email protected]',
              'sender'  => '[email protected]',
              'subject' => 'Amitievillages.org - Questionnaire projet',
              'snippet' => 'mail-form'
            ),
            array(
              '_action' => 'email',
              'to'      => '[email protected]',
              'sender'  => '[email protected]',
              'subject' => 'Amitievillages.org - Questionnaire projet',
              'snippet' => 'mail-form'
            )
         )

Here's the result:
multiple_submit

It seems to be because of the ".=" instead of "=" at line 431 in UniForm.php, but I'm not sure if it can break in some case I haven't tested.

Uniform for building a registration form?

It surely is possible to use uniform for building a registration form that adds new kirby users with a specific role, is it? What would be the best way to do it?

Any tip would be very appreciated.

v2

v2

The goal of v2 is to make the plugin more powerful. It sould be able to handle anything a user would like to to with a form and not only send the content by email. Ideas for v2:

Actions

Best explained by the new call of the plugin as it is currently planned:

$form = sendform(
    'reservation-form',
    array(
        'required' => array(
            'name' => '',
            'street' => '',
            'city' => '',
            'date' => 'date',
            'persons' => 'num',
            'from' => 'email'
        ),
        'validate' => array(
            'phone' => 'num'
        ),
        'actions' => array(
            array(
                '_action'   => 'email',
                'subject'   => 'New reservation from {name}.',
                'snippet'   => 'sendform-reservation',
                'to'        => $page->mail(),
                'service'   => 'html-mail',
                'service-options' => array()
            ),
            array(
                '_action'   => 'email',
                'subject'   => 'Copy: New reservation from {name}.',
                'snippet'   => 'sendform-reservation',
                'to'        => $page->copy_mail(),
                'service'   => 'mail',
                'service-options' => array()
            ),
            array(
                '_action'   => 'db-store',
                'db'        => 'my_db',
                'user'      => 'my_db_user',
                'pw'        => 'my_secret_password'
            ),
        )
    )
);

So the sendform plugin will accept two arguments, the form ID and the array of options. The array of options can contain three keys, required, validate and actions. The former two will behave as before. Note the presence of from as a required field as this field will no longer be mandatory and automatically required. The actions key contains an array of actions. Each action is represented by an array containing at least the _action key, specifying the type of the action to perform.

For example there is the email action that sends an email of the form data just like v1 of the plugin. You'll find it very similar to the options array of v1, only without required and validate, and with an additional to. Specifying multiple email actions like in the example above will result in a similar behavior to the copy option of v1 which will be removed.

Like this, arbitrary and multiple actions can be performed with the form data. Think of storing the request in a database in addition to sending the email or doing filesystem operations or anything you can think of.

Extensibility

The new actions will allow easy extensibility by adding custom actions. A custom action will be nothing else as a function that gets called by the sendform plugin, receiving the form data and action array as arguments. The plugin will handle validation of the form so the action is only called when the data is valid. Any further checks can be done in the action function itself but a fail will not prevent any other actions to be performed. The email action could look like this:

function($form, $options) {
    $mailBody = "";
    $snippet = $options['snippet'];

    if (empty($snippet)) {
        foreach ($form as $key => $value) {
            if (str::startsWith($key, '_')) {
                continue;
            }

            $mailBody .= ucfirst($key).': '.$value."\n\n";
        }
    } else {
        $mailBody = snippet($snippet, compact('form', 'options'), true);
        if ($mailBody === false) {
            throw new Exception("The email snippet '" . $snippet . "' does not exist!");
        }
    }

    $params = array(
        'service'   => $options['service'],
        'options'   => $options['service-options'],
        'to'        => $options['to'],
        'from'      => a::get($form, 'name', '') . ' <' . a::get($form, '_from') . '>',
        'subject'   => $options['subject'],
        'body'      => $mailBody
    );

    $email = email($params);

    if($email->send()) {
        return array(
            'success' => true,
            'message' => l::get('sendform-send-success')
        );
    } else {
        return array(
            'success' => false,
            'message' => l::get('sendform-send-error') . " " . $email->error()
        );
    }
};

Adding new actions to the plugin will work similar to adding new email services to the Kirby Toolkit:

sendform::$actions['email'] = function($form, $options) {...};

New name

The plugin will be called kirby-uniform to reflect it now being much more powerful and able to handle any actions a form can perform. GitHub repository redirects will handle the URL inconsitencies.

TODO

  • Figure out where the sendform action extensions are best placed to be extensible by users, globally availabe (don't place them in template controllers) and compatible with Git submodules.
  • Notify the guys of http://getkirby-plugins.com/ once v2 is complete.

Hijacking the email with dynamic header

Does someone of you know if it is possible to modify the email header in a malicious way by using the dynamic subject feature?

A possible protection would be the removal of all newlines in the subject after the dynamic components were applied. But does this prevent all possible attacks?

Error in `toolkit/lib/v.php`

I tried to install the plugin. I used the basic example. It gives me the following Error:

Warning: in_array() expects parameter 2 to be array, null given in /[...]/kirby/toolkit/lib/v.php on line 85

The source of this warning is this part:

<?php e($form->hasError('name'), ' class="erroneous"')?>

Webhook: JSON data

Add an option to the webhook action to send the data as application/json instead of application/x-www-form-urlencoded.

System for adding actions

We need a system for adding/loading custom action functions. Corrently the best solution is to add them in a page controller but this is far from optimal.

executing multiple actions

Is it possible to execute multiple actions upon form submit?

e.g. "email" + "log"
-> email the form to an e-mail address, but also save the submissions to a logfile

or e.g. "email-select" + "log"
-> same as above, but email to a chosen predefined address

I hope I'm clear?
Thanks

Sending to multiple recipients doesn't work

Thanks for your great plugin @mzur!

I have an issue with multiple recipients. The email needs to be delivered to multiple accounts. So I setup two actions in the array like described in the readme file.

The second action in the array is not executed, only the first email is sent...

return function($site, $pages, $page) {

  $recipient  = "[email protected]";
  $recipient2 = "[email protected]";
  $sender     = "[email protected]";
  $subject    = "[website.com] Contact";

  $form = uniform(
    'contact-form',
    array(
      'required' => array(
        'naam'   => '',
        '_from'  => 'email',
        'bericht'   => '',
      ),
      'actions' => array(
        array(
          '_action' => 'email',
          'to'      => $recipient,
          'sender'  => $sender,
          'subject' => $subject,
          'snippet' => 'uniform-email-txt'
        ),
        array(
          '_action' => 'email',
          'to'      => $recipient2,
          'sender'  => $sender,
          'subject' => $subject,
          'snippet' => 'uniform-email-txt'
        ),
      )
    )
  );
  return compact("form");
};

I tried to add multiple values to the 'to' key in the array but that didn't work :)

Hope you can help me out.

Better honeypot name

There were some instances where the honeypot was defeated by a bot. It should work better if the honeypot field was given a name that sounds more legit, like website (since most bots try to advertise some site). This name should be the new default and can be overridden by an additional option honeypot.

Log

Create a new builtin action log to append the form data to a log file.

Echo values in specific order in the email snippet

Thank you for this great plugin, it works wonder.

I was trying to output the from values in a specific order in teh email snippet but I'm having an hard time with that.
I tried using echo $form->value('name') with no success.

Am I missing something or there ins't any way to avoid the foreach?

Possible? : 'goto' => $page->url() . '/status:thank-you',

Possible ?

(Contact form v1 - 'goto' => $page->url() . '/status:thank-you',)

<?php if(param('status') == 'thank-you'): ?>

<article>
    <h1><?php echo html($page->title()) ?></h1>
    <div class="alert-success">
        <h2>Thank you very much for your request.</h2>
        <p>We will get in contact as soon as possible!</p>
    </div>
</article>

<?php else: ?>

<form action="#contact" method="post">

    <!-- Formulaire -->

</form>

<?php endif ?>

Thank you.

Email service

Add an option to choose the email service to use.

Log: Snippet

Add an option to use a snippet for formatting log entries.

Uniform & File Cache

Hiya,

I'm seeing a problem with Uniform and Kirby's file cache. I have several pages using the same template with a form on it. When cache is enabled, the forms don't work. When cache is disabled, the forms are fine.

I saw a thread in the Kirby forum about how this is a known issue, but I don't see any bugs open against it here.

So, I'm wondering if this is a known thing, and if so, is it a Kirby or Uniform issue?

Cheers,
topher

Webhook: Get parameters

Due to a bug in the remote::get method of the Toolkit, sending url-encoded data with a GET request is currently not possible.

HTML email headers and receive copy option

For starters, thanks a lot for your plugin!

I think, I found some issues though:

  1. By using your html-email-table snippet, Mail on OS X only displays the email as plain text. Is it because of the missing html-email action that would send the correct headers to a mail client?
  2. I was not able to use your receive-copy option. For me, only the copy was sent but not the filled out form to the recipient.

Thanks again
René

Identify actions

For methods like successful() it should be possible to supply an optional argument to check for a specific action. What should this argument be? It can't be the name of the action (like email) since the same action can be performed multiple times. Maybe the index of the action in the actions array?

Form won't display after installation

Just followed the instructions on basic form installation, but unfortunately I'm getting the following error:

Name Notice: Undefined variable: form in D:\projects\kirby\site\templates\contact.php on line 8

Fatal error: Call to a member function hasError() on null in D:\projects\kirby\site\templates\contact.php on line 8

Any ideas on what's happening here?

Required field checking

There is (in my opinion) a bug in the a::missing method of the Toolkit.

If this is not fixed, this plugin needs to implement checking for missing fields by itself.

contact form as snippet instead of template not working

First of all, thanks for the great work on this plugin. And, it works perfectly when I use the form in a template. But, for my case I'm trying to use it in a snippet and somehow it fails. I tried the use the basic example (changing the my email of course) in a snippet. It shows up on the front end and I can fill in data and hit the submit button. The site even jumps to the #form. But neither the php debugger throws back any issues neither is there an email in my inbox.

Has anybody tried to use the code in a snippet instead of a template? Any issues like min above? Or am I missing something?

How to send form via Postmark?

As the title says, I'm trying to setup kirby-uniform to send out my forms via Postmark, or some
other transactional email service.

Does anyone know how to set this up or has a ready baked solution?

Thanks

Form fields validation options?

I was wondering if uniform has any fields validation options build in aside from 'email'?

I would like to limit the character count on some fields, and set minimum on others. Is this currently possible? I found that I can use 'num' for integer values, but that's not what I need at the moment.

If not, what would be the best way to extend it?

Thank you.

Redefine 'Content-type' email header in order to send using HTML snippets

Currently, if a user (dev) selects a snippet that contains HTML (such as your example sendform-table.php snippet, the HTML will deliver as text and render as such. As far as I can see, the only way to override this is to redefine the Content-Type property currently defined in the email class within the Kirby toolkit. Alternatively, a duplicate service adopter could be created with this one line changed, but that does not seem desirable.

Is there a way for SendForm.php to force the definition of this header to change?

Names are removed from email address

See #21.

As to why the name does not appear I found that it is intentionally removed by the Email class. I guess we could open an issue at the toolkit repo and ask if this can be fixed or we could write our own email service that adds the name to the header again.

will not accept email address

hey there,

I'm having a major problem, I thought it might be an issue with running locally but it's doing it on my staging site too.

I set up everything in the controller folder

<?php

return function($site, $pages, $page) {

$form = uniform('contact-form', 
    array(
        'required' => array(
            '_from' => 'email'
            ),
        'actions' => array(
            '_action' => 'email',
            'to' => '[email protected]',
            'sender' => '[email protected]',
            'subject' => 'New Message from johnevanofski.net'
        )
));
    return compact('form');
};

?>

here's my form on the template (i've abbreviated some sections)

<form autocomplete="off" action="<?php echo $page->url()?>#" method="post">

    <?php if ($form->hasMessage()): ?>

        <h1><?php e($form->successful(), 'Thank You!' , 'Error')?></h1>
        <p><?php $form->echoMessage() ?></p>

    <?php else: ?>

        <h1>Contact</h1>

    <?php endif; ?>

      <div class="contactform-field <?php e($form->hasError('name'), 'error') ?>">
        <label class="contactform-label" for="name">Name* <?php e($form->hasError('name'), '<small>Please enter a name</small>') ?></label>
        <input class="contactform-input" type="text" id="contactform-name" name="name" value="<?php echo $form->echoValue('name') ?>" required <?php e($form->successful(), ' disabled')?>/>
      </div>

      <div class="contactform-field <?php e($form->hasError('_from'), 'error') ?>">
        <label class="contactform-label" for="email">Email* <?php e($form->hasError('_from'), '<small>Please enter a valid email address</small>') ?></label>
        <input class="contactform-input" type="email" id="contactform-email" name="email" value="<?php echo $form->echoValue('_from') ?>" required <?php e($form->successful(), ' disabled')?>/>
      </div>

    <div class="contactform-field <?php e($form->hasError('text'), 'error') ?>">
      <label class="contactform-label" for="text">Message* <?php e($form->hasError('message'), '<small>Please enter your text</small>') ?></label>
      <textarea class="contactform-input" name="text" id="contactform-text" required <?php e($form->successful(), ' disabled')?> /><?php echo $form->echoValue('text') ?></textarea>
      </div>

    <label class="uniform__potty" for="website">Please leave this field blank</label><input type="text" name="website" id="website" class="uniform__potty" />      

      <button id="send-button" class="contactform-button" type="submit" name="_submit" value="<?php echo $form->token() ?>" <?php e($form->successful(), ' disabled')?>>SEND</button>

   </form>

live at
http://stage.johnevanofski.net/contact

No matter what it says to enter a valid email address, something on the '_from' validation appears to be failing. The other weird thing is that the message is not giving any feedback. I feel like I'm doing something small and stupid. Any help would be great.

Thanks!

Webhook

As suggested here, add an action that can trigger arbitrary webhooks.

Use the remote object from the Toolkit.

Submission of multiple forms in a row

From MacServery Admin:

I noticed that in all your examples, by default, upon form submission, you disable the submit button.
I wanted to set up a form that the user can submit many times in a row, if they wish. I tried following the examples given here and in your GitHub wiki, but found that the form presents some undesired behaviour...

  1. submit the form for the first time, form info passes validation, and success message is shown to user. All good. Submit button has been left enabled (I haven't disabled it in the code), and all form fields are now empty. Looks like the form is ready for another submission - great!
  2. user fills out the form again, and hits 'submit'. All values disappear from their fields, the success message (from the previous submission) disappears, but the form has NOT been submitted - and no error or success messages are displayed on screen. All the input values have simply been erased from the fields.
  3. the puzzled user now fills out the form again, hits submit, and this time it all works as expected. Success message is displayed again, and form info is successfully emailed.
  4. if the user tries a fourth time, it will now fail again: hitting 'submit' right after a successful submission will simply erase all values from their fields, and the form data is not sent.

It seems that once the form is successfully submitted, the next attempt will silently fail... Is this intended behaviour, or something that can be changed?

Multiple forms on one page

The echoValue('field-name') method is not bound to the form instance.
Is this a bug or the intended behavior? Here's an example:

<?php
    $formA = uniform('formA', array(...));
    $formB = uniform('formB', array(...));
    $formC = uniform('formC', array(...));
?>

<form id="formA" action="<?= $page->url(); ?>#formA" method="post">
    <label for="name">Name</label>
    <input type="text" name="name" value="<?php $formA->echoValue('name'); ?>">
    <button type="submit" name="_submit" value="<?= $formA->token(); ?>">Submit</button>
</form>

<form id="formB" action="<?= $page->url(); ?>#formB" method="post">
    <label for="name">Name</label>
    <input type="text" name="name" value="<?php $formB->echoValue('name'); ?>">
    <button type="submit" name="_submit" value="<?= $formB->token(); ?>">Submit</button>
</form>

<form id="formC" action="<?= $page->url(); ?>#formC" method="post">
    <label for="name">Name</label>
    <input type="text" name="name" value="<?php $formC->echoValue('name'); ?>">
    <button type="submit" name="_submit" value="<?= $formC->token(); ?>">Submit</button>
</form>

Let say I enter 'David' in the name field of form A and click submit, what I expect is:

  1. form A get submitted;
  2. form A get cleared;
  3. other forms remain intact;

While the actual result is:

  1. form A get submitted;
  2. form A get cleared;
  3. The name field in form B & form C both become 'David';

It's arguable that the same name shouldn't appear twice, but since I'm calling an instance method echoValue(), I suppose the correct behavior should be the expected one instead of the actual one now?

Split requestValid()

Split requestValid() to tokenValid() and passesGuard(). If the token is invalid, the form data should be cleared. If the token is valid but the guard rejects the request, the data shouldn't be cleared (e.g. when the capcha was wrong, the form data should still be recovered). Currently data is cleared either way and the form data is lost if the calc guard is used and has an invalid value.

Please Remove Multi-Language Site Requirement

Right now, Uniform requires the developer to enable multi-language functionality in the site. As far as I can see, there are only 15 or so strings that are used by Uniform, and the plugin is using Kirby's multi-language functions simply to use it as a 'string dispenser'. Unfortunately, enabling multi-language functionality in Kirby is not a trivial thing, as it affects many aspects,of the site's functionality.

Multi-language functionality requires, for instance, that all content text files be named with language-aware extensions: 'home.txt" has to be renamed "home.en.txt", even if you're using a single language. In a site that uses a single language, and has a lot of existing content, this is impractical. If you turn on multi-language, but leave the old content files without changing their extensions, users the have issues when updating their content via the panel - ie, the panel writes the new content to a file with a language-aware extension, but reads it back from the old non-language aware file - making it look to the user as if the content cannot be updated. In the current 2.1 beta version of Kirby, there are numerous multi-language bugs.

Bugs aside, the way that Kirby handles multi-lingual sites is just one of many possible solutions. Kirby's solution is useful only when the client wants to have pretty much exactly the same structure and content in different languages. I have never had a client that wanted this. My multi-lingual sites all have substantially different structure and content, which is more culturally appropriate, so it has always been easier to setup 2 sites, each one in a single language, than to setup a single bilingual site.

Uniform is a wonderful solution, which can save us a whole lot of time, but having to turn on multi-lingual features is a deal-breaker for me. :(

Would it be at all possible to consider a solution WITHOUT the multi-language setup and string functions? Would it be possible to simply use, for instance, custom 'config' settings by default, and use multi-lingual files only as an optional setup for multi-lingual sites?

Uppercase causing php error

On server whit uppercase sensitivity, uniform.php require_once is causing error.
Unify letter case to fix issue.

require_once(__DIR__ . DS . 'lib' . DS . 'UniForm.php'); // uppercased filename to fix err

"reply-to" instead of "from"

In the sendForm method (line 223) wouldn't it be better to have the submitter's email address entered in a "Reply-To" line in the header as opposed to being used directly in the "From" line? The "From" line should actually be the domain the form is running on, no?

I was having some trouble with the plugin not reliably delivering some emails (especially when the submitter was using a gmail address, for instance). I think receiving servers were seeing a gmail "From" address and realizing the IP was not gmail, so they got suspicious and didn't deliver it. But I don't think this problem would necessarily be isolated to gmail.

fyi, the failed mail sent me to this link for more info: http://dhurl.org/20b

If I have some time, I may fork and test this. I'll keep you posted.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.