Git Product home page Git Product logo

luxletter's Introduction

LUX

Luxletter - Email marketing in TYPO3. Send newsletters the easy way.

Inspired by TYPO3 extension direct_mail - thanks to the authors for the great work

Introduction

Email marketing tool in TYPO3. Just build and send newsletters to your customers. This extension does not need EXT:lux but works together with the marketing automation tool for TYPO3 to get even more receiver analytics data. Just add some HTML as content for your newsletters anywhere in the web or directly on your website, parse it and go for it.

Aspects of luxletter

The upside

  • A useful and nice dashboard shows you the relevant information in the backend
  • Modern newsletter extension for TYPO3 11 or 12
  • Tracking of clicks via PSR-15 interface in TYPO3
  • Sending mails in queue via symfony command controller
  • Records for fe_groups (and there related fe_users) are used to send mails to
  • An unsubscribe plugin is already included
  • A teaser content element helps you to create newsletters out of default content elements in TYPO3
  • Every website can be used as prototype for your newsletter
  • A third party mail server can be used for newsletters
  • Since 4.0 multiple sender configuration can be saved

The downside

  • At the moment there is no bounce-management (Do you want to sponsor it? Contact us!)
  • fe_users records are needed to send emails (sorry guys - no tt_address at the moment )
  • There is no registration plugin for fe_users in EXT:luxletter. Please use a different extension (like femanager) for this task

Screenshots

Example dashboard in TYPO3 module:

Example dashboard in TYPO3

Example dashboard overview:

Example dashboard overview

Example newsletter im mail inbox:

example mail

Example newsletter list view:

Newsletter list

Example newsletter creation - step 1:

Step1

Example newsletter creation - step 2:

Step2

Example newsletter creation - step 3:

Step3

See the receiver activities if you have also installed the free extension lux:

Receiver details

Create teasers from content elements with a teaser plugin:

Teaser content elements

Documentation

See the full documentation (installation, configuration, newsletters and analysis)

Technical requirements

  • TYPO3 11 or 12 LTS is the basic CMS for this newsletter tool.
  • EXT:lux is not needed to run luxletter but both extensions can work together to show more relevant information.
  • This extension needs to be installed with composer (classic installation could work but is not supported and tested).
  • fe_users in fe_groups is used to send newsletter emails to.

Sponsored features (please get in contact to us if you want to sponsor a new feature)

  • Import of fe_users from tt_address (to migrate easier from direct_mail to luxletter)
  • Editview of existing newsletters (reparse function?)

Installation with composer

composer require "in2code/luxletter"

Changelog and breaking changes

documentation

Need help with email-marketing or marketing automation?

The company behind Lux, LuxLetter and LuxEnterprise - the complete marketing box for TYPO3 - is looking forward to help you: https://www.in2code.de

luxletter's People

Contributors

bastilu avatar cdaecke avatar dhoffmann1979 avatar einpraegsam avatar froemken avatar georgringer avatar gernott avatar julianhofmann avatar magichatoftypo3 avatar mrsilaz avatar pfuju avatar reiherm avatar rr-it avatar spoonerweb avatar talleux avatar

Stargazers

 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

luxletter's Issues

Error occurs with sql_mode=only_full_group_by

Hello,

Thank you for this new extension.

We need to use the backend module with "only_full_group_by" sql mode but this errors occurs :

(1/2) Doctrine\DBAL\Exception\DriverException
An exception occurred while executing 'select count(*) as count, properties, newsletter from tx_luxletter_domain_model_log where deleted=0 and status=300 group by properties order by count desc limit 8': Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'website.tx_luxletter_domain_model_log.newsletter' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

Do you have an idea on what we can do to use the extension without disabling only_full_group_by in MySql ?

Add TSFE while processing variables

As mail will be sent by scheduler (BE context), we
do not have a TSFE. If working with TS Variables these
require a working TSFE. Adding a temporary TSFE
like in f:cObject VH solves that problem.

Option to delete fe_users after unsubscription

Hi,
it will be nice to have an option to delete fe_users after unsubscription in the unsubscription-plugin. This should cause in removing the fe_user record or set deleted to 1.

Stephan

Feature: bounce emails handling

Manage bounce emails by showing the total number of emails returned and the related error.
Then give the option to disable or delete users with invalid emails.

A scheduler task will analyze a mail box to discover new bounced emails.

[IDEA] Add authentication in ParseNewsletterUrlService

Hello,

Thank you for this new extension.

I begin to use your extension on an intranet protected by authentication, but when i came on the step "send test mail & preview" the preview is not loaded (401 Unauthorized).

Now it work for me but I did it the wrong way.
It is in file Classes/Domain/Service/ParseNewsletterUrlService.php at line 137

    protected function getContentFromOrigin(User $user): string
    {
        if ($this->url === '') {
            throw new \LogicException('Given URL was invalid and was not parsed', 1560709687);
        }
        //$string = GeneralUtility::getUrl($this->url);
	$url = str_replace("//", "//USERNAME:PASSWORD@", $this->url);
	$string = file_get_contents($url);
        $string = $this->getBodyFromHtml($string);
        if ($string === false) {
            throw new \DomainException('Given URL could not be parsed and accessed', 1560709791);
        }
        if ($this->isParsingActive()) {
            $parseService = ObjectUtility::getObjectManager()->get(ParseNewsletterService::class);
            $string = $parseService->parseMailText($string, ['user' => $user]);
        }
        $this->signalDispatch(__CLASS__, __FUNCTION__, [$string, $user, $this]);
        return $string;
    }

I think it can be a good feature,

Best Regards,

Anatole PIVETEAU

Feature request: Personalize email To:

In In2code\Luxletter\Mail\SendMail, replace 'Newsletter receiver' in setTo with the user.firstName user.lastName

$mailMessage
->setTo([$email => 'Newsletter receiver'])

Feature: import recipients

A module to import recipients from a csv.

The user uploads a csv file and the system analyzes it and proposes fields that allow the user to map the csv data with those of the DB.

The user has these possibilities:

  • choose the page/folder where to import the data
  • delete all addresses in the folder before importing
  • select the csv field delimiters
  • whether or not to update existing recipients

The system also reports duplicate addresses.

Add origin as property to ParseNewsletterUrlService

Hello luxletter Team,

As $this->url was built within the constructor
it is not possible for developers to access the
original origin, we the page UID is located.
Instead of trying to convert the url back to an UID,
we will add the origin as property to
ParseNewsletterUrlService

Exception if unsubscribe page in ext configuration is empty or page not exists

If the defined page (in extensions configuration) to unsubscribe from the newsletter is wrong or empty then I become an exception on creating a new newsletter in step 3 (review).

(1/1) #1521716622 TYPO3\CMS\Core\Exception\SiteNotFoundException
No site found in root line of page 6

I thought that something was wrong with my newsletter page id that was defined in the step before, but it wasn't. The setting for the page to unsubscribe the newsletter was wrong. That was a page they not exists in my project :-).

Maybe a better description in the exception will help to fix this in the configuration.

No typenum is addet to the page url

I know it's not a issue of the extension, but I'm too ignorant to see what I'm doing wrong.

I added the following to my site config.yaml:
routeEnhancers:
PageTypeSuffix:
type: PageType
default: /
index: ''
suffix: /
map:
preview.html: 1560777975
newsletter.html: 1562349004
pixel.png: 1561894816

The url for the site is correct. But no typenum is addet to the page url.
Therefore it ends allways width the error message: Origin 102 (pid of the Newsletter) could not be converted into a valid url!
The url looks like this: kristall10.test/newsletter-09-2020/newsletter.html?

Can someone please give me a hint what i need to change?

Allow BE Users to send a testmail again

Hello,

currently you set email fields to send a testmail to display:none;
So, if I want to re-send a testmail, maybe, to another person, I have to re-build the same newsletter again from scratch.

Would be cool, if you do not hide this email field.

And could you please use official notification JS API of TYPO3 to inform BE Users that mail was sent?

Add "TYPO3/CMS/Backend/Notification" to define on top and then within your callback:

this.testMailListenerCallback = function (e) {
    var headerElement = document.querySelector('[data-luxletter-testmail="testmail-header"]');
    var messageElement = document.querySelector('[data-luxletter-testmail="testmail-message"]');
    if (headerElement !== null && messageElement !== null) {
        notification.success(
            headerElement.getAttribute("data-luxletter-testmail-title"),
            messageElement.getAttribute("data-luxletter-testmail-message")
        );
    }
}

Sorry, I just don't have a minifier here, so I can't create a PR for you.

Nice greetings

Stefan

Users without email block the sending queue

Hello,
We have noticed that the emails sending queue is blocked when a user doesnt have an email (this causes an error in the scheduled task).
We have to send newsletters to a large number of people and sometime users with no email end up in the newsletter group.
Would it be possible in a future version of the extension to no longer take into account users with empty emails (as for deleted or disabled users) in order to finish the sending for the users remaining in the queue ?
Thank you for your work on this extension.

Front end authentification

Hi,

How use luxletter if I have a front end authentification?
My website is a intranet and all the file_get_content failed for example.

Thanks

Newsletter preview in backend is not correct, page type is missing

Page type setting in extension configuration is set but will be not respected. If a url with the type is inserted (e.g. https//www.mysite.de/newsletterpage/?type=25) then it works. Only with the page id not.

See here: https://forge.typo3.org/issues/87817

The pageTypeDecorator in TYPO3 Core is removing all types that can't be mapped.Those patch will be help till the new release of TYPO3 fix that issue.

https://review.typo3.org/c/Packages/TYPO3.CMS/+/62811

Bug: ColumnMap for property "usergroup" of class "In2code\Luxletter\Domain\Model\User" is missing

In TYPO3 9 Backend I get this error on switching from the luxletter "Dashboard" tab to the "Newsletter" tab:

Core: Exception handler (WEB): Uncaught TYPO3 Exception: #1355142232:
The ColumnMap for property "usergroup" of class "In2code\Luxletter\Domain\Model\User" is missing.

TYPO3\CMS\Extbase\Persistence\Generic\Exception\MissingColumnMapException thrown in file /home/example/html/public/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbQueryParser.php in line 1098.
Requested URL: https://www.example.org/typo3/index.php?route=%%2Flux%%2FLuxletterLuxletter%%2F&token=--AnonymizedToken--&tx_luxletter_lux_luxletterluxletter%%5Baction%%5D=list&tx_luxletter_lux_luxletterluxletter%%5Bcontroller%%5D=Newsletter 

How to reproduce

  1. "Flush cache" via TYPO3-maintenance
  2. Open newsletter-link https://www.example.org/?luxletterlink=9b4dd70e4fa252152403abd19ac5923abb0f437aa00f91cdf0444aa34017b670
  3. Open luxletter submodule in Backend and switch from the luxletter "Dashboard" tab to the "Newsletter" tab

Workaround

  1. "Flush cache" via TYPO3-maintenance
  2. First: Open luxletter submodule in Backend and switch from the luxletter "Dashboard" tab to the "Newsletter" tab
  3. Then: Open newsletter-link https://www.example.org/?luxletterlink=9b4dd70e4fa252152403abd19ac5923abb0f437aa00f91cdf0444aa34017b670
  4. The "Newsletter" tab in luxletter submodule still works.

System

  • luxletter: 2.3.0 - with extra DB views to circumvent persistence problem #30 (comment)
  • TYPO3-Version: 9.5.22
  • Webserver: Apache
  • PHP-Version: 7.3.21
  • Database (Default): MySQL 5.5.5-10.0.38-MariaDB
  • Application Context: Production
  • Composer Mode: active
  • Operating System: Linux 3.10.0-693.11.6.el7.x86_64

fluidStyledMailContent.config.absRefPrefix shows wrong URL

I have a strange Problem with "fluidStyledMailContent.config.absRefPrefix", I changed my base url in sites/config.yaml, but that has no effect, even if I set it directly in my TS Setup fluidStyledMailContent.config.absRefPrefix = https://www.xxxde/
In the Newsletter Module I get the following error:
Origin [uid] could not be converted into a valid url! Message: Given URL could not be parsed and accessed (Tried to read url: http://updatexxx.de/

Problem generation newsletter

Hi
I do have a problem generation the newsletter despite the page displays correctly using the URL: index.php?id=1&type=1562349004.

The Error message shows:

Origin https://sub.domanie.de/index.php?id=219 could not be converted into a valid url!
Message: Given URL could not be parsed and accessed (Tried to read url: https://sub.domanie.de/index.php?id=219). Typenum definition in site-configuration not set? Fluid Styled Mail Content TypoScript added?

IN the Extension Configuration is added typenum: 1562349004
The Fluid Styled Mail Content is includet in the Template

Any Idea what that could be the problem?
Thank you for your help
Best regards
Dan

TYPO3 V10.4.6. Luxletter 2.4.0

URL could not be parsed and accessed

Creating a new Newsletter leads to the following result:
Result: Origin 102 could not be converted into a valid url!
Message: Given URL could not be parsed and accessed (Tried to read url: https://www.domain.org/newsletter-09-2020/newsletter.html?). Typenum definition in site-configuration not set? Fluid Styled Mail Content TypoScript added?

My settings:
_ fresh TYPO3 10.4.8 installation width composer
_ URL defined: in config.yaml and ext_conf_template.txt (both are the same)
_ Typenum definition in site-configuration is set (as described in the instructions for TYPO3 9)
_ Fluid Styled Mail Content TypoScript is added

What am I doing wrong?

Error "Table 'd031023e.tx_luxletter_domain_model_usergroup' doesn't exist" in 2.2.0

Hi,
we also sometimes get the error "Table 'd031023e.tx_luxletter_domain_model_usergroup' doesn't exist" in version 2.2.0 under TYPO3 9 when clicking links in the newsletter.

But not always. Clearing the cache (all caches) temporarily fixes the problem.

We also added the TypoScript from issue #24 to the root template. Everything seems ok, but after a while the error reappears.

Where's the problem?

Problems when changing the template path

after I changed the path to the template and try to load my own template. the extension does not let me send test mails anymore and throws me back a 500 error code:
Look like this

VM32046 Module.min.js:1 
POST https://myurl/typo3/index.php?route=%2Fajax%2Fluxletter%2FtestMail&token=234e6878f35d8bc61b037d86bd0d262e6e4e252e&origin=46&email=unsereagentur%40gmail.com&subject=test 
500

The only file I have changed is the NewsletterContainer.html
and here my typoscript

plugin {
    tx_luxletter_fe {
        view {
            templateRootPaths {
                10 = EXT:mystag/Resources/Private/EXT/luxletter/Templates/
            }
        }
    }
}
module {
    tx_luxletter {
        view {
            templateRootPaths {
                10 = EXT:mystag/Resources/Private/EXT/luxletter/Templates/
            }
        }
    }
}

the preview looks good but the mail does not

Hi,

to customize /Mail/NewsletterContainer.html
these settings only work for the preview?

plugin.tx_luxletter_fe {
  view {
    templateRootPaths {
      10 = fileadmin/tmpl/Templates/Luxletter/
    }
  }      
}

only if I also overwrite the module template will the mail be rendered correctly?

plugin.tx_luxletter_fe {
  view {
    templateRootPaths {
      10 = fileadmin/tmpl/Templates/Luxletter/
    }
  }      
}
# Copy plugin configuration to module configuration to just use one configuration for both places.
module.tx_luxletter < plugin.tx_luxletter_fe

define multiple Unsubscribe PID-s

Hello one question, can we define multiple Unsubscribe PID-s? We have unsubscribe plugin on different pages, because we use different fegroups. One group is for receiving dayliy newsletter other is for monthly. user can subscribe to both "categories/fegroups". But he shud also unsubscribe from one category

Unsubscribe link

hello,

I have a question about generating a unsubscribe link to the newsletter.
We use TYPO3 where the URL to BE and FE is at different URLs. As a result, the unsubscribe link does not work.

Is it possible to edit a template where a domain constant could be used in the newsletter unsubscribe link?

ex.
<f:link.external uri="{luxletter:configuration.getDomain()}{luxletter:mail.getUnsubscribeUrl(newsletter:newsletter,user:user)}" additionalAttributes="{data-luxletter-parselink:'false'}" style="color:#fff; font-weight: normal;">Unsubscribe</f:link.external>

Regards

Wrong number of newsletter subscribers in newsletter list

As shown in the attached screenshot, the number of the newsletter subscribers in the list of all newsletters is showing the current number of subscribers and not the real number of the newsletter receivers for one newsletter.

Bildschirmfoto 2020-10-12 um 19 58 40

I will provide a pull request, which addresses this issue. It will show the numbers from the queue of a newsletter, so the real numbers a newsletter was sent to.

Bildschirmfoto 2020-10-12 um 19 48 47

Thank you a big time for this great extension!

Newsletter can't be saved in bodytext field

The saving of a created newsletter is faling. Exception is throwing:

1/3) #1470230766 TYPO3\CMS\Extbase\Persistence\Generic\Storage\Exception\SqlErrorException
Data too long for column 'bodytext' at row 1

I believe that, my template is just to much code. All the table, tr, td stuff that I need for the newsletter with inlined CSS styles is just to much to save it in a single field. I didn't test yet how much content/code is possible to be saving in the field

Is that saving really necessary? Maybe it's better to generate the newsletter page before sending and cache the site? Like the normal way that TYPO3 did.

Images not shown in email

When sending newsletters, images inside the body are not visible because image-urls are relative.
Is there an option to use absolute URLs für images?
Or is there an option to embed images directly inside the email?

Thanks and greetings,
Manfred Mirsch

Question: Best practice for „reusable content“ in footer

Hey Alex,

I have a luxletter installation and have some trouble to create reusable content of another page:

  • Newsletter 1 (Should render the content of the Footer Page in the footer)
  • Newsletter 2 (Should render the content of the Footer Page in the footer)
  • Footer (Content Elements for every Newsletter)

I try it with a separate ViewHelpers, but got problems with the TSFE. Also try with TS, but also some problems.
Could you send me a hint, how you solve this in the „luxletter“-way?
The rendering via different type nums (Preview, Content generation) and standalone rendering (without page context) is quite complex and complete different than e.g. direct mail.

Regards & thank you,
Tim

Failure on sending newsletter if fe_user data has no crdate

I migrate tt_address data to fe_users and fe_groups for newsletter sending. Then I'm trying to send a newsletter. The scheduler task is failed, with following entry in sys_log:

Core: Exception handler (CLI): Uncaught TYPO3 Exception: Call to a member function format() on null | Error thrown in file /app/web/typo3conf/ext/luxletter/Classes/Domain/Model/User.php in line 78

After look into the code I have seen that crdate is used to generate a hash value. In my MySql query for the migration I didn't set the crdate. That was my problem.

It's easy for me to take the migration again and setting the crdate. But maybe it's a good tip in the readme/documentation for others they has to be migrate the tt_address data to fe_users.

Add SignalSlot at beforeParsing

As getNewsletterContainerAndContent does not
contain a page-related configuration we will
add a new SignalSlot where developers can add individual
Settings/Variables/Configuration for Fluid rendering.

Feature request: Resend action for new subscribers

A customer has requested a possibility to send a newsletter for new subscribers at a later date. Is this a generally useful enhancement for the extension?

I already created a fast proof-of-concept using some of the existing methods: ad3e5a0

Problems with incl. unsubscribe plugin

TYPO3 10.4.8
PHP 7.2.32
Have problems with the incl. unsubscribe plugin
got Message "User invalid" An error occured. Please try again later.

fe_user_group and fe_user are set as described

Newsletter content is double UTF-8 encoded

When previewing and sending newsletters containing UTF-8 content such as:
Turkish character test:
Pijamalı hasta yağız şoföre çabucak güvendi.
PİJAMALI HASTA YAĞIZ ŞOFÖRE ÇABUCAK GÜVENDİ.

The newsletter renders this text as double-encoded UTF-8
Pijamalı hasta yaÄ�ız Å�oföre çabucak güvendi.
PÄ°JAMALI HASTA YAÄ�IZ Å�OFÖRE ÇABUCAK GÜVENDÄ°.

The page with type=1562349004 displays this text correctly, but not when it is embedded into the newsletter and rendered by the preview or mail.

Table 'database.tx_luxletter_domain_model_user' doesn't exist

Hello,

I am using Typo3 9.5.15 and the newest version of Luxletter.

For my newsletter I created a separate page on my website. In the newsletter are different "Teaser" elements, which get shortened so that the recipient can click on "Read more.." to get directed to the website so read more.

This function works properly once i send out the newsletter. After a few hours it suddenly doesn't work anymore though. If the newsletter recipient clicks on "Read more.." after a while the page is not available anymore.

In my backend log file I receive the following error message:

Core: Exception handler (WEB): Uncaught TYPO3 Exception: #1472074485: Table 'db285520_4.tx_luxletter_domain_model_user' doesn't exist | TYPO3\CMS\Extbase\Persistence\Generic\Storage\Exception\SqlErrorException thrown in file /kunden/285520_91189/lts9/typo3_src-9.5.15/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbBackend.php in line 375. Requested URL: https://www.rohr-evangelisch.de/?luxletterlink=54da1445c9d016b0bf3401d155b223f0ae71ccec91e929ddaeef389cd584fef4

If i delete the Typo3temp folder and delete the Typo3 front and backend cache the link works again.

Does anyone have an idea what causes this error?

DateTime error when sending newsletter

Hello,

we are getting a DateTime error when we try to send a newsletter.

Return value of In2code\Luxletter\Domain\Model\User::getCrdate() must be an instance of DateTime, null returned

Environment: PHP 7.3.9, TYPO3 9.5.9, we are using the taskplaner to send the newsletters, not the CLI.

Is this a bug, or might this be caused by a missing/wrong configuration in PHP or T3?

Click evaluation for single newsletter

My customer would like to evaluate the opening rate for individual links per newsletter. They are used to it from EXT:newsletter

That's how it looked like:
grafik

If there is another way to get these data (e.g. somehow with a analytic tool like Google Analytics, e.g. with utm parameter) I would be interested as well

wrong template used in newsletter because of sorting problem

It seems that there is a problem with sorting of $templateRootPaths (TYPO3 LTS 9.5.15):

foreach (array_reverse($templateRootPaths) as $rootPath) {

In my debugging-example at the end the highest number (10) should be returned as first element of the array EXT:theme/Resources/Private/Extensions/Newsletter/Templates/

debug $templateRootPaths returns my TS-setttings:

$templateRootPaths = ConfigurationUtility::getExtensionSettings()['view']['templateRootPaths'];

   10 => 'EXT:theme/Resources/Private/Extensions/Newsletter/Templates/' (60 chars)
   0 => 'EXT:luxletter/Resources/Private/Templates/' (42 chars)
   1 => 'EXT:lux/Resources/Private/Templates/' (36 chars)

debug array_reverse($templateRootPaths) with array_reverse in line 25 results:

   0 => 'EXT:lux/Resources/Private/Templates/' (36 chars)
   1 => 'EXT:luxletter/Resources/Private/Templates/' (42 chars)
   2 => 'EXT:theme/Resources/Private/Extensions/Newsletter/Templates/' (60 chars)

debug $templateRootPaths (after krsort($templateRootPaths); and without array_reverse) returns correct result (returns value of 10):

$templateRootPaths = ConfigurationUtility::getExtensionSettings()['view']['templateRootPaths'];
krsort($templateRootPaths);
foreach ($templateRootPaths as $rootPath) {
   10 => 'EXT:theme/Resources/Private/Extensions/Newsletter/Templates/' (60 chars)
   1 => 'EXT:lux/Resources/Private/Templates/' (36 chars)
   0 => 'EXT:luxletter/Resources/Private/Templates/' (42 chars)   

I can create a pull request if you want to. But maybe it is better to do this sorting somewhere else?
And thank you very much for this great extension!

Tt_address support

When do you plan to add tt_address support? How does it come it lacks such a basic feature? Tt_address is for newsletters, fe_users is for user login, since always. Why the table name can't just be configurable? What gonna happen, if I just do mass replace fe_user -> tt_address? Or fe_user -> $this->settings['tableName']? I can't understand the whole situation. Why?

Newsletterconfiguration via Typoscript

It would be nice to have the configuration via ts for the newsletter header.
At the moment you can only send one newsletter per installation. Several different newsletters with different channels are apparently not possible at the moment, are they?

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.